eprivalov
@eprivalov
Учусь

Как избавиться от ошибки «PHP Fatal error: Uncaught exception 'RuntimeException' with message 'CSRF attack'»?

Доброй ночи, есть вот такой код в файле login.php:
if ( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' ) {
    if ( !isset( $_SESSION[ 'csrf' ] ) || $_SESSION[ 'csrf' ] !== $_POST[ 'csrf' ] )
        throw new RuntimeException( 'CSRF attack' );
}
$key                = sha1( microtime() );
$_SESSION[ 'csrf' ] = $key;


Из-за этого кода генерируется в логах такая ошибка:

PHP Fatal error: Uncaught exception 'RuntimeException' with message 'CSRF attack' in /var/www/login.php:26\nStack trace:\n#0 {main}\n thrown in /var/www/login.php on line 26, referer: www.travianx5.ru/login.php


Можете объяснить, что делает приведенный выше код? И как мне избавиться от этой ошибки?
  • Вопрос задан
  • 9083 просмотра
Решения вопроса 2
AotD
@AotD
PHP, Redis, Postgresql
Кто-то или что-то умышленно или нет пытается провести csrf атаку.
Приведенный выше код не дает выполнять несанкционированные действия от лица авторизованного пользователя.
К примеру если вы админ на сайте example.com и случайно забрели на вредоносный сайт badguy.com на котором расположена картинка:
<img href="http://example.com/admin/user/delete?id=1"/>

Без этой замечательной проверки вы, будучи залогиненым в админке и ничего не подозревая грохнете пользователя 1.

Как писалось выше - избавляться ни от чего не нужно, нужно перехватить исключение через
try
{ 
  // ... 
} 
catch (RuntimeException $e) { 
  // и тут написать корректное сообщение для потенциального атакующего =) 
}
Ответ написан
Комментировать
deadbyelpy
@deadbyelpy
веб-шмеб
необработанное исключение
Когда делаете throw new RuntimeException( 'CSRF attack' );
нужно делать catch (RuntimeException $e) {}

п.с. или мне кажется, но я уже видел от вас вопросы с ошибками php?
так рекомендация, в ошибках обычно все объясняется :)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы