Достаточно ли mysql_real_escape_string () для MySQL REGEXP? - PullRequest
1 голос
/ 25 июня 2011

Может ли быть выбран $user_input в следующем коде, чтобы запрос MySQL не вел себя должным образом?

<?
$regexp = mysql_real_escape_string( $user_input );
mysql_query( "SELECT col FROM table WHERE col REGEXP \"$regexp\"" );
?>

Я не могу использовать подготовленные операторы, поскольку строку SQL нужно немного обойти.

Редактировать: добавлю, что я уже знаю о регулярных выражениях DoSатаки.

Ответы [ 2 ]

4 голосов
/ 25 июня 2011

Этот запрос:

mysql_query("SELECT col FROM table WHERE col REGEXP '$regexp'");

нельзя подорвать, чтобы сделать что-то, кроме SELECT (я заменил двойные кавычки на одинарные, поскольку double - это расширение только для mysql).

Однако, если само регулярное выражение не находится под вашим непосредственным контролем, пользователь может выбрать что-нибудь с ним - вы должны рассмотреть возможность возникновения проблемы.

3 голосов
/ 25 июня 2011

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

Вы были бы более эффективными (и безопасными), если бы вы передали хотя бы $ link_identifier, потому что PHP должен знать кое-что о базе данных для правильного экранирования (например, кодирование). Так что эта функция не просто экранирует строку, но просит mysql как правильно сделать это.

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

...