@miki131

Нужно ли использовать блокировку при запросах?

Возможна ли атака с параллельными запросами в коде ниже?
Когда проверял вручную то все нормально снималось.

var
    knex        = require('knex')({ client: 'mysql', connection: config.DB }),
    bookshelf   = require('bookshelf')(knex);

var User = bookshelf.Model.extend({
    tableName: 'users'
});

var app = express();

app.all('/', function(req, res) {
    var data = req.query;

    data.sum = Math.abs(Math.ceil(data.sum)) || 0;

    if (!data.sum) return res.json({ status: 'error', code: 'sum' });

    User
        .where({id: data.id})
        .fetch()
        .then(function(user) {
            if (!user) return res.json({ status: 'error', code: 'user not found' });

            // если у пользователя достаточно на балансе, тогда делаем то что нам нужно
            if (user.get('balance') < data.sum) return res.json({ status: 'error', code: 'NO_BALANCE' });

            user
                .save({balance: user.get('balance') - data.sum}, {patched: true})
                .then(function(user) {
                    console.log('сняли', data.sum, 'новый баланс', user.get('balance'));
                    res.json({ status: 'success', balance: user.get('balance') });
                });
        })
});
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега Node.js
Crazy on performance...
Блокировка будет костылем
А уязвимость налицо, начиная с того что я могу списываемую сумму подделать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы