Найдите уязвимость и предложите безопасный способ исправления в этом фрагменте PHP-кода: $query = "SELECT * FROM users WHERE id = " . $_GET['id']; $res = mysqli_query($conn, $query); ; какие ещё уязвимости стоит учесть при работе с вводом пользователей

10 Окт в 13:32
5 +5
0
Ответы
1

Главная уязвимость — SQL‑инъекция. В текущем коде значение из GETподставляетсявSQLбезпроверкиилипараметризации,злоумышленникможетпередать,например,id=1OR1=1иполучить/повредитьданные.</p><p>Какбезопасноисправить(рекомендуемыйспособ—подготовленныевыражения):</p><p>Примерсmysqli(рекомендуемое):</p><pre><code>_GET подставляется в SQL без проверки или параметризации, злоумышленник может передать, например, id=1 OR 1=1 и получить/повредить данные.</p><p>Как безопасно исправить (рекомендуемый способ — подготовленные выражения):</p><p>Пример с mysqli (рекомендуемое):</p><pre><code>G ETподставляетсявSQLбезпроверкиилипараметризации,злоумышленникможетпередать,например,id=1OR1=1иполучить/повредитьданные.</p><p>Какбезопасноисправить(рекомендуемыйспособподготовленныевыражения):</p><p>Примерсmysqli(рекомендуемое):</p><pre><code>id = filter_inputINPUTGET,′id′,FILTERVALIDATEINTINPUT_GET, 'id', FILTER_VALIDATE_INTINPUTG ET,id,FILTERV ALIDATEI NT;
if ($id === false || $id === null) {
// обработать некорректный id
http_response_code400400400;
exit′Invalidid′'Invalid id'Invalidid;
}
stmt=stmt = stmt=conn->prepare′SELECTid,username,emailFROMusersWHEREid=?′'SELECT id, username, email FROM users WHERE id = ?'SELECTid,username,emailFROMusersWHEREid=?;
if (!$stmt) { /* обработать ошибку подготовки */ }
$stmt->bind_param('i', $id);
$stmt->execute;
res=res = res=stmt->get_result;
// обработка res</code></pre><p>Быстрый,номенееуниверсальныйхак(толькоеслиidвсегдацелое):</p><pre><code>res</code></pre><p>Быстрый, но менее универсальный хак (только если id всегда целое):</p><pre><code>res</code></pre><p>Быстрый,номенееуниверсальныйхак(толькоеслиidвсегдацелое):</p><pre><code>id = intintint GET[′id′];//принудительноприводимкint_GET['id']; // принудительно приводим к int
G ET[id];//принудительноприводимкint
query = "SELECT id, username, email FROM users WHERE id = {$id}";
$res = mysqli_query($conn, $query);

Этот вариант предотвращает SQL‑инъекцию для числового id, но лучше всё же использовать подготовленные выражения.

Альтернатива с PDO:

id=filterinput(INPUTGET,′id′,FILTERVALIDATEINT);id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
id=filteri nput(INPUTG ET,id,FILTERV ALIDATEI NT);
stmt = $pdo->prepare('SELECT id, username, email FROM users WHERE id = ?');
$stmt->execute([$id]);
user=user = user=stmt->fetchPDO::FETCHASSOCPDO::FETCH_ASSOCPDO::FETCHA SSOC;

При использовании PDO отключите эмуляцию подготовленных выражений: $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Другие уязвимости и практики безопасности при работе с вводом пользователя:

XSS (cross-site scripting) — всегда экранируйте данные при выводе в HTML (htmlspecialchars(..., ENT_QUOTES, 'UTF-8')).CSRF — защищайте формы/запросы CSRF‑токенами для действий, изменяющих состояние.Правильная валидация и белые списки — проверяйте типы, длину и допустимые символы; предпочтительно allowlist.Контекстное экранирование — разное экранирование для HTML, JavaScript, URL, SQL, shell и т.п.Ограничение прав БД — аккаунт БД должен иметь минимальные привилегии (только нужные операции/таблицы).Не выводите подробные системные ошибки пользователю — логируйте их, но показывайте общие сообщения.Защита от brute‑force и DoS — rate limiting, CAPTCHAs, блокировка IP.Защита файловых операций — валидация путей, защита от path traversal, контроль загружаемых типов и размеров.Защита командной оболочки — никогда не подставляйте пользовательские данные в shell без escapeshellarg.HTTPS, secure cookies, HttpOnly, SameSite — безопасные настройки сессий и передачи.Учет уязвимостей типа IDOR — проверяйте права доступа к ресурсам, а не только наличие id.Ограничение SELECT * — выбирайте только нужные столбцы.Логирование и мониторинг — отслеживайте подозрительную активность.

Вывод: используйте подготовленные запросы (parameterized queries), строгую серверную валидацию и контекстное экранирование при выводе, минимизируйте привилегии и не доверяйте данным от клиента.

10 Окт в 14:13
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир