Этот SQL-запрос уязвим для инъекций? - PullRequest
2 голосов
/ 02 апреля 2011
$column = $_GET['id'];
$result = mysql_query("SELECT $column FROM table");
echo $result;

Я создаю веб-сайт с помощью mysql и поэтому пытаюсь узнать об инъекциях sql. Я предполагаю, что этот код уязвим, но я не могу сделать рабочую эксплойт. Как бы я вытащил столбец "здесь" из таблицы "example2"?

Спасибо

Ответы [ 4 ]

6 голосов
/ 02 апреля 2011

Представьте, что $ _GET ['id'] было равно примерно этому

* FROM anytable_i_want; -- 

двойной перенос означает, что остальная часть вашей строки - комментарий ... так что теперь выполняемый вами sql:

SELECT * FROM anytable_i_want;

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

$HANDLE = $PDO->prepare('SELECT ? FROM mytable');
$HANDLE->execute(array($_GET['id']));

теперь независимо от того, что было отправлено как $ _GET ['id'], оно не будет иметь каких-либо странных эффектов.

mysql_real_escape_string покроет вас, если вы будете использовать мое семейство функций mysql_, хотя существует дикий эксплойт, которому вы можете подвергнуться, если вы измените кодировку во время выполнения.

3 голосов
/ 02 апреля 2011

Взгляните на PDO и использование подготовленных операторов для предотвращения SQL-инъекций:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

1 голос
/ 02 апреля 2011

, если следующий текст был передан как $ _GET ['id'], у вас будет эксплойт:

$_GET['id'] = '[other sql commands here]';

используйте либо mysql_real_escape_string(), либо mysqli_real_escape_string() (есливы используете улучшенный интерфейс)

1 голос
/ 02 апреля 2011

сделать столбец $ примерно таким:

" here FROM example2 -- "
...