Действительно ли мы защищены от CSRF?

подтвердить.php

<?php
 session_start();
 $token= md5(uniqid());
 $_SESSION['delete_customer_token']= $token;
 session_write_close();
?>
<form method="post" action="confirm_save.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />

confirm_save.php

<?php
 session_start();
 $token= $_SESSION['delete_customer_token'];
 unset($_SESSION['delete_customer_token']);
 session_write_close();
 if ($_POST['token']==$token) {
   // delete the record
 } else {
   // log potential CSRF attack.
 }
?>

Допустим, у нас есть типичная защита от CSRF, подобная этой. Что, если атакующий использует этот код для обхода токена csrf?

//On any site
<img src="http://cia.teletubbies.com/csrf.php" height="0" weight="0"/>

//csrf.php
$cont = get_file_contents("http://cia.google.com/confirm.php");
// parse the html using [PHP Simple HTML DOM Parser][2] and get the CSRF token
//CURL and send a POST request to confirm_save.php with the token

Эта штука продолжает беспокоить меня, но я слишком ленив, чтобы пытаться атаковать любой случайный сайт. Разве это не возможно?

Код примера был украден из предотвращения csrf в php

Обновлено

Что происходит, когда кто-то хочет передать токен с одной платформы на другую или со стороны сервера на сторону клиента? Например, Flash to PHP, как его защитить от csrf?


person kornesh    schedule 03.08.2011    source источник
comment
Вы неправильно понимаете CSRF. Если злоумышленник воспользуется опубликованным вами образцом кода обхода, он получит свой собственный уникальный токен. Нет смысла захватывать их собственную сессию.   -  person Marc B    schedule 03.08.2011
comment
Спасибо за объяснение, есть идеи по созданию безопасных клиентских запросов CSRF?   -  person kornesh    schedule 03.08.2011


Ответы (2)


Вы получите токен CSRF для сеанса сервера, который вы используете для очистки страницы. Поскольку этот сеанс не принадлежит жертве, он безопасен. (Если вы крадете сеанс пользователя, это уже не CSRF-атака!)

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

person Chris Hepner    schedule 03.08.2011
comment
поэтому csrf.php получит новый сеанс вместо текущих пользователей, которые меняются при каждом запросе? - person kornesh; 03.08.2011
comment
Сервер, выполняющий get_file_contents(), будет иметь сеанс, отличный от сеанса пользователей, да, поэтому значение $_SESSION['delete_customer_token'] будет разным для каждого. - person Chris Hepner; 03.08.2011
comment
Хорошо, а что, если кто-то хочет безопасно сделать запрос на стороне сервера из клиентского приложения из CSRF? Как это возможно? - person kornesh; 03.08.2011
comment
Зависит от типа клиентского приложения. Если приложение просто не отправляет данные с помощью POST/GET через браузер, это не должно быть проблемой. Пока вы не можете использовать доверие браузера пользователя, он не поддерживает CSRF. В противном случае используйте токен сеанса аналогичным образом — это не обязательно должен быть тот же токен, который используется в PHP. - person Chris Hepner; 03.08.2011

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

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

person Søren Løvborg    schedule 03.08.2011
comment
злоумышленник может получить токен, который передается в типичной HTML-форме, и отправить его с помощью CURL. - person kornesh; 03.08.2011
comment
Токен передается только между законным веб-сайтом и браузером законного пользователя. Злоумышленник контролирует только csrf.php на другом сервере и не имеет доступа к токену законного пользователя. Если злоумышленник сделает запрос на легитимный сайт, он получит свой токен, а не токен легитимного пользователя. - person Søren Løvborg; 03.08.2011
comment
Я думаю, что понял, но тогда как кто-то может безопасно сделать запрос на стороне сервера из приложения на стороне клиента из CSRF? - person kornesh; 03.08.2011
comment
Если клиенту необходимо сделать запрос через сторонний сервер, клиент должен будет передать токен третьей стороне. В этом случае вам придется доверять третьей стороне. Но на самом деле это не та установка, для которой была разработана защита CSRF. - person Søren Løvborg; 03.08.2011