像这样的声明
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",因为这也将被视为有效的字符串...
这可以保护您的确切方式取决于数据库,但有两个明显的选择:
在我看来,后者是一个更明智的解决方案,因为它允许数据库真正简单地缓存查询计划,认识到两个查询除参数值之外完全相同.我希望任何现代数据库都能在其本机通信协议中支持这一点.
| 归档时间: |
|
| 查看次数: |
1760 次 |
| 最近记录: |