【问题标题】:Java JDBC thows com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException for \'Test1\' valueJava JDBC 为 \'Test1\' 值抛出 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
【发布时间】:2018-04-25 18:38:33
【问题描述】:

我有下表: dummy_tbl

  |id |Name |
  ----------
  |1  |Test1|
  |2  |Test2|

当我尝试在 SQlyog - MySql(5.6.80) 中执行以下查询时,它工作正常:

 select * from dummy_tbl where name like \'Test1\';

但是当我使用 JDBC 语句从代码中尝试相同的查询时,它会抛出以下错误:

 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 '\'Test1\'' at line 1

从代码中截取的代码:

  String sql = "SELECT * from dummy_tbl where name like \'Test1\'"; 
  Statement stmt= conn.createStatement(); 
  ResultSet rs = stmt.executeQuery(sql);

【问题讨论】:

  • 了解准备好的语句。这将防止 sql 注入和转义特殊字符
  • 我们需要查看您的 Java 代码,但无论如何您都应该使用准备好的语句,这样您就可以完全避免当前的错误。
  • 去掉单引号前面的反斜杠,在Test后面加上%sign
  • @Jen,我知道 PreparedStatement 用于防止 sql 注入,但这是我的遗留代码的要求。
  • 任何不使用PreparedStatements的要求都应该报告给您的安全团队以便推翻。

标签: java mysql jdbc


【解决方案1】:

如前所述,声明应该是

select * from dummy_tbl where name like 'Test%'

但它被“清理”了添加反斜杠。

在这种情况下使用PreparedStatement - 无论如何这是正确的方式(逃避自身,反对SQL注入):

String sql = "select * from dummy_tbl where name like ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
    stmt.setString(1, "Test%");
    try (ResultSet rs = stmt.executeQuery()) {
        while (rs.next()) {
            ...
        }
    }
}

【讨论】:

  • 是的,我已经知道 PreparedStatement 是防止 Sql Injection 的正确方法。但在我的情况下,由于对输入执行了一些自定义卫生处理,我无法控制输入值。
【解决方案2】:

将查询更改为: select * from dummy_tbl where name like 'Test%';

应该可以解决您的问题。

【讨论】:

  • 我知道上面会起作用,在这里我无法编辑将 \ 添加到单引号的现有清理方法。如果 smae 查询在 Sqlyog 中工作,那么它也应该在 java 代码中工作。
  • @Kanti 虽然 Saheed 是对的,但我在上面偷了他的解决方案。 Sqlyog 接受反斜杠可能是由于 SQL 解析中的一些黑客行为。
【解决方案3】:

尝试一次

select * from dummy_tbl where name like \\'Test\\';

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 2016-10-25
    • 2013-11-20
    • 2016-07-07
    • 2015-01-22
    • 2018-04-26
    • 2012-07-20
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多