如何防止 JSP 中的 SQL 注入?
Posted
技术标签:
【中文标题】如何防止 JSP 中的 SQL 注入?【英文标题】:how to prevent SQL Injection in JSP? 【发布时间】:2011-09-10 11:59:59 【问题描述】:就在上周,我正在做一些 php 的事情。我做了一个小解决方案来防止 SQL 注入。 PHP 一直是我的人,它有 3 种解决方案可供使用(也许更多)。一种是使用stripslashes()
函数启用“魔术查询”。另一种(推荐)是使用mysql_real_escape_string()
函数。
这么简单,我的问题就解决了。然而,当涉及到 JSP 时,事情似乎并不那么简单。我搜索并没有找到任何内置函数来去除斜线或做那些事情(我相信这样的功能可以使用基本的 JAVA 函数来实现,但是......)。
请帮助我保护我的数据库。我听说过PreparedStatement
,但真的无法理解吗? (我感受到了新手的真正含义)。
【问题讨论】:
您使用的是哪个数据库系统? MySQL? 【参考方案1】:只需使用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。最佳实践是创建一个独立类,该类在特定表上执行所有 DB 交互任务,也称为 DAO(数据访问对象)类。然后,您可以在 servlet 类中导入/使用此 DAO 类。
另见:
Java Tutorials - JDBC Tutorial - PreparedStatement Difference between Statement and PreparedStatement how to send a ResultSet object in jsp back to html (javascript)?【讨论】:
哇,这是一个传播大量信息的评论,你的评论对我很有帮助,你让事情变得简单,谢谢你,因为你,它已经解决了! 不客气。顺便说一句,这是一个答案,而不是评论。您在问题/答案下面看到的那些小东西是 cmets :) +1 表示“JSP 中的 Java 代码是一种不好的做法”评论。当您开始使用 JSP 时,这似乎是个好主意,但是当您稍后返回以删除所有与视图无关的逻辑时,会很痛苦。以上是关于如何防止 JSP 中的 SQL 注入?的主要内容,如果未能解决你的问题,请参考以下文章