Если введённые пользователем данные вставляются непосредственно в SQL запрос, то приложение становится уязвимым к SQL Injection.
Пример php кода, который уязвим к sql инъекциям:
$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')");
Вопрос: как предотвратить SQL инъекции в PHP?
Ответ: нужно использовать современные драйверы для работы с mysql, такие как PDO и MySQLi.
Так-же, нужно использовать подготовленные запросы или запросы с параметрами. Это SQL выражения, которые обрабатываются сервером базы данных отдельно от каких либо параметров. Таким образом, злоумышленник лишается возможности внедрить вредоносный SQL код.
Пример безопасного способа выполнения SQL запроса с использованием драйвера PDO:
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute(array(':name' => $name));
foreach ($stmt as $row) {
//Обработка результатов
}
Пример с использованием драйвера MySQLi:
$stmt = $dbConnection->prepare('SELECT * FROM users WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// Обработка результатов
}
У подготовленных запросов есть одно важное преимущество: при многократном использовании подготовленного запроса в рамках одной сессии он разбирается и компилируется один раз. Это даёт небольшое преимущество в скорости. Думаю теперь всем понятно как предотвратить SQL инъекции в PHP.