就在上周,我正在做一些PHP的东西。我做了一些小的解决方案来防止SQL注入。 PHP一直是我的男人,它有3个解决方案可供使用(可能更多)。一种是使用stripslashes()
函数启用“魔术查询”。另一个(推荐)是使用mysql_real_escape_string()
功能。
那个简单,我的问题就解决了。但是,当谈到JSP时,事情似乎并不那么简单。我搜索并没有找到任何内置函数来去除斜线或做那些事情(我相信这样的功能可以使用基本的JAVA函数来实现,但是......)。
请帮我保护我的数据库。我听说PreparedStatement
,但真的无法理解它? (我觉得新手的真正含义)。
答案 0 :(得分:23)
只需使用PreparedStatement
代替Statement
。
即。使用
String sql = "INSERT INTO tbl (col1, col2, col3) VALUES (?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, col1);
preparedStatement.setString(2, col2);
preparedStatement.setString(3, col3);
preparedStatement.executeUpdate();
而不是
String sql = "INSERT INTO tbl (col1, col2, col3) VALUES ('" + col1 + "', '" + col2 + "', '" + col3 + "')";
statement = connection.createStatement();
statement.executeUpdate(sql);
PreparedStatement
还为其他类型提供了方便的setter方法,例如setInt()
,setDate()
,setBinaryStream()
等。
请注意,此问题与JSP无关。它与Java有关。在JSP类中编写原始Java代码也被视为poor practice。最佳实践是创建一个独立的类,它在特定的表上执行所有数据库交互任务,也称为DAO(数据访问对象)类。然后,您可以在servlet类中导入/使用此DAO类。