我正在使用MySQL。 如果在要添加到数据库中的字符串中包含'
,它将无法处理。
我尝试过:
replaceAll("'","\\'")
和
replaceAll("'","\'")
有什么想法可以替换 '
为 \'
吗?
不要使用字符串替换来处理此操作。相反,使用预编译语句,让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教程。
你需要对反斜杠进行两次转义,一次是为了字符串处理引擎,一次是为了正则表达式引擎:
replaceAll("'","\\\\'")
注意:虽然这个回答解决了如何在字符串中插入反斜杠的问题,但绝不能用于试图防止SQL注入攻击。
为了澄清:想象一下,有人提交了一个已经转义了的单引号的字符串。这个正则表达式将导致单引号被取消转义(因为现在反斜杠会变成转义的)。所以,如果要在一个偶数个反斜杠之前转义一个单引号,实际上需要使用这个正则表达式。
replaceAll("(?<!\\\\)((?:\\\\\\\\)*)'", "$1\\\\'")
这已经变得跟看起来一样难以维护,而且还不能覆盖所有情况。
PreparedStatement
。请展示更多插入到数据库中的代码,很可能根本不需要手动转义。 - Philipp ReichartPreparedStatement
几乎总是会产生更安全、更清洁和更快速的代码。 - Philipp Reichart