我已经看到SQL注入字符串通常是这样构造的:
' ; DROP DATABASE db --
因此,如果我禁止在应用程序的输入中使用分号,那么这100%是否可以防止任何SQL注入攻击?
不,它不能防止sql注入攻击。每当您在客户端或在存储的proc中使用EXEC动态构建SQL时,都将面临风险。
参数化查询是将输入输入查询的首选方法。
使用参数化查询(或存储过程),避免像瘟疫这样的动态SQL。
我建议使用内置的库函数,而不要尝试编写自己的反注入代码。
即使一个天真的实现,它也应该删除;
(例如,作为合法的VARCHAR或CHAR参数传递的一部分)。您最终将不得不编写自己的SQL解析器才能接受/拒绝查询。
您可以阅读here有关动态SQL以及它提出的(并解决的)更多信息。
不,不是。您刚刚展示了一个SQL注入的示例。但是还有更多,所有这些都取决于您将数据插入的上下文。
此外,不是导致该问题的分号,而是导致字符串声明过早结束的'
。将输入数据正确编码为prevent SQL injection。
避免SQL注入的最佳方法是避免用户提供的数据的字符串连接。最好通过使用存储过程或使用参数化查询来完成。
不,不要专注于分号。着重于将用户输入放入sql查询的方式(通常用引号引起),然后着重于引号。同样不要忘记在sql中使用regexp时,它们需要略有不同的转义过程。
这将取决于多种因素(哪些查询等)。您应该为此使用准备好的语句
它可能停止注入像您的drop这样的辅助DDL语句,因为它们可能会在select内创建语法错误,但不会停止这样的语句:
返回比预期更多的数据
' or 1=1
删除输出
' or 1 in (select * from (delete someOtherTable OUTPUT DELETED.* ) a)
注入攻击围绕对预期的SQL语句的任何操纵,而不仅仅是终止该语句并注入第二条语句。