Java 即使在准备好的语句上也可以进行SQL注入吗
我读了很多关于堆栈溢出的文章,这些文章都是关于如何通过使用准备好的语句来防止SQL注入的 但是,有没有任何方法可以在准备好的语句上执行SQL注入,或者说它是100%安全的 下面是我的java代码Java 即使在准备好的语句上也可以进行SQL注入吗,java,mysql,sql-injection,penetration-testing,Java,Mysql,Sql Injection,Penetration Testing,我读了很多关于堆栈溢出的文章,这些文章都是关于如何通过使用准备好的语句来防止SQL注入的 但是,有没有任何方法可以在准备好的语句上执行SQL注入,或者说它是100%安全的 下面是我的java代码 String query = "SELECT * FROM Users WHERE username=? and password=?"; ps=con.prepareStatement(query); ps.setString(1,username); ps.setString(2,p
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注入。此查询:
String query=“SELECT*FROM username=?和password=?”的用户
是安全的,因为无论参数是什么,它都将作为简单的选择执行。它最多只能浏览一整张桌子
但prepared语句只是一个工具,(糟糕的)程序员可能仍然会滥用它
让我们看看下面的查询
String query = "SELECT id, " + paramName + " FROM Users WHERE username=? and password=?";
其中,paramName
将是一个参数名。它只与paramName
一样安全,因为您直接使用变量来构建将由数据库引擎解析的字符串。这里的PreparedStatement
没有帮助,因为JDBC不允许参数化列名
因此,这里的规则是:
- 尽可能避免这种构造李>
- 如果您确实需要它,请仔细检查(正则表达式、允许的字符串列表等)
不能是您期望的以外的任何内容,因为该控件是防止SQL注入的唯一方法paramName
语句
作为参数
在准备好的语句
中不会执行-这是由设计保证的,因此您的“体验”实际上从未发生过,或者您的数据库有/有严重的错误<代码>准备好的语句将在应用任何参数之前完成所有执行-这意味着内部查找逻辑本身不能被参数修改感谢…对于答案,它非常有用…是否有其他方法或技巧使用我的上述代码执行sql注入。。。