如何防止 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 注入?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Android中的SQL注入?

SQL Server如何防止动态sql中的sql注入

如何防止nodejs中的sql注入和续集? [关闭]

如何防止 PYTHON-DJANGO 中的 SQL 注入?

使用“database/sql”时如何防止 Go 中的 SQL 注入攻击?

如何防止不和谐机器人python中的SQL注入攻击