我可以通过使用参数来避免所有SQL注入攻击吗?

时间:2010-09-17 15:44:08

标签: sql security sql-injection

我可以使用参数避免所有SQL注入攻击吗? 在这种情况下,不要担心SQL注入中的任何内容吗? 或者是否有某些类型的攻击需要程序员更多的关注?

6 个答案:

答案 0 :(得分:10)

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

,这很容易发生SQL注入攻击:参数化查询将用户名传递给存储过程,在存储过程中,参数连接到SQL命令然后执行。

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

答案 1 :(得分:9)

是和否。是的,如果您的所有SQL语句都是静态的并且只使用参数,那么您将100%受到SQL注入攻击的保护。

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

答案 2 :(得分:5)

是的,只要您在调用堆栈中一​​直使用参数,就可以通过使用参数来避免所有SQL注入攻击。例如:

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

如果您使用SQL Server进行编程,则可以使用sp_executesql来执行动态SQL,它将允许您定义参数化值并将其传递给正在执行的语句。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

如果您的数据库引擎支持,您可以使用预准备语句来最小化SQL注入的风险。

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

答案 5 :(得分:1)

问题是动态构建SQL语句。

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