我正在尝试重构这一点,特别是记录数组
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,但我放弃了它。
以上方式的任何可能性都会在以后的任何情况下导致错误吗?
答案 0 :(得分:1)
一个问题是您没有在运算符表上设置“允许”列的白名单。在第一个示例中,代码确保仅在要插入的新行上设置运算符,电子邮件,电话和备注列。在第二个示例中,用户添加到其POST请求正文的任何字段都将在要插入的新行上设置具有相同名称的列。这可能没问题,但如果您有任何列,您不希望您的用户能够在运算符表中进行设置,那么第二种方式是不安全的。
答案 1 :(得分:1)
第二种方法可能存在安全问题,因为可能会通过劫持您的帖子数据对象将不需要的值插入数据库。
例如,如果有人将operator_id
添加到帖子对象中,并且operator_id
表中包含字段operator
,那么您的operator_id
值将会插入不受欢迎的价值。