我已经看到 SQL 注入(inject)字符串通常是这样构造的:
' ; DROP DATABASE db --
因此,如果我不允许在应用程序的输入中使用分号,这是否 100% 防止任何 SQL 注入(inject)攻击?
最佳答案
它可能会停止注入(inject)像你的 drop 这样的辅助 DDL 语句,因为它们可能会在选择中创建语法错误,但它不会停止这样的语句:
返回比预期更多的数据
' or 1=1
输出删除
' or 1 in (select * from (delete someOtherTable OUTPUT DELETED.* ) a)
注入(inject)攻击围绕着对预期 SQL 语句的任何操作,而不仅仅是终止该语句并注入(inject)第二条语句。
注入(inject)攻击来自未经净化的用户输入
然而,重要的是不要将 SQL 注入(inject)攻击完全与动态/内联 sql 混为一谈。 SQL 注入(inject)攻击来自动态 sql 中使用的 UN-SANITIZED USER INPUT。只要查询的组件都来自您信任的来源,您就可以毫无问题地“构建”查询。例如,我们使用模式来保存自定义结构......
$"select * from {customSchemaName}.EmployeeExtension where id=@id and clientid=@clientId"
从输入的角度来看,上面仍然是参数化查询,但模式名称是没有接口(interface)可以访问的内部系统查找。
我在这里提出内联/动态 sql 的案例:
https://dba.stackexchange.com/a/239571/9798
关于security - 限制分号以防止 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6800554/