假设我有下面的代码,其中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)
2条答案
按热度按时间u7up0aaq1#
最好的方法是使用对象连接的执行函数,发送请求和参数。
你可以在这里看到这个例子。
关于函数execute的更多信息请参见官方文档。
omtl5h9j2#
假设studentId的值类似于:
return“1; DROP TABLE some_table”
案例1容易受到SQL注入的攻击,因为它也只是一种字符串连接的形式。在这种情况下,生成的SQL查询将是
return 1; DROP TABLE some_table;从学生中选择姓名,其中ID = @ID;
因此,情况2始终是首选,因为它使用绑定参数