security - 限制分号以防止 SQL 注入(inject)?

标签 security tsql sql-injection

我已经看到 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/

相关文章:

git - 在 git 存储库中处理密码的最佳做法是什么?

web-services - 编写安全的 REST Web 服务

google-chrome - 如何在 .Net framework 4.0.30319 中设置 HttpCookie Samesite 属性?

sql - 检测存储过程中的脏读

sql-injection - $this->input->xss_clean($data) 使用 codeigniter 给出 fatal error

Java jersey 导入包

sql-server - 当更新的值不是太长时,我怎么能得到 "String or binary data would be truncated"?

sql-server - 如果记录不存在,插入记录的最佳做法是什么?

c# - 当它作为字符串出现时,保护完整的 where 语句

sql - 如何清理 Arel SQL?