SQL-инъекция - это (oneliner) безопасно? - PullRequest
5 голосов
/ 15 августа 2010

PHP:

$SQL = "SELECT goodies FROM stash WHERE secret='" .  
    str_replace("'",'',$_POST['secret']) .  
"'";  

Может ли злой гений-хакер ввести SQL в мой SELECT - Как?

Ответы [ 4 ]

14 голосов
/ 15 августа 2010

Почему вы не будете использовать mysql_real_escape_string () или даже лучше подготовленные операторы?Ваше решение кажется глупым.

6 голосов
/ 15 августа 2010

Некоторое время я об этом думал, и я не вижу способа вставить 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-инъекций.

0 голосов
/ 15 августа 2010

Может быть.Лучший способ это:

$query = sprintf("SELECT goodies FROM stash WHERE secret='%s'",
addcslashes(mysql_real_escape_string($_POST['secret']),'%_'));
0 голосов
/ 15 августа 2010

Почему просто не использовать mysql_escape_string?И да, он мог бы, добавив " вместо ' и плюс, этот запрос даст вам ошибку, я думаю.

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