使用preparedStatement是否意味着不会有任何SQL注入?

时间:2010-09-20 10:40:13

标签: security prepared-statement sql-injection

我已经读过为防止SQL注入必须使用PreparedStatement 这是否意味着如果我使用perparedStatement然后没有人可以在我的任何页面中执行SQL注入? SQL注入是否万无一失?如果没有,那么请举一些例子来证明这一点。

5 个答案:

答案 0 :(得分:10)

只要您实际使用预准备语句的参数替换功能(可能会滥用它们而不使用该功能),并且假设您正在使用的预准备语句库中没有错误,那么你应该对原始SQL注入没问题。但这并不意味着你不应该怀疑用户给你的任何怀疑。 : - )

答案 1 :(得分:4)

预备语句不包括查询的非数据部分 - 标识符和运算符 因此,如果它们中的一些是可变的并且直接添加到查询中,则可以进行注入。

由于可能的选项数量有限,所有变量标识符都应根据用户输入从预先编写的变体中选择。对于运营商也是如此 不应该直接向查询添加用户输入。

答案 2 :(得分:3)

使用所提供语言的预准备语句功能意味着您正在使用经过验证的问题解决方案 - 这并不意味着SQL注入的可能性从来没有任何错误或范围,但它的意思是并不是唯一使用该实现的人。使用相同实现的人越多意味着找到并消除错误的机会就越多 - 如果您使用自己的实现,那么只有您才能找到并修复错误。

答案 3 :(得分: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注入攻击。

答案 4 :(得分:2)

简短回答:是的,如果使用得当。

但是,这并不意味着JDBC驱动程序中没有错误,而是为SQL注入开放。当我为我所在的公司调查这个时,我发现我们使用的一个JDBC驱动程序(PostgreSQL)确实存在SQL注入错误。这是在几年前,错误已得到修复。

虽然我不记得具体细节,但我记得看一下JDBC实现的源代码,并看到它是用字符串连接实现的。

我希望这很少见,我的建议是相信实现并正确使用PreparedStatements。