我正在尝试对我的一个应用程序进行 SQL 注入,以完成我需要为项目进行的撰写工作。
我使用了以下声明:
Statement statement = conn.createStatement();
String insertTableSQL = "INSERT INTO activity (activity_name, user_id, category_id, started, completed) VALUES ('" + activityForm.getName() + "', '" + user.getId() + "', '" + category.getId() + "', '" + 0 + "', '" + 0 + "')";
System.out.println(insertTableSQL);
statement.executeUpdate(insertTableSQL);
当我将以下内容放入我的表单输入之一(在本例中为活动名称输入)时:
活动名称');放下桌子上的学生; --
我收到以下错误:
INSERT INTO activity (activity_name, patient_id, category_id, started, completed) VALUES ('ActivityName'); DROP TABLE STUDENTS; --', '1', '1', '0', '0')
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP TABLE STUDENTS; --', '1', '1', '0', '0')' at line 1
我似乎无法找到避免此错误的方法,所以我希望有人有一些想法。
我猜测发生错误是因为 Java 中的 Statement 工作方式以及正在解析的查询的其余部分。
谢谢
编辑:我知道我应该使用准备好的语句,我确实这样做。我的应用程序使用 ORM 和 JPA。 对于大学来说,我只是测试 SQL 注入是如何工作的。
默认情况下,MySQL JDBC 驱动程序不允许一次执行运行多个 SQL 语句。这意味着您显示的 SQL 注入测试类型无法执行。这是一件好事!
当您连接到 JDBC 数据源时,您必须通过在 JDBC URL 中添加
allowMultiQueries=true
来显式允许多重查询。
另请参阅 在单个语句中在 java 中执行多个查询
还有其他类型的 SQL 注入不运行额外的语句。
即使设置了
allowMultiQueries=true
,Prepared 语句仍然不支持多查询。