2010-01-02 2 views
0

Я хотел бы регулярное выражение, которое сделало бы это:Regex для удвоения одинарных кавычек в строке

VALUES('Hit 'n Run') 

в

VALUES('Hit ''n Run') 

Возможно ли это?

+6

Используя регулярное выражение, чтобы избежать должным образом избежать динамического SQL? плохая идея –

+0

Так ответьте и скажите ему, где найти рутину для этой работы? – bmargulies

+0

Как я узнаю, какой апостроф является завершающим апострофом? Могу ли я рассчитывать ('и') на начало и конец шаблонов? (знание SQL я обычно не могу вообще, но это ваш код) – slebetman

ответ

4

Нет, это невозможно. Если у вас есть VALUES('Hit 'n Run'), у вас уже есть недопустимая смесь разметки апострофов и буквальных апострофов. Обработка струн подобна смешиванию сахара и соли: как только вы смешиваете контексты без надлежащего ухода, нет способа оттянуть их назад.

Если вы пытаетесь спасти сломанные данные, вы можете попробовать что-то вроде (?<!\()'(?!\)), чтобы соответствовать апострофам, у которых нет скобки рядом с ними. Это слабая и легко обманутая тактика, но для простых данных она может работать.

Если вы ставите вместе динамических запросов SQL вы должны спасаясь от 'до того вы положили его в строку запроса, либо с помощью простой строки замены ' с '', если вы уверены, что это единственный побег вашей СУБД требует, или - намного лучше - используя специальную функцию SQL-string-literal-escaping, соответствующую вашей СУБД. Вполне возможно, что эта функция будет зависеть от того, на какой платформе (языке, СУБД) вы говорите.

+0

Я понял, но я думал, что сначала проверю. У меня много строк sql, которые не экранированы, и все они отправляются методу «выполнить». Поэтому я решил, что смогу сэкономить время, просто избежав этого параметра. Ну, тогда нечего делать. – ErikTJ

+1

Или * намного больше * делать в зависимости от того, как вы на это смотрите. Я не уверен, какой язык/фреймворк вы используете, но рефакторинг этого кода для использования параметризованных запросов может стоить усилий. – Josh

+0

Методы, которые строят запрос, принимают объект как параметр и извлекают из него данные. Нечего делать, я на самом деле не имел в виду ничего, кроме как избежать каждого метода. – ErikTJ

2

Любой шаблон, который может быть выражен в RegEx, затем может быть использован для создания проблем с SQL-инъекциями, которые вы пытаетесь избежать.

Пример грязного ввода:

VALUES(');DELETE * FROM customer;SELECT ' 
+0

На самом деле, я не избегаю этого. Это частное приложение для домашнего использования. Таким образом, единственное, что было бы саботировать, сделав это сам. – ErikTJ

+0

* Двухсотлетний человек * был хорошим фильмом, но на самом деле вы можете использовать «я» и «я» онлайн. :) – 2010-01-02 16:05:27