我阅读了许多关于堆栈溢出的文章,内容涉及如何使用准备好的语句来防止SQL注入。
但是,即使是在准备好的语句上,也有任何方法可以执行SQL注入吗?还是说它是100%安全的呢?
下面是我的java代码
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注入查询,例如
一些投入:
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注入,请建议我。
发布于 2015-05-11 13:50:20
这个查询:String query = "SELECT * FROM Users WHERE username=? and password=?";是安全的,因为无论参数是什么,它仍将作为一个简单的选择来执行。最多,它将结束浏览一整张桌子。
但是准备好的声明只是一种工具,(糟糕的)程序员可能仍然会滥用它。
让我们来看看下面的查询
String query = "SELECT id, " + paramName + " FROM Users WHERE username=? and password=?";其中paramName将是一个参数名。它与paramName一样安全,因为您直接使用一个变量来构建将由数据库引擎解析的字符串。在这里,PreparedStatement无法帮助,因为JDBC不允许参数化列名。
所以这里的规则是:
paramName只能是您所期望的,因为控件是唯一防止SQL注入的。https://stackoverflow.com/questions/30168659
复制相似问题