假设我有下面的代码,其中studentId来自用户输入,
const sql = 'select Name from student where Id = ' + studentId;
connection.exec(sql)
上面的代码肯定容易出现SQL注入。我想知道以下两个选项是否都可以解决 SQL 注入攻击并且是否相同。
选项 1. 使用 PL/SQL 变量声明并将用户输入与模板绑定
const sql = `DECLARE @Id=${studentId}; select Name from student where Id = @Id;`;
connection.exec(sql)
选项2.使用库提供的参数选项
const sql = 'select Name from student where Id = @Id;';
parameters.add({name: Id, value: studentId})
connection.exec(sql,parameters)
最好的 apoach 是使用从对象连接执行的函数,发送请求和参数。
function prepareSQL() {
const sql = `INSERT INTO USERS VALUES (@val1, @val2)`;
const request = new Request(sql, (err, rowCount) => {
if (err) {
throw err;
}
});
// Must add parameters
request.addParameter('val1', TYPES.Int);
request.addParameter('val2', TYPES.Int);
request.on('prepared', () => {
console.log('request prepared');
executePreparedSQL(request);
});
connection.prepare(request);
}
function executePreparedSQL(request) {
connection.execute(request, { val1: 1, val2: 2 });
request.on('requestCompleted', () => {
console.log('DONE!');
connection.close();
});
}
您可以在此处查看示例。
有关函数执行的更多信息,请参阅官方文档。