@andry33822

SQL Инъекция авторизации?

Доброе утро,
Ночью столкнулся с уязвимостью SQL injection,
При вводе в форму логина text' OR 1=1 # ///
Меня авторизирует без каких либо проблем, подскажите как мне пофиксить данную проблему, как меры предпринять?
<?php
    session_start();
    include('inc/cfg.php');
    if (isset($_POST['login'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $query = $dbh->prepare("SELECT * FROM users WHERE username=:username");
        $query->bindParam("username", $username, PDO::PARAM_STR);
        $query->execute();
        $result = $query->fetch(PDO::FETCH_ASSOC);        
        if (!$result) {
            echo '<p class="error">Неверные пароль или имя пользователя!</p>';
        } else {
            if (password_verify($password, $result['password'])) {
                $_SESSION["username"] = $_POST["username"];  
                            echo '<p class="success">Поздравляем, вы прошли авторизацию!</p>';
            } else {
                echo '<p class="error">неверный пароль </p>';
            }
        }
    }
?>
  • Вопрос задан
  • 163 просмотра
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Даже если представить, что ваше подготовленное выражение пропускает инъекцию (это не так), то вас не может "авторизовывать без каких-либо проблем", потому что запросом вы проверяете наличие логина в БД и получаете оттуда хэш пароля. Чтобы успешно авторизоваться вы должны ещё правильно ввести пароль пользователя, который с этой "инъекцией" выбирается первым. И в этом случае инъекция сводится к "узнать логин первого пользователя в таблице", что, согласитесь, неприятно, но не сильно значительно, если у пользователя при этом сложный пароль, который долго брутить.

Ваша проблема в каком-то другом коде.
Ответ написан
Комментировать
@andry33822 Автор вопроса
Действительно. Проблема была не в авторизации,
Если пользователь ранее входил в аккаунт. и выполнил sql injection то его пропустит, что тоже странно, так как сессия удаляется после выхода с аккаунта:
session_start();
unset($_SESSION['username']);
session_destroy();
header('Location: index.php');
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@VadimFox


P.S. Пробежался еще раз по коду и могу сказать что солидарен с Алексей Уколов, смотрите дальше, проверяйте все точки взаимодействия с сессией
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 сент. 2022, в 20:47
1000000 руб./за проект
29 сент. 2022, в 20:45
110000 руб./за проект
29 сент. 2022, в 20:45
4000 руб./за проект