【问题标题】:java replace ' with \'java用\'替换'
【发布时间】:2012-03-28 02:17:17
【问题描述】:

我正在使用 mySQL。如果' 在要添加到数据库的字符串中,则无法处理。

我试过了:

replaceAll("'","\\'") 

和

replaceAll("'","\'")

有什么想法可以用\' 替换' 吗?

【问题讨论】:

  • 我认为您真正的问题是在运行时动态构建 SQL 查询,而不是使用 PreparedStatement。请在插入数据库的位置显示更多代码,很可能根本不需要手动转义。
  • 我不知道 PreparedStatement 是什么。我只是在创建一个简单的网页。
  • 请查看下面 JB Nizet 的答案,他提供了示例代码以及 JDBC 教程相关部分的链接。这很重要——PreparedStatement 几乎总能产生更安全、更干净和更快的代码。
  • 是的,听起来不错。我只是浏览了一下。我正在为它添加书签,稍后将继续阅读。谢谢大佬
  • 密切关注这里所说的内容。如果您按照听起来的方式行事,那么您的网站很容易受到 SQL 注入攻击的攻击。知识渊博的 (ab) 用户可以对您的数据库运行任意 SQL,包括获取潜在的敏感详细信息和/或删除您的所有数据。

标签: java mysql replace


【解决方案1】:

您需要对反斜杠进行两次转义,一次用于字符串处理引擎,一次用于正则表达式引擎:

replaceAll("'","\\\\'")

警告:虽然这回答了有关如何在字符串中插入反斜杠的问题,但肯定不应该使用它来阻止 SQL 注入攻击。

澄清一下:假设有人提交了一个字符串,其中撇号已被转义。这个正则表达式将导致撇号被未转义(因为现在反斜杠将被转义)。所以实际上你需要这个正则表达式来转义撇号,前提是前面有偶数个反斜杠。这意味着

replaceAll("(?<!\\\\)((?:\\\\\\\\)*)'", "$1\\\\'")

这正在迅速变得像看起来那样难以维护,而且它仍然不能涵盖所有情况。

【讨论】:

  • 无意冒犯,这显然回答了问题,但我认为它只适用于实际问题:)
  • @PhilippReichart:我同意,我认为应该接受 JB Nizet 的回答。
【解决方案2】:

不要使用字符串替换来处理这个问题。相反,请使用准备好的语句,从而让 JDBC 驱动程序为您转义参数:

String sql = "select a.foo from a where a.bar = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, aStringWhichMightContainQuotes);
ResultSet rs = stmt.executeQuery();

这是拥有独立于数据库的健壮代码的正确方法,该代码不易受到 SQL 注入攻击。如果您使用不同的参数多次执行相同的查询,它也会提高效率。

请参阅JDBC tutorial 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多