Некоторое время я об этом думал, и я не вижу способа вставить SQL в это утверждение.
Строка SQL, которая начинается с одинарных кавычек, заканчивается следующей одинарной кавычкой, если она не экранирована обратной косой чертой или другой кавычкой (\'
или ''
). Поскольку вы удаляете все одинарные кавычки, двойная кавычка не может быть. Если вы выйдете из закрывающей кавычки, вы получите ошибку, но без SQL-инъекции.
Однако этот метод имеет ряд недостатков:
- Одинарные кавычки во входных данных игнорируются.
- Обратные слэши во входных данных обрабатываются неправильно - они будут обрабатываться как escape-коды.
- Вы получаете сообщение об ошибке, если последний символ является обратной косой чертой.
- Если вы позже расширите запрос, добавив второй параметр, разрешит атаку SQL-инъекцией.
Например:
$SQL = "SELECT goodies FROM stash WHERE secret='" .
str_replace("'",'',$_POST['secret']) .
"' AND secret2 = '" .
str_replace("'",'',$_POST['secret2']) .
"'";
При вызове с параметрами \
и OR 1 = 1 --
получится:
SELECT goodies FROM stash WHERE secret='\' AND secret2=' OR 1 = 1 -- '
Какой MySQL будет выглядеть примерно так:
SELECT goodies FROM stash WHERE secret='...' OR 1 = 1
Даже если в этом случае невозможно вызвать инъекцию, недостатки делают это непригодным для универсального способа избежать внедрения SQL.
Решение, как уже указывалось, заключается в использовании подготовленного утверждения. Это самый надежный способ предотвращения атак с использованием SQL-инъекций.