От чего меня защищает PHP session.referer_check? - PullRequest
27 голосов
/ 01 февраля 2011

Я создаю систему с CakePHP, которая должна быть достаточно надежной, потому что мы имеем дело с деньгами, счетами клиентов и т. Д. До сих пор все отлично работало, пока мне не пришлось интегрироваться с платформой платежей вкоторый мне нужно перенаправить на их сайт, и они перенаправить обратно на мой.

Это прекрасно работает на моем компьютере разработчика (debug = 2), но в производственной среде, когда клиент перенаправляется обратно, он получает приглашение для входа в систему вместо того, чтобы вернуться обратно в свою «область входа в систему».После долгих раскопок я обнаружил, что это потому, что CakePHP устанавливает session.referer_check, который делает недействительными сессии, если HTTP_REFERER приходит с другого хоста, чем мой.

Теперь, обычно, я бы отключил это, не задумываясь, но в этомsystem Я немного больше обеспокоен безопасностью, чем обычно.

Мой вопрос заключается в том, что именно от сессии.referer_check должен защищать меня?
Какой тип атаки / эксплойта / плохого можно сделать длямой сайт, если я выключу его?

Я предполагаю, что должна быть какая-то причина, почему это существует, но я не могу себе представить, от чего это защитит меня.

Не могли бы вы дать мне какие-нибудь идеи?
Безопасно ли отключить это?

Спасибо
Даниэль

Ответы [ 3 ]

23 голосов
/ 01 февраля 2011

Это обеспечивает ограниченную защиту Фиксация сеанса и CSRF / XSRF. Проверка реферера является допустимым методом остановки xsrf . Лучший способ остановить фиксацию сеанса - Session.use_only_cookies, поскольку хакер не может установить cookie в браузере жертвы для домена, который он уже не контролирует.

Однако Session.referer_check легко обойти. Он просто ищет подстроку в домене реферера. Если подстрока отсутствует все вместе, что происходит, если исходный URL-адрес https: //, тогда идентификатор сеанса будет недействительным. Однако, поскольку она является подстрокой, а не полной строкой, вы можете обойти это для www.somedomain.com, ссылаясь на www.somedomain.com.some_hacker.com. Короче говоря, я думаю, что это совершенно бесполезно .

4 голосов
/ 10 июня 2011

Имейте в виду, что в основном все referer_check делает что-то вроде:

$pattern = "/^http:\/\/www\.myurl\.com(\/.*)*$/";

if(!empty($_SERVER['HTTP_REFERER']) && !preg_match($pattern, $_SERVER['HTTP_REFERER'])) {
   session_destroy();
}

Досадно, что PHP, встроенный в referer_check, не будет принимать массив URL, но вы всегда можете сделатьваш собственный, который делает.

Так что для CakePHP, вы можете сделать что-то вроде следующего:

// ADD THIS TO /app/config/config.php
$config['CustomSecurity'] = array(
    'accept_referers' => array(
        'http://www.my_site.com',
        'https://www.other_allowed_referer.com',
    )
);

// ADD THIS TO /app/app_controller.php

private function referer_check(){
   if(!empty($_SERVER['HTTP_REFERER'])) {
      $accept_referers = Configure::read('CustomSecurity.accept_referers');
      $referer_accepted = false;
      foreach($accept_referers as $referer) {
         $pattern =  '/^'.preg_replace('/(\.|\/)/','\\\$1',$referer).'(\/.*)*$/';
         if(preg_match($pattern, $_SERVER['HTTP_REFERER'])) 
            $referer_accepted = true;
      }
      if(!$referer_accepted) {
         $this->Session->destroy();
         exit;
      }
   }        
}

И В ВАШЕМ app_controller::before_filter ФУНКЦИЯ, ВЫЗОВ:

$this->referer_check();

... или что-то подобное в любом случае ... извините за форматирование кода, текстовое поле было запоздалым:)

3 голосов
/ 01 февраля 2011

Проверка реферера таким способом может помочь защитить от Межсайтовая подделка запроса .

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

Если вы отключили это, вы должны принять другие меры для защиты от таких атак.

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