Java заменить "с \" - PullRequest
       25

Java заменить "с \"

4 голосов
/ 11 марта 2012

Я работаю с MySQL. Он не может обработать, если ' находится в строке, которая добавляется в базу данных.

Я пытался:

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

и

replaceAll("'","\'")

Есть идеи, как мне заменить ' на \'?

Ответы [ 2 ]

18 голосов
/ 11 марта 2012

Не используйте строковые замены, чтобы справиться с этим. Вместо этого используйте подготовленный оператор и, таким образом, позвольте драйверу 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 .

8 голосов
/ 11 марта 2012

Вам необходимо дважды экранировать обратную косую черту, один раз для механизма обработки строк и один раз для механизма регулярных выражений:

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

Предупреждение: Пока это отвечает на вопрос о том, как вставитьобратная косая черта в строку, она, конечно, не должна использоваться в попытке предотвратить атаки с использованием SQL-инъекций.

Для пояснения: представьте, что кто-то отправляет строку, в которой апостроф уже экранирован .Это регулярное выражение приведет к тому, что апостроф будет неоткрытым (потому что теперь обратный слеш станет экранированным).Так что на самом деле вам понадобится это регулярное выражение, чтобы избежать апострофа, только если ему предшествует четное число обратных косых черт.Это означает, что

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

Это быстро становится столь же неуправляемым, как кажется, и все еще не охватывает все случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...