Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 使用preparedStatement是否意味着不会有任何SQL注入?_Security_Prepared Statement_Sql Injection - Fatal编程技术网

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

Security 使用preparedStatement是否意味着不会有任何SQL注入?,security,prepared-statement,sql-injection,Security,Prepared Statement,Sql Injection,我已经读到,为了防止SQL注入,必须使用PreparedStatement。 这是否意味着如果我使用perparedStatement,那么没有人可以在我的任何页面中执行SQL注入?它对SQL注入是万无一失的吗?如果没有,那么请给出一些例子来说明这一点。只要您实际使用的是预处理语句的参数替换功能(可能会误用它们,而不使用该功能),并且如果您使用的预处理语句库中没有bug,那么您应该可以抵抗原始SQL注入。但这并不意味着你不应该怀疑用户给你的任何东西。:-) 尽管Prepared语句有助于防御SQ

我已经读到,为了防止SQL注入,必须使用PreparedStatement。

这是否意味着如果我使用perparedStatement,那么没有人可以在我的任何页面中执行SQL注入?它对SQL注入是万无一失的吗?如果没有,那么请给出一些例子来说明这一点。

只要您实际使用的是预处理语句的参数替换功能(可能会误用它们,而不使用该功能),并且如果您使用的预处理语句库中没有bug,那么您应该可以抵抗原始SQL注入。但这并不意味着你不应该怀疑用户给你的任何东西。:-)

尽管Prepared语句有助于防御SQL注入,但不适当地使用Prepared语句可能会导致SQL注入攻击

下面的示例解释了这样一种情况,即输入变量直接传递到准备好的语句中,从而为SQL注入攻击铺平道路

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

如果操作不当,预处理语句可能容易受到SQL注入的攻击。

使用所提供语言的预处理语句功能意味着您正在使用一种经过测试的解决方案来解决问题-这并不意味着决不存在任何错误或SQL注入可能性的范围,但它的真正含义是,您不是唯一使用该实现的人。越多的人使用相同的实现来完成某件事情,就意味着发现和消除错误的机会就越大——如果你使用自己的实现,那么只有你才能找到并修复错误。

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

由于可能的选项数量有限,所有变量标识符都应根据用户输入从预先编写的变量中选择。操作员也一样。

不应将用户输入直接添加到查询中

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

然而,这并不意味着JDBC驱动程序中不可能有bug,这为SQL注入打开了大门。当我为我工作的一家公司调查这一点时,我发现在我们使用的一个JDBC驱动程序(PostgreSQL)中确实存在SQL注入错误。这是几年前的事了,bug已经修复了

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


不过,我认为这种情况很少见,我的建议是信任实施并正确使用准备好的报表。

那么为什么会有负面评级呢?我的回答是错误的或误导性的呢?使用框架的关键在于它的广泛应用——发现和修复问题的机会越多,通过框架使用的代码越有可能得到验证。您自己的代码只能由您自己验证,因此与其他实现相比,您处于劣势。那么我的立场有什么问题吗?我不会把它当作准备好的声明,即使它说的是con.preparedStatement。@Rakesh:是的,但你会惊讶的…:-)