2016-11-23 2 views
0

Я пытаюсь реорганизовать это, в частности, запись массиваАльтернативный способ создания массива из объектов POST в NodeJS

app.post('/insert', function(req,res){ 

    var record = { 
     operator: req.body.operator, 
     email: req.body.email, 
     telephone: req.body.telephone, 
     notes: req.body.notes 
     }; 

    dbconn.query('INSERT INTO operators SET ? ', record, function(err,result){ 
     if(err) { 
     console.log(err); 
     } 
     else { 
     console.log('Last record insert :' + req.body.operator); 
     res.redirect('/myrecords'); 
     } 
    }); 
}); 

к следующему, который работает просто отлично

app.post('/insert', function(req,res){ 

    var record = req.body; // <- Refactored 

    dbconn.query('INSERT INTO operators SET ? ', record, function(err,result){ 
    if(err) { 
     console.log(err); 
    } 
    else { 
     console.log('Last record insert :' + req.body.operator); 
     res.redirect('/myrecords'); 
    } 
    }); 
}); 

Хотя что размещенные объекты из html-формы получают вставку в массив записей и сохраняются в DB правильно в паре, я все еще не убежден, что это ортодоксальный способ.

Я что-то упустил или это просто неправильное чувство? Я попытался использовать циклы для получения всех req.body.data, но я отказался от него.

Любая вероятность того, что вышеуказанный способ может привести к ошибкам в любых будущих сценариях?

ответ

1

Одна из проблем заключается в том, что у вас нет белого списка разрешенных столбцов для таблицы операторов. В первом примере код гарантирует, что в новую строку будут вставлены только столбцы оператора, электронной почты, телефона и примечаний. Во втором примере любое поле, которое пользователь добавляет к телу своего запроса POST, будет иметь столбец с тем же именем, который установлен в новой строке для вставки. Это может быть хорошо, но если у вас есть какие-либо столбцы, которые вы не хотите, чтобы ваши пользователи могли устанавливать в таблице операторов, то второй способ небезопасен.

+0

спасибо, ясный. Теперь, поскольку форма html имеет определенные поля, которые могут быть заполнены, как пользователь может «ввести» значение, которое мы не хотим получать в объекте POST, например operator.id, который я хочу сохранить, генерируемый только MySQL DB. – Vasikos

+2

HTML-форма отображается на стороне клиента (в браузере пользователя). Пользователь не должен соблюдать правила формы и может добавлять элементы ввода в эту форму, чтобы они были отправлены в тело POST, или даже обойти форму вместе и просто вызвать ваш API напрямую с помощью HTTP POST из некоторого кода они пишут. – Joe

1

Второй способ может быть связан с безопасностью, поскольку в вашу базу данных можно вставить нежелательные значения, захватив объект post post.

Например, если кто-то добавить operator_id в посте объект и у вас есть поле operator_id в operator таблицы, то ваше значение operator_id будет вставлен с нежелательным значением.

+0

Даже в первом примере (перед рефакторингом) мне удалось сделать SQL-инъекцию, добавив поле формы «id» и изменив такой же массив объектов в клиентском ajax-запросе. Как я могу избежать этого? – Vasikos

+0

В первом примере вы извлекаете только четыре значения из объекта body [operator, email, telephone, notes], я не думаю, что вы можете ввести значение ID в оператор sql. Возможно, вам следует создать новый вопрос с образцами кода, чтобы я мог помочь вам решить проблему с SQL-инъекцией. – iKoala

Смежные вопросы