Java 即使在准备好的语句上也可以进行SQL注入吗

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

我读了很多关于堆栈溢出的文章,这些文章都是关于如何通过使用准备好的语句来防止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注入。

此查询:
String query=“SELECT*FROM username=?和password=?”的用户
是安全的,因为无论参数是什么,它都将作为简单的选择执行。它最多只能浏览一整张桌子

但prepared语句只是一个工具,(糟糕的)程序员可能仍然会滥用它

让我们看看下面的查询

String query = "SELECT id, " + paramName + " FROM Users WHERE username=? and password=?";
其中,
paramName
将是一个参数名。它只与
paramName
一样安全,因为您直接使用变量来构建将由数据库引擎解析的字符串。这里的
PreparedStatement
没有帮助,因为JDBC不允许参数化列名

因此,这里的规则是:

  • 尽可能避免这种构造
  • 如果您确实需要它,请仔细检查(正则表达式、允许的字符串列表等)
    paramName
    不能是您期望的以外的任何内容,因为该控件是防止SQL注入的唯一方法

PreparedStatements应防止SQL注入、自身引用和转义。然而,有许多数据库引擎和许多JavaJDBC驱动程序,所以一些异常可能并不完美。根据我的经验,SQL注入和PreparedStatements仍然会在某些xxxx尝试使用动态字符串来构造类似于(2、3、5、7、11、13)中的categ的东西时发生。您仍然需要防止将用户输入的JavaScript存储在以后显示为HTML内容。
语句
作为
参数
准备好的语句
中不会执行-这是由设计保证的,因此您的“体验”实际上从未发生过,或者您的数据库有/有严重的错误<代码>准备好的语句将在应用任何参数之前完成所有执行-这意味着内部查找逻辑本身不能被参数修改感谢…对于答案,它非常有用…是否有其他方法或技巧使用我的上述代码执行sql注入。。。