Предотвращение SQL-инъекций в PHP

Если пользовательский ввод вставляется в SQL-запрос без проверки, то приложение становится уязвимым для атак SQL-инъекций, как в примере ниже:

$variable = $_POST['input_utilisateur']; 

mysql_query("INSERT INTO 'table' ('column') VALUES ('$variable')");
В этом примере пользователь может ввести  значение»); DROP TABLE table;--') . Запрос становится таким:

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'); 

$statement-> execute(array('name' => $nom));

foreach ($statement как $row) {
// сделать что-нибудь
}
2- Использование MySQLi:

$statement = $dbConnection-> prepare('SELECT * FROM administrator WHERE name = ?'); 
$statement-> bind_param('s', $nom);

$statement-> execute();

$result = $statement-> get_result();
while ($row = $result-> fetch_assoc()) {
// сделать что-нибудь
}
3- С помощью метода PHP mysql_real_escape_string
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