Я много читал об этом и до сих пор не понимаю этого. Допустим, у меня есть домен с формой, доступной только авторизованным пользователям, чтобы оставлять комментарии к какому-либо контенту:
my_form.php
<form action="post_comment.php" method="post">
<textarea name="comment"></textarea>
<input type="hidden" name="csrf_token" value="<?php print $csrf_token; ?>" />
<input type="submit" value="Post" />
</form>
post_comment.php
<?php
if(!isset($_POST['csrf_token']) || !CSRFToken::validate($_POST['csrf_token'])){
print "Invalid CSRF-Token!";
exit;
}
[...]
?>
post_comment.php отклонит любой запрос, если значение токена "csrf_token" не отправлено или недействительно. Поэтому мы запрещаем злоумышленникам использовать наш post_comment.php.
НО, как запретить атакующему GET /my_form.php, прочитать значение csrf_token из формы и POST в post_comment.php, используя его? Чего мне не хватает?