限制分号以防止SQL注入吗?

问题描述 投票:9回答:7

我已经看到SQL注入字符串通常是这样构造的:

' ; DROP DATABASE db  --

因此,如果我禁止在应用程序的输入中使用分号,那么这100%是否可以防止任何SQL注入攻击?

security tsql sql-injection
7个回答
9
投票

不,它不能防止sql注入攻击。每当您在客户端或在存储的proc中使用EXEC动态构建SQL时,都将面临风险。

参数化查询是将输入输入查询的首选方法。


10
投票

使用参数化查询(或存储过程),避免像瘟疫这样的动态SQL。

我建议使用内置的库函数,而不要尝试编写自己的反注入代码。

即使一个天真的实现,它也应该删除;(例如,作为合法的VARCHAR或CHAR参数传递的一部分)。您最终将不得不编写自己的SQL解析器才能接受/拒绝查询。

您可以阅读here有关动态SQL以及它提出的(并解决的)更多信息。


4
投票

不,不是。您刚刚展示了一个SQL注入的示例。但是还有更多,所有这些都取决于您将数据插入的上下文。

此外,不是导致该问题的分号,而是导致字符串声明过早结束的'。将输入数据正确编码为prevent SQL injection


3
投票

避免SQL注入的最佳方法是避免用户提供的数据的字符串连接。最好通过使用存储过程或使用参数化查询来完成。


2
投票

不,不要专注于分号。着重于将用户输入放入sql查询的方式(通常用引号引起),然后着重于引号。同样不要忘记在sql中使用regexp时,它们需要略有不同的转义过程。


1
投票

这将取决于多种因素(哪些查询等)。您应该为此使用准备好的语句


0
投票

它可能停止注入像您的drop这样的辅助DDL语句,因为它们可能会在select内创建语法错误,但不会停止这样的语句:

返回比预期更多的数据

' or 1=1

删除输出

' or 1 in (select * from (delete someOtherTable OUTPUT DELETED.* ) a)

注入攻击围绕对预期的SQL语句的任何操纵,而不仅仅是终止该语句并注入第二条语句。

© www.soinside.com 2019 - 2024. All rights reserved.