Предотвращение SQL-инъекций в PHP
Если пользовательский ввод вставляется в SQL-запрос без проверки, то приложение становится уязвимым для атак SQL-инъекций, как в примере ниже:$variable = $_POST['input_utilisateur'];В этом примере пользователь может ввести значение»); DROP TABLE table;--') . Запрос становится таким:
mysql_query("INSERT INTO 'table' ('column') VALUES ('$variable')");
mysql_query("INSERT INTO 'table' ('column') VALUES('value'); DROP TABLE table;--')
Цель хакера — модифицировать SQL-запрос таким образом, чтобы он мог прочитать скрытую информацию или выполнить любую другую операцию (чтение, изменение, удаление). В этом примере таблица удалена из базы данных.
Этот тип уязвимости является наиболее распространенным и опасным, и если ваш код небезопасен, риск будет огромным.
Решением проблемы уязвимостей SQL-инъекций является использование подготовленные запросы или параметризованные запросы. Готовясь к выполнению, запрос отправляется на сервер базы данных и выполняет проверку синтаксиса. С помощью этого метода хакер не сможет внедрить вредоносный SQL.
Для этого у вас есть три варианта:
1- Использование PDO:
$statement = $pdo-> prepare('SELECT * FROM administrator WHERE name = :name');2- Использование MySQLi:
$statement-> execute(array('name' => $nom));
foreach ($statement как $row) {
// сделать что-нибудь
}
$statement = $dbConnection-> prepare('SELECT * FROM administrator WHERE name = ?');3- С помощью метода PHP mysql_real_escape_string
$statement-> bind_param('s', $nom);
$statement-> execute();
$result = $statement-> get_result();
while ($row = $result-> fetch_assoc()) {
// сделать что-нибудь
}
PHP имеет свой метод исправления этой уязвимости, но следует отметить, что предыдущие два метода более эффективны. mysql_real_escape_string принимает строку, которая будет использоваться в запросе MySQL, и возвращает ту же строку символов, экранированную из любой SQL-инъекции. Quotas(') заменяются на \'. Эта функция требует, чтобы вы уже были подключены к базе данных, чтобы использовать ее.
$nom = "' OR 1'";
$nom = mysql_real_escape_string($nom);
$query = "SELECT * FROM administrator WHERE name = '$nom'";
echo "Предотвращена инъекция: < бр />" . $query. "< br />";
$name_vul = "'; DELETE FROM administrator WHERE 1 или name = '";
$name_vul = mysql_real_escape_string($name_vul);
$query_vul = "SELECT * FROM administrator WHERE name = '$nom'";
echo "Предотвращена инъекция: < бр />" . $query_vul;
Ссылки:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php