我可以通过使用参数避免所有SQL注入攻击吗?
在这种情况下,不要担心SQL注入中的任何事情?
或者是否有某些类型的这些攻击需要程序员更多的关心?我可以通过使用参数避免所有SQL注入攻击吗?
回答
不,您无法通过使用参数避免所有SQL注入攻击。动态SQL是真正的问题,这可能发生在存储过程以及应用程序代码中。例如:
例如,这很容易出现SQL注入攻击:您的参数化查询将用户名传递给存储过程,并且在存储过程中将参数连接到SQL命令,然后执行。
有关多种SQL注入攻击的示例,请参阅此SQL Injection Cheat Sheet。你会看到,简单地转义单引号只是表面上的问题,而且有很多方法。
如果您打算使用这些参数(例如传递给存储过程)构建动态sql查询,那么如果不采取预防措施,就有可能进行sql注入。
是的,没有。是的,如果所有的SQL语句都是静态的并且只使用参数,那么您100%免受SQL注入攻击。
当参数本身用于构造动态SQL语句时,会出现问题。一个例子是一个存储过程,它动态地生成一条SQL语句来查询多个不同的选项,其中单个单一语句是不切实际的。虽然这个问题有更好的解决方案,但这是常见的解决方案。
100%,即假设MS或Novell没有犯任何错误。 – 2010-09-17 15:54:13
只要您的数据库引擎支持SQL语句,您就可以通过使用预准备语句始终将SQL注入的风险降至最低。
无论如何,准备好的语句可能是阻止SQL注入的最安全的方式。
是的,您可以通过使用参数来避免所有SQL注入攻击,只要您在调用堆栈之前完全使用参数即可。例如:
- 您的应用程序代码调用数据库中的存储过程或动态SQL。必须使用参数来传递所有值。
- 存储过程或动态SQL在内部构造对另一个存储过程或动态SQL语句的调用。这也必须使用参数来传递所有值。
- 重复ad-infinitum,直到用完代码。
如果在SQL Server编程,您可以使用sp_executesql
执行动态SQL,这将让你定义并通过参数化值正在执行的语句。
+1我认为人们会忘记你可以在动态SQL中使用参数。 – dotjoe 2010-09-17 16:24:49
问题是动态构建SQL语句。
例如,您可能想要根据用户选择的列对结果进行排序。在大多数数据库中,您不能在这里使用参数(“ORDER BY?”不起作用)。所以你必须“ORDER BY”+列。现在,如果“列”是一个字符串,那么你的网络应用程序的用户可以在那里注入代码(这并不容易,但可能)。
- 1. 我可以通过替换JUST CR来避免CRLF注入攻击吗?
- 2. “mysqli_real_escape_string”足以避免SQL注入或其他SQL攻击吗?
- 3. 我可以在用户输入上使用asp.net验证器来避免sql注入攻击吗?
- 4. 这是可能的攻击吗?我可以避免它吗?
- 5. 有人可以向我解释这个SQL注入攻击吗?
- 6. FILTER_SANITIZE_STRING是否足以避免SQL注入和XSS攻击?
- 7. 我可以通过使用会话阻止XSS攻击吗?
- 8. 如何在PHP中避免SQL注入和XSS攻击?
- 9. PHP和PostgreSQL:避免跨站脚本和SQL注入攻击
- 10. Modsecurity配置(为了避免误报SQL注入攻击)
- 11. SQL注入攻击
- 12. SQL注入攻击
- 13. 如何避免我的ASP.NET应用程序中的SQL注入攻击?
- 14. 参数化语句可以停止所有SQL注入吗?
- 15. 你可以使用PHP Explode()来防御注入攻击吗?
- 16. Nhibernate易受SQL注入攻击吗?
- 17. urlencode()足以在2011年停止所有SQL注入攻击
- 18. 我可以避免使用`asmatrix`吗?
- 19. 避免SQL注入
- 20. 消毒$ _GET参数,以避免XSS和其他攻击
- 21. SQL注入攻击 - 使用mysqli_multi_query()
- 22. 应该在MySQL查询中引用来自用户输入的数字以帮助避免SQL注入攻击?
- 23. str_replace的这种用法足以防止SQL注入攻击吗?
- 24. SQL注入/ XSS攻击可能与preg_replace?
- 25. 如何避免SQL Server 2008 R2的SSRS中的SQL注入攻击?
- 26. 使用SqlParameter可以完全避免SQL注入?
- 27. 检查模式以避免XSS攻击
- 28. SQL注入攻击asp.net
- 29. SQL注入攻击和django
- 30. Erlang和SQL注入攻击
那么解决方案是什么? – 2010-09-17 15:50:43
@MH:全部替换为'' – 2010-09-17 15:52:58
解决方案是从不使用动态SQL。如果这是不可能的,那么你必须采取极端的措施,以确保你正确地转义任何将连接到SQL语句的字符串,并且还要考虑字符串如何跨域进行编组(例如,HTML - > Javascript - - > URL编码 - >),因为这些转换可能会有其他复杂性。 – RedFilter 2010-09-17 15:56:53