java替换';使用\';

java替换';使用\';,java,mysql,replace,Java,Mysql,Replace,我正在使用mySQL。它无法处理添加到数据库的字符串中是否有“ 我试过: replaceAll("'","\\'") 及 你知道如何用\'替换'吗?你需要两次转义反斜杠,一次用于字符串处理引擎,一次用于正则表达式引擎: replaceAll("'","\\\\'") 警告:虽然这回答了如何在字符串中插入反斜杠的问题,但它肯定不应该用于阻止SQL注入攻击 澄清:假设有人提交了一个字符串,其中撇号已经转义。这个正则表达式将导致撇号被取消转义(因为现在反斜杠将被转义)。所以实际上,只有在前面有偶

我正在使用mySQL。它无法处理添加到数据库的字符串中是否有

我试过:

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


你知道如何用
\'
替换
'
吗?

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

replaceAll("'","\\\\'")
警告:虽然这回答了如何在字符串中插入反斜杠的问题,但它肯定不应该用于阻止SQL注入攻击

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

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

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注入攻击。如果使用不同的参数多次执行同一查询,也会提高效率


有关详细信息,请参阅。

我认为您真正的问题是在运行时动态构建SQL查询,而不是使用
PreparedStatement
。请在插入数据库的位置显示更多代码,很可能根本不需要手动转义。我不知道PreparedStatement是什么。我只是在创建一个simple网页。请查看下面JB Nizet的答案,他给出了示例代码以及JDBC教程相关部分的链接。这很重要--
PreparedStatement
几乎总能产生更安全、更干净、更快的代码。是的,听起来不错。我只是浏览了一下。我正在将其添加为书签,稍后将阅读。谢谢An请密切注意这里所说的话。如果你在做听起来像做的事情,你的网站很容易受到SQL注入攻击的攻击。这可能是一个知识渊博的人(ab)用户可以对您的数据库运行任意SQL—包括获取潜在的敏感详细信息和/或删除您的所有数据。无意冒犯,这显然回答了问题,但我认为它只适用于实际问题:)@PhilippReichart:我同意,我认为JB Nizet的回答应该被接受。
String sql = "select a.foo from a where a.bar = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, aStringWhichMightContainQuotes);
ResultSet rs = stmt.executeQuery();