如何防止JSP中的SQL注入?

就在上周,我正在做一些PHP的东西。 我使用了一点解决方案来防止SQL注入。 PHP一直是我的人,它有3个解决方案可供使用(可能更多)。 一种是使用stripslashes()函数启用“魔术查询”。 另一个(推荐)是使用mysql_real_escape_string()函数。 那简单,我的问题就解决了。 但是,当谈到JSP时,事情似乎并不那么简单。 我搜索并没有找到任何内置函数来去除斜线或做那些事情(我相信这样的function可以使用基本的JAVA函数实现,但……)。

请帮我保护我的数据库。 我听说过PreparedStatement ,但是真的无法理解它? (我觉得新手的真正含义)。

只需使用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代码也被认为是一种不好的做法 。 最佳实践是创建一个独立的类,它在特定的表上执行所有数据库交互任务,也称为DAO(数据访问对象)类。 然后,您可以在servlet类中导入/使用此DAO类。

也可以看看:

  • Java教程 – JDBC教程 – PreparedStatement
  • Statement和PreparedStatement之间的区别
  • 如何将jsp中的ResultSet对象发送回html(javascript)?