SQL注入漏洞通过preparedStatement

dee*_*jay 1 java sql jdbc

像这样的声明

String query = "SELECT * FROM users WHERE userid ='"+ userid + "'" + " AND password='" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Run Code Online (Sandbox Code Playgroud)

有资格进行SQL注入.但是PreparedStatement如何帮助防止SQL注入?请考虑以下情形:

PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

如果有人进入什么userId = "abc"password = "1=1",因为这也将被视为有效的字符串...

Jon*_*eet 6

这可以保护您的确切方式取决于数据库,但有两个明显的选择:

  • 数据库驱动程序可以执行字符串插值并生成SQL语句,以确保正确转义所有参数.
  • 该数据库驱动程序能够通过完全按照你已经将它指定到数据库的SQL,并通过一个完全独立的渠道,它不需要任何转义,因为它传递的参数值包含值.

在我看来,后者是一个更明智的解决方案,因为它允许数据库真正简单地缓存查询计划,认识到两个查询除参数值之外完全相同.我希望任何现代数据库都能在其本机通信协议中支持这一点.