首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在准备好的语句中,SQL注入也可能吗?

即使在准备好的语句中,SQL注入也可能吗?
EN

Stack Overflow用户
提问于 2015-05-11 13:13:48
回答 1查看 4.5K关注 0票数 2

我阅读了许多关于堆栈溢出的文章,内容涉及如何使用准备好的语句来防止SQL注入。

但是,即使是在准备好的语句上,也有任何方法可以执行SQL注入吗?还是说它是100%安全的呢?

下面是我的java代码

代码语言:javascript
复制
 String query = "SELECT * FROM Users WHERE username=? and password=?";

 ps=con.prepareStatement(query);  

 ps.setString(1,username);
 ps.setString(2,password);

 rs = ps.executeQuery();

 status = rs.next();

 if(status==true){
.....
}else{
....
}

我尝试了一些sql注入查询,例如

一些投入:

代码语言:javascript
复制
SELECT * FROM users WHERE username = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

我也尝试过一些更多的查询,但由于(单引号)‘转义(/’),似乎没有一个SQL注入查询工作。

如果有任何SQL注入查询/技术可以应用于上述代码中的SQL注入,请建议我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 13:50:20

这个查询:String query = "SELECT * FROM Users WHERE username=? and password=?";是安全的,因为无论参数是什么,它仍将作为一个简单的选择来执行。最多,它将结束浏览一整张桌子。

但是准备好的声明只是一种工具,(糟糕的)程序员可能仍然会滥用它。

让我们来看看下面的查询

代码语言:javascript
复制
String query = "SELECT id, " + paramName + " FROM Users WHERE username=? and password=?";

其中paramName将是一个参数名。它与paramName一样安全,因为您直接使用一个变量来构建将由数据库引擎解析的字符串。在这里,PreparedStatement无法帮助,因为JDBC不允许参数化列名。

所以这里的规则是:

  • 如果可以的话,避免这样的构造!
  • 如果你真的需要它,重复检查(正则表达式,允许的字符串列表,等等)该paramName只能是您所期望的,因为控件是唯一防止SQL注入的
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30168659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档