Использование php filter_var с mysql_real_escape_string

Я хотел бы начать свой вопрос, сказав: я понимаю, что PDO/mysqli является новым стандартом и широко освещается на SO. Однако в этом конкретном случае у меня нет времени для преобразования всех запросов в PDO перед запуском сайта клиентов.

В большинстве запросов на сайте использовалось следующее (не я могу добавить)

  $userEmail = filter_var($_POST['fEmail'], FILTER_SANITIZE_EMAIL);
   $userEmail = mysql_real_escape_string($userEmail);
   $sql ="SELECT email FROM members WHERE email = '$userEmail'";
   :
   :

Я хотел бы знать:

Хорошо ли/нормально использовать filter_var и mysql_real_escape_string вместе, как в примере выше? Моя основная проблема заключается в том, могут ли эти две функции использоваться вместе или вызвать какой-то конфликт/ошибку при выполнении/выгрузке в БД?

Также есть какая-то польза от использования обоих?

Заранее спасибо

Ответы

Ответ 1

Санитация строки служит для того, чтобы она соответствовала определенным ожиданиям. FILTER_SANITIZE_EMAIL удаляет любые символы из строки, которая недействительна в письме. Результат (предположительно) гарантированно соответствует синтаксису адреса электронной почты. Как полезно случайным образом удалять символы из строки, я оставлю вам. (Подсказка: я не думаю, что это очень полезно вообще, вам лучше отклонить недействительные адреса, чем преобразовать их в случайные результаты. Я даю вам недействительный адрес электронной почты, вы забиваете его в какую-то форму, похожую на адрес электронной почты, теперь как Знаете ли вы, что сможете отправить мне письмо...?!)

mysql_real_escape_string существует, чтобы гарантировать, что произвольная строка не нарушает синтаксис строкового литерала SQL, избегая всех достойных escape-символов. Предполагая, что вы используете его правильно (много ошибок в mysql есть, поэтому он устарел...), вы ничего не можете сделать с его входом, который бы сработал. Вы даете ему любую произвольную строку, она возвращает вам escape-версию, период.

Как таковой, в общем, да, то, что вы делаете, прекрасно. Если mysql_real_escape_string - это последнее, что вы делаете со своей строкой, прежде чем интерполировать ее в строковый литерал SQL, тогда это хорошо.

Ответ 2

В этом случае, если фильтр не выполняется, запрос будет выглядеть следующим образом:

SELECT email FROM members WHERE email = '0'

Итак, не стоит беспокоиться о запросе; он просто не вернет никаких результатов.

Если, конечно, у вас есть аналогичный запрос на вставку/обновление.

В этом случае у вас может быть много строк в базе данных, где электронное письмо '0'

Ответ 3

Использование обоих в порядке, но то, что вы действительно должны делать, - это не использовать mysql_ вообще. Вместо этого следует использовать PDO или mysqli_ с подготовленными инструкциями, чтобы избежать инъекции SQL.

См. Как я могу предотвратить SQL-инъекцию в PHP?

Или для руководства по переключению на MySQLi см. Могу ли я вслепую заменить все функции mysql_ на mysqli_?

Ответ 4

Ваша основная забота - это устаревший подход, который оставляет ваш клиентский сайт уязвимым для атаки SQL-инъекций. Рассматривая эту мелочь вопроса использования еще одной нерелевантной функции, не о чем беспокоиться.