Java 替换单引号为反斜杠+单引号。

3

我正在使用MySQL。 如果在要添加到数据库中的字符串中包含',它将无法处理。

我尝试过:

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

replaceAll("'","\'")

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


我认为您真正的问题是在运行时动态构建SQL查询,而不是使用PreparedStatement。请展示更多插入到数据库中的代码,很可能根本不需要手动转义。 - Philipp Reichart
我不知道PreparedStatement是什么。我只是在创建一个简单的网页。 - user1163278
请查看JB Nizet的下面的答案,他提供了示例代码以及JDBC教程相关部分的链接。这很重要--PreparedStatement几乎总是会产生更安全、更清洁和更快速的代码。 - Philipp Reichart
1
是的,听起来不错。我刚刚浏览了一下。我会将其加入书签,并稍后阅读。谢谢,伙计。 - user1163278
2
请认真注意这里所说的内容。如果你正在做听起来像的事情,那么你的网站很容易受到 SQL 注入攻击的威胁。有经验的黑客可以对你的数据库运行任意 SQL 代码,包括获取潜在敏感信息和/或删除所有数据。 - dty
2个回答

17

不要使用字符串替换来处理此操作。相反,使用预编译语句,让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教程


7

你需要对反斜杠进行两次转义,一次是为了字符串处理引擎,一次是为了正则表达式引擎:

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

注意:虽然这个回答解决了如何在字符串中插入反斜杠的问题,但绝不能用于试图防止SQL注入攻击。

为了澄清:想象一下,有人提交了一个已经转义了的单引号的字符串。这个正则表达式将导致单引号被取消转义(因为现在反斜杠会变成转义的)。所以,如果要在一个偶数个反斜杠之前转义一个单引号,实际上需要使用这个正则表达式。

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

这已经变得跟看起来一样难以维护,而且还不能覆盖所有情况。


1
没有冒犯的意思,这显然回答了问题,但我认为它只是在解决实际问题周围运作 :) - Philipp Reichart
5
我同意,我认为JB Nizet的答案应被接受。 - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接