причина использования токена в форме HTML и проверки в коде PHP - PullRequest
8 голосов
/ 19 ноября 2011

В коде я видел это создание токена для страницы входа в систему:

$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));

Затем этот токен отображается как скрытый ввод в форме входа в систему и при отправке, php-код для проверки входа также проверяет этот токен как:

public function isTokenValid()
{
  return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token'])? 0 : 1;
}

Какая польза от этого токена?

Редактировать: Эта страница описывает использование этого: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Ответы [ 4 ]

8 голосов
/ 19 ноября 2011

Такой подход обычно используется для предотвращения уязвимостей CSRF

1 голос
/ 22 ноября 2018

Вы должны поместить токен в html-форму, чтобы защитить свой веб-сайт от CSRF-атак.

Объяснение атаки CSRF - Практический пример:

CSRF-атакиизвестны как разновидности атак. Злоумышленник использует надежность и достоверность действительного аутентифицированного пользователя. Вот пример этого:

Пример. В html-форме есть кнопка и текстовое поле, позволяющее пользователямопубликовать свои комментарии, нажав на него, это выглядит следующим образом:

<?php
    // www.mydomain.com/comment.php
    session_start();

    if (isset($_POST['send']) {
        $comment = $_POST['comment'];
        // + ... + publish the comment ...
        // + more server side logic here
    }
?>

<html>    
<body>
    <form>
        <input type="text" name="comment"/>
        <button name="send">Send</button>
    </form>
</body>
</html>

Злоумышленник CSRF может создать следующую веб-страницу:

<html>    
<body>
    <form method="post" action="www.mydomain.com/comment.php">
        <input type="hidden" name="comment" value="The attacker comment"/>
        <button name="send">Comment for www.mydomain.com</button>
    </form>
</body>
</html>

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

Теперь злоумышленник публикует эту страницу в Интернете и пользователи, которые вошли в свои учетные записи на «www.mydomain.com 'может просто зайти на эту страницу и нажать на кнопку, и как только это будет сделано - комментарий злоумышленника будет опубликован с аккаунта жертвы, ничегоЭто странно, потому что сервер принимает этот комментарий, поскольку запрос поступил от аутентифицированного пользователя.

Решение

Чтобы защитить ваш веб-сайт от CSRF-атак, вам необходимо:определите на своем сервере, с какого запроса.

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

В приведенном выше примере действительная страница должна выглядеть так:

<?php
    // www.mydomain.com/comment.php
    session_start();

    if (isset($_POST['send']) {
        if (isset($_POST['CSRF']) && $_POST['CSRF'] == $_SESSION['CSRF']) {
            $comment = $_POST['comment'];
            // + ... + publish the comment ...
            // + more server side logic here
        } 
        else {
            echo '404 Not found!'; // possible csrf atack.
            exit();
        }             
    }

    $csrf = bin2hex(random_bytes(32));
    $_SESSION['CSRF'] = $csrf; 
?>

<html>    
<body>
    <form>
        <input type="text" name="comment"/>
        <button name="send">Send</button>
        <input type="hidden" name="csrf" value="<?php echo $csrf; ?>"/>
    </form>
</body>
</html>

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

1 голос
/ 17 сентября 2013

Токены полезны для обеспечения некоторого уровня защиты от CSRF-атак, а также для обеспечения ограничения на отправку формы.

Проще говоря, можно использовать для предотвращения непреднамеренной отправки кем-либо одной и той же формы дважды, дважды нажав кнопку отправки.

Пример: Вы делаете онлайн-перевод на веб-сайте своего банка в размере 10 долларов США со счета А на счет Б. Когда появляется экран «Перевод средств», на заднем плане появляется уникальный токен. Вы вводите учетные записи и суммы, а затем нажимаете кнопку отправки, а затем снова нажимаете ее случайно до загрузки следующей страницы.

Ваш браузер отправляет HTTP POST дважды. Для первого запроса сервер получает токен, подтверждает его действительность, затем удаляет или помечает как недействительный. Для второго запроса сервер обнаруживает, что (тот же) токен больше не действителен и не обрабатывает передачу. Если бы это не было сделано, вы бы просто перевели 20 долларов вместо 10 долларов.

Один из способов думать об этом - когда вы загружаете форму, вы получаете токен специально для этого экземпляра формы, которую вы только что загрузили. Если вы хотите отправить, используйте токен. Как только вы используете токен, его больше нет. Хотите еще один токен? Перезагрузите страницу / форму, чтобы получить другую.

Примечание: есть способы использования JavaScript для предотвращения повторных нажатий кнопок, которые также следует использовать, но это не помогает, если есть дублирующий HTTP-запрос по какой-либо другой причине (ошибка браузера, проблема с оборудованием и т. д.). Токены следует использовать для любой транзакции, которая приводит к изменению данных или использованию ресурсов (например, печати), и их не следует непреднамеренно дублировать.

1 голос
/ 19 ноября 2011

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

Идея состоит в том, что ваш сайт сначала должен сгенерировать токен anti-CSRF и передать его авторизованному клиенту.Но этот токен неизвестен злоумышленнику и должен использоваться для выполнения действительного запроса на ваш сайт.

В качестве примера CSRF-атаки может быть соблазн пользователя щелкнуть ссылку, что приведет к публикации сообщения со спамом.в поток Facebook пользователя, если Facebook не был должным образом защищен от CSRF с помощью токена.Поскольку пользователь уже вошел в систему, атакованный сайт (Facebook) обработал запрос на публикацию как действительный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...