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

Moh*_*oud 8 sql security sql-injection

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

Red*_*ter 10

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

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

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


Ada*_*son 9

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

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


Chr*_*ter 5

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

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

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