Использование 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 вместе, как в примере выше? Моя основная проблема заключается в том, могут ли эти две функции использоваться вместе или вызвать какой-то конфликт / ошибку при выполнении / выгрузке в БД?

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

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

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

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

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

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

 SELECT email FROM members WHERE email = '0' 

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

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

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

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

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

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

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