Вы должны поместить токен в 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так как ключ генерируется случайным образом и истекает с сеансом.