Следует ли указывать числа из пользовательского ввода в запросах MySQL, чтобы избежать атак внедрения SQL-кода? - PullRequest
0 голосов
/ 07 июня 2011

Должны ли числа из пользовательского ввода указываться в запросах MySQL, чтобы избежать атак с использованием SQL-инъекций?

Скажем, у меня на странице есть форма с указанием чьего-либо возраста.Они вводят свой возраст и нажимают «отправить».Следующий php-код имеет дело с отправкой формы: (age - это поле int в таблице db.)

$Number = mysqli_real_escape_string($dbc, $_POST["age"]);
$Query = "INSERT INTO details (age) VALUES ($Number)";
$Result = mysqli_query($dbc, $Query);

Вместо этого можно получить что-нибудь, чтобы заключить пользовательский ввод в одинарные кавычки,хотя это не строка?Примерно так:

...
$Query = "INSERT INTO details (age) VALUES ('$Number')";  <-- quotes
...

А как насчет выполнения SELECT?Является ли это:

$ID = mysqli_real_escape_string($dbc, $_POST["id"]);
$Query = "SELECT * FROM users WHERE id = '$ID'";
$Result = mysqli_query($dbc, $Query);

лучше, чем:

$ID = mysqli_real_escape_string($dbc, $_POST["id"]);
$Query = "SELECT * FROM users WHERE id = $ID";      <-- no quotes
$Result = mysqli_query($dbc, $Query);

ПРИМЕЧАНИЕ. Мне известны подготовленные операторы, и я обычно использую их вместо объединения строк, но это устаревший кодЯ имею дело сЯ хочу обеспечить его как можно лучше.

Ответы [ 3 ]

3 голосов
/ 07 июня 2011

Если вы добавляете числа, используйте функции intval / floatval, не используйте для них mysql_real_escape_string.

Для всего, для чего вы используете mysql_real_escape_string, вы должны использовать кавычки, например:

$input = "foo'bar";
$input = mysql_real_escape_string($input);
//foo\'bar
mysql_query("SELECT $input");
//SELECT foo\'bar
//which is still an SQL syntax error.
1 голос
/ 07 июня 2011

Вы действительно должны использовать sprintf, даже если в унаследованном коде на изменение уходит 2 минуты, и, на мой взгляд, оно того стоит.

Бесстыдно сорвано с php.net:

// Formulate Query
// This is the best way to perform an SQL query
// For more examples, see mysql_real_escape_string()
$query = sprintf("SELECT firstname, lastname, address, age FROM friends 
                 WHERE  firstname='%s' AND lastname='%s'",
                 mysql_real_escape_string($firstname),
                 mysql_real_escape_string($lastname));

// Perform Query
$result = mysql_query($query);

Ваш запрос теперь в значительной степени защищен от передачи неправильных типов в его поля и символы без экранирования.

0 голосов
/ 08 июня 2011

Вы ДОЛЖНЫ использовать фильтры PHP и фильтры для чисел - даже для диапазонов, регулярных выражений;со значениями по умолчанию, NULL при ошибке и т. д.

http://hu.php.net/manual/en/ref.filter.php

, если значения получены из переменной запроса, например, $ _POST, см .:

http://hu.php.net/manual/en/function.filter-input.php

...