2010-09-17 54 views

回答

10

不,您无法通过使用参数避免所有SQL注入攻击。动态SQL是真正的问题,这可能发生在存储过程以及应用程序代码中。例如:

例如,这很容易出现SQL注入攻击:您的参数化查询将用户名传递给存储过程,并且在存储过程中将参数连接到SQL命令,然后执行。

有关多种SQL注入攻击的示例,请参阅此SQL Injection Cheat Sheet。你会看到,简单地转义单引号只是表面上的问题,而且有很多方法。

+0

那么解决方案是什么? – 2010-09-17 15:50:43

+0

@MH:全部替换为'' – 2010-09-17 15:52:58

+0

解决方案是从不使用动态SQL。如果这是不可能的,那么你必须采取极端的措施,以确保你正确地转义任何将连接到SQL语句的字符串,并且还要考虑字符串如何跨域进行编组(例如,HTML - > Javascript - - > URL编码 - >),因为这些转换可能会有其他复杂性。 – RedFilter 2010-09-17 15:56:53

2

如果您打算使用这些参数(例如传递给存储过程)构建动态sql查询,那么如果不采取预防措施,就有可能进行sql注入。

9

是的,没有。是的,如果所有的SQL语句都是静态的并且只使用参数,那么您100%免受SQL注入攻击。

当参数本身用于构造动态SQL语句时,会出现问题。一个例子是一个存储过程,它动态地生成一条SQL语句来查询多个不同的选项,其中单个单一语句是不切实际的。虽然这个问题有更好的解决方案,但这是常见的解决方案。

+0

100%,即假设MS或Novell没有犯任何错误。 – 2010-09-17 15:54:13

1

只要您的数据库引擎支持SQL语句,您就可以通过使用预准备语句始终将SQL注入的风险降至最低。

无论如何,准备好的语句可能是阻止SQL注入的最安全的方式。

5

是的,您可以通过使用参数来避免所有SQL注入攻击,只要您在调用堆栈之前完全使用参数即可。例如:

  • 您的应用程序代码调用数据库中的存储过程或动态SQL。必须使用参数来传递所有值。
  • 存储过程或动态SQL在内部构造对另一个存储过程或动态SQL语句的调用。这也必须使用参数来传递所有值。
  • 重复ad-infinitum,直到用完代码。

如果在SQL Server编程,您可以使用sp_executesql执行动态SQL,这将让你定义并通过参数化值正在执行的语句。

+0

+1我认为人们会忘记你可以在动态SQL中使用参数。 – dotjoe 2010-09-17 16:24:49

1

问题是动态构建SQL语句。

例如,您可能想要根据用户选择的列对结果进行排序。在大多数数据库中,您不能在这里使用参数(“ORDER BY?”不起作用)。所以你必须“ORDER BY”+列。现在,如果“列”是一个字符串,那么你的网络应用程序的用户可以在那里注入代码(这并不容易,但可能)。

相关问题