Cross-site Request Forgeries CSRF

Атака cross-site request forgery заставляет жертву посылать различные HTTP-запросы, обычно на URL, который требует особых прав и привелегий, чтобы использовать сессию жертвы для доступа к этому URL. Например, это может быть покупка или изменение какой-либо информации.

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

  • Зарегистрироваться и залогиниться.
  • После выбора нужной книги нажать Купить, после чего будет редирект на checkout.php.
  • Пользователь видит, что несмотря на то, что страница checkout.php должна открываться при POST запросе, она так же успешно открывается и при передаче параметров в строке запроса (через GET).
  • При передаче тех же параметров через строку запроса (checkout.php?isbn=0312863551&qty=1) книга успешно покупается.

Имея такие знания можно заставить совершить покупку других пользователей без их на то ведома. Легче всего то сделать с помощью тэга <img>, вставленного в какой-нибудь сайт. Аттрибут src при этом отправляет запрос на нужную страницу:

<img src="http://example.org/checkout.php?isbn=0312863551&qty=1" />

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

Чтобы защититься от такой атаки следует использовать данные из POST запроса вместо GET. Так же добавлением в форму скрытого поля со сгенерированным уникальным для каждого пользователя токеном. Значение токена при этом хранится в сесии пользователя. Скрипты проверяют соответствие токена из POST запроса и значения из сессии. Если они совпадают, то запрос корректный.

session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

?>
<form action="checkout.php" method="POST">
    <input type="hidden" name="token"
           value="<?php echo $token; ?>">

    <!-- Remainder of form -->
</form>
  • Злоумышленник использует другие сайты для выполнения HTTP запросов и передачи конфиденциальной информации злоумышленнику.
  • Работает на сайтах, которые доверяют уже залогиненным пользователям.
  • Выполняется через iframe, XMLHttpRequest-запрос или тэги script, object, embed, img.
  • Может быть предотвращено установкой уникального токена (генерацией случайной строчки, хранимой в $_SESSION и добавляемой в форму в скрытое поле) в запрос формы или перезапросом логина на особо важных операциях.
  • Следует убедиться, что нет crossdomain.xml файла, который предоставляет доступ Flash роликам.
  • Проверять HTTP заголовок REFERER.
  • Ограничить время жизни для authentication cookie.