java替换'with \'

use*_*278 3 java mysql replace

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

我试过了:

replaceAll("'","\\'") 
Run Code Online (Sandbox Code Playgroud)

replaceAll("'","\'")
Run Code Online (Sandbox Code Playgroud)

'\'什么想法我会如何替换?

JB *_*zet 17

不要使用String替换来处理此问题.相反,使用预准备语句,从而让JDBC驱动程序为您转义参数:

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

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

有关更多信息,请参阅JDBC教程.


Tim*_*ker 7

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

replaceAll("'","\\\\'")
Run Code Online (Sandbox Code Playgroud)

警告:虽然这回答了关于如何在字符串中插入反斜杠的问题,但它当然不应该用于试图阻止SQL注入攻击.

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

replaceAll("(?<!\\\\)((?:\\\\\\\\)*)'", "$1\\\\'")
Run Code Online (Sandbox Code Playgroud)

这种情况正在迅速变得像它看起来一样难以维持,但它仍然不能涵盖所有情况.

  • @PhilippReichart:我同意,在我看来JB Nizet的答案应该被接受. (5认同)