Подделка межсайтовых запросов (CSRF) — это тип атаки, которая происходит, когда вредоносный веб-сайт, электронная почта, блог, мгновенное сообщение или программа заставляет веб-браузер пользователя выполнять нежелательное действие на доверенном сайте, когда пользователь аутентифицирован. — Памятка OWASP по предотвращению подделки межсайтовых запросов

CSRF можно обнаружить во многих кибератаках, особенно на многих веб-сайтах социальных сетей. В этих статьях я объясняю вам, как можно предотвратить CSRF и как работают эти методы предотвращения.

Это первая часть из двух частей серии «Предотвращение подделки межсайтовых запросов». Вторую часть этой серии см.

Предотвращение подделки межсайтовых запросов (Часть вторая) — шаблон двойной отправки файлов cookie

Давайте поговорим о шаблоне токена синхронизатора.

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

Клиент отправляет этот токен с конфиденциальными данными на сервер. Когда сервер получает маркер, сервер проверяет правильность полученного маркера, проверяя, соответствует ли он маркеру, сохраненному на сервере. Если токен совпадает, сервер принимает полученные данные, а сервер отклоняет полученные данные, если токен не совпадает, выдавая сообщение об ошибке.

Демо

Чтобы продемонстрировать, как работает этот шаблон, я создал образец веб-сайта. Это простой веб-сайт, который использует шаблон токена синхронизатора и ничего более.

Сначала пользователь предоставляет страницу «Вход». Учетные данные для входа жестко закодированы, поэтому вам не нужно беспокоиться о создании учетных записей. Просто укажите имя пользователя и пароль как "admin" (без кавычек), и все готово.

При входе в систему пользователь предоставляет страницу «Пользователь». Вы можете увидеть кнопку «Удалить учетную запись» и ссылку «Выход». Здесь мы сосредоточимся на кнопке «Удалить учетную запись». Нажмите на нее и посмотрите результат.

После нажатия кнопки «Удалить учетную запись» вы можете увидеть результат о том, что ваша учетная запись удалена.

Так что ничего особенного не произошло. где тогда предотвращение CSRF?

Как известно, настоящее волшебство происходит за кулисами. Давайте посмотрим код страницы пользователя.

<body>
    <h1>Welcome Admin!</h1>
    <form method="POST" action="submit.php" id="csrf">
        <button name="param" value="delete" type="submit">Delete Account</button>
    </form>
    <a href="logout.php">Logout</a>
    <script>
    var ajax = new XMLHttpRequest();
    ajax.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            var tokenInput = document.createElement("INPUT");
            tokenInput.setAttribute("type", "hidden");
            tokenInput.setAttribute("name", "token");
            tokenInput.setAttribute("value", this.response);
            document.getElementById("csrf").appendChild(tokenInput);
        }
    };
    ajax.open("POST", "token_request.php", true);
    ajax.send();
    </script>
</body>

Здесь вы можете видеть, что есть скрипт ajax, который запускается при загрузке HTML-документа. Скрипт ajax отправляет запрос на «token_request.php», запрашивая токен CSRF. (Эта страница запрашивает токен CSRF, поскольку удаление учетной записи может рассматриваться как конфиденциальная задача.)

когда токен CSRF будет получен, он будет встроен в форму отправки (где находится «Удалить учетную запись») в виде скрытого поля. Когда пользователь нажимает кнопку, форма отправляет данные в «submit.php» вместе с токеном CSRF.

«submit.php» использует «token_check.php» для проверки токена CSRF и возвращает результат, основанный на совпадении токена.

Если Злоумышленник попытается атаковать Пользователя с помощью CSRF?

Давайте откроем документ, содержащий CSRF-атаку.

<body onload="document.csrf.submit();">
    <form action="http://localhost/CSRF/Synchronizer_Token/submit.php" method="POST" name="csrf">
        <input type="hidden" name="param" value="delete">
    </form>
</body>

Как видите, злоумышленник знает, куда должен идти запрос. Хотя токена CSRF нет, поэтому запуск этой страницы приведет к перенаправлению на страницу с сообщением о том, что токен CSRF не соответствует.

Полный исходный код можно найти на моем GitHub.

https://github.com/kumudunee/CSRF_Synchronizer_Token_Pattern