Предотвращение внедрения SQL-кода в пользовательское SQL-регулярное выражение - PullRequest
3 голосов
/ 19 октября 2008

Я создаю сайт, где, к сожалению, пользователь должен предоставить регулярное выражение для использования в предложении MySQL WHERE. И, конечно, я должен проверить вводимые пользователем данные, чтобы предотвратить внедрение SQL. Сайт сделан на PHP, и я использую следующее регулярное выражение для проверки моего регулярного выражения:

/^([^\\\\\']|\\\.)*$/

Это двойное экранирование из-за способа обработки регулярных выражений в PHP. Предполагается, что он должен работать только с безопасными регулярными выражениями без неэкранированных одинарных кавычек. Но будучи в основном самоучкой, я хотел бы знать, является ли это безопасным способом сделать это.

Ответы [ 3 ]

9 голосов
/ 19 октября 2008

Если вы используете подготовленные операторы, SQL-инъекция будет невозможна. Вы всегда должны использовать подготовленные заявления.

Роборг делает отличное замечание о дорогих регулярных выражениях.

2 голосов
/ 19 октября 2008

Вы должны просто передать строку через mysql_escape_string или mysql_real_escape_string .

Хотя я бы с осторожностью принял любое старое регулярное выражение - некоторые из них могут работать долго и будут связывать ваш сервер БД.

С Синтаксис шаблона :

Остерегайтесь шаблонов, которые содержат вложенные неопределенные повторы. Это может занять долго бегать применительно к строка, которая не соответствует. Рассматривать фрагмент шаблона (а +) *

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

0 голосов
/ 19 октября 2008

Если это только для целей отображения этого выражения reg, то большинство программ просто Html кодируют значение и сохраняют в БД, а затем декодируют при выходе. Опять же, только для целей отображения, хотя, если вам нужно использовать отправленный reg exp, это не сработает.

Также известно, что существует метод, при котором человек, намеревающийся сделать инъекцию, записывает туда SQL, преобразует его в varbinary и отправляет команду exec с представлением base 64 запроса, с которым я сталкивался в прошлом.

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