💉 SQL-инъекция: что такое и с чем едят?



SQL-инъекция
- это атака, которая может привести к компрометации конфиденциальных данных и даже полному захвату системы.



Разрабам и сисадминам важно знать об этой угрозе и принимать меры по ее предотвращению. Использование подготовленных инструкций с параметризованными запросами, проверка и очистка входных данных, а также регулярные проверки безопасности могут значительно снизить риск успешной атаки.



— Вот пример кода, уязвимого для SQL-инъекций:



<?php

$username = $_POST[“username”];

$password = $_POST[“password”];



$query = “SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password'”;

$result = mysqli_query($connection, $query);



if (mysqli_num_rows($result) > 0) {

// login successful

} else {

// login failed

}

?>



В этом примере PHP-скрипт пытается аутентифицировать пользователя, сверяя имя пользователя и пароль с записями в таблице «‎users»‎.



❗️ Проблема с этим кодом заключается в том, что он напрямую включает пользовательский ввод ($username и $password) в SQL-запрос без его надлежащей проверки или очистки. Это означает, что в случае инъекции в поля имени пользователя и пароля, он может привести к выполнению непреднамеренных команд.



👁 Например, можно ввести в поле username: admin' --, что привело бы к тому, что запрос стал бы:



SELECT * FROM users WHERE username = ‘admin’ –‘ AND password = ‘whatever_password_entered’



Этот запрос закомментировал бы остальную часть запроса, минуя проверку пароля, следовательно, атака прошла бы успешно.



— Чтобы устранить эту уязвимость, вводимые пользователем данные должны быть проверены и обработаны, а для построения SQL-запроса следует использовать инструкции с параметризованными запросами, выглядеть это будет примерно так:



$stmt = $connection->prepare(“SELECT * FROM users WHERE username = ? AND password = ?”);

$stmt->bind_param(“ss”, $username, $password);

$stmt->execute();b



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



#SQL #Injection