【发布时间】:2010-09-17 15:44:07
【问题描述】:
是否可以通过使用参数来避免所有 SQL 注入攻击?
并且在这种情况下不用担心 SQL 注入中的任何事情?
或者是否有一些类型的攻击需要程序员更加小心?
【问题讨论】:
标签: sql security sql-injection
是否可以通过使用参数来避免所有 SQL 注入攻击?
并且在这种情况下不用担心 SQL 注入中的任何事情?
或者是否有一些类型的攻击需要程序员更加小心?
【问题讨论】:
标签: sql security sql-injection
不,您无法通过使用参数来避免所有 SQL 注入攻击。动态 SQL 是真正的问题,这可能发生在存储过程以及您的应用程序代码中。
例如,这很容易受到 SQL 注入攻击:您的参数化查询将用户名传递给存储过程,并在存储过程中将参数连接到 SQL 命令然后执行。
有关多种 SQL 注入攻击的示例,请参阅此SQL Injection Cheat Sheet。您会看到,简单地转义单引号只是表面问题,还有很多方法可以解决这个问题。
【讨论】:
replace(replace(replace(replace(@yourstring,'update', ''), 'delete', ''),'insert', ''),'drop',''),... 等等你能想到的每一个可能的邪恶行为。换句话说,没有真正的解决方案来保护动态 SQL。
是和不是。是的,如果您的所有 SQL 语句确实是静态的并且只使用参数,那么您将 100% 免受 SQL 注入攻击。
当参数本身用于构造动态 SQL 语句时,问题就出现了。一个示例是动态生成 SQL 语句以查询多种不同选项的存储过程,其中单个整体语句是不切实际的。虽然这个问题有更好的解决方案,但这是一个常见的解决方案。
【讨论】:
是的,您可以通过使用参数来避免所有 SQL 注入攻击,只要您完全在调用堆栈中一直使用参数。例如:
如果您在 SQL Server 中编程,您可以使用sp_executesql 执行动态 SQL,它可以让您定义参数化值并将其传递给正在执行的语句。
【讨论】:
如果您要使用这些参数(例如,传递给存储过程)构建动态 sql 查询,那么如果不采取预防措施,就有可能发生 sql 注入。
【讨论】:
只要您的数据库引擎支持,您始终可以通过使用准备好的语句将 SQL 注入的风险降至最低。
无论如何,prepared statements 可能是阻止 SQL 注入的最安全的方法。
【讨论】:
问题在于动态构建 SQL 语句。
例如,您可能希望根据用户选择的列对结果进行排序。在大多数数据库中,您不能在此处使用参数(“ORDER BY ?”不起作用)。所以你必须“ORDER BY”+列。现在,如果“column”是一个字符串,那么您的 Web 应用程序的用户可以在那里注入代码(这并不容易,但可能)。
【讨论】: