避免SQL注入

时间:2011-07-08 07:51:38

标签: java sql-injection security

我想避免在我的Webapp中使用SQL注入。 它是基于Java的。

PreparedStatements是否足够?

我是否必须过滤掉'和'?Java中是否已有解决方案?

4 个答案:

答案 0 :(得分:5)

我对你的第二段中的问题的直觉反应是,对于这类问题来说,考虑一个“足够”的方面通常是一个坏主意 - 至少如果你这样做,你就不再考虑这些原则参与。

使用PreparedStatements确实可以在很长的时间内停止SQL注入,就像使用单击synchronized一样,在任何地方停止数据争用都有很长的路要走。在许多个人情况下,他们将完全足够。但在这两种情况下,它们都不是魔法子弹 - 你需要知道你使用它们的原因,以及它们何时何地不足。例如,如果您认为PreparedStatements是一个防止SQL注入的魔术包装器,那么您第一次需要根据用户输入创建动态语句(而不仅仅是参数化语句)时会非常失望。

因此,“足够”的东西就是教育。了解威胁的工作原理和原因;一旦你理解了这一点,你将能够对给定的情况采取适当的行动(有时候只是使用PreparedStatement,但并非总是如此)。我不知道SQL注入有什么特别好的资源(超出你可以从谷歌获得的内容),所以希望其他答案可以指向你的One True Tutorial!

答案 1 :(得分:4)

只是不要通过连接字符串手动编写SQL,始终使用PreparedStatement并将其参数化为?通配符。 JDBC驱动程序将负责转义,因此您不必自己动手。

另一方面,逃避很难。您会惊讶地发现有多种方法可以解决您的转义算法问题。 JDBC驱动程序可以正常工作。

答案 2 :(得分:2)

虽然Prepared Statements有助于防御SQL注入,但是通过不当使用Prepared Statements可能会导致SQL注入攻击。下面的示例解释了这样一种情况,即输入变量直接传递到Prepared Statement中,从而为SQL Injection攻击铺平道路。

示例:

String strUserName = request.getParameter("Txt_UserName"); 
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");

有关阻止SQL注入的更多信息here


OWASP是开始与软件开发相关的任何安全性的好地方。 它们具有可用于阻止XSS和SQL注入的Java库。

他们也有一个非常不安全的网络应用程序,您可以尝试破解,并了解如何做到这一点。

答案 3 :(得分:1)

准备好的陈述可以就足够了。如果使用预准备语句,您仍然需要使用通配符来构建语句。换句话说,可以以错误的方式使用预准备语句。您不必过滤掉任何参数以避免SQL注入。不过,您可能需要过滤掉某些值以避免基于Web的攻击(如XSS),具体取决于您的环境和范围。