PHP session.referer_check保护我免受什么侵害?

2022-08-30 16:10:01

我正在用CakePHP制作一个系统,该系统需要非常安全,因为我们正在处理金钱,客户的帐户等。到目前为止,一切都很顺利,直到我不得不与一个支付平台集成,在这个平台上,我需要重定向到他们的网站,然后他们重定向回我的网站。

这在我的开发计算机中工作正常(debug = 2),但在生产中,当客户被重定向回去时,他会收到登录提示,而不是返回他的“登录区域”。经过大量挖掘,我发现这是因为CakePHP设置session.referer_check,如果HTTP_REFERER来自另一个主机而不是我的主机,这将使会话无效。

现在,通常情况下,我会毫不犹豫地禁用它,但是在这个系统中,我比平时更关心安全性。

我的问题是,session.referer_check究竟应该保护我免受什么?
如果我关闭我的网站,可以对它进行什么样的攻击/利用/坏事?

我猜想这一定有某种原因,但我无法想象它会保护我免受什么。

你能给我任何想法吗?
禁用此功能是否安全?

谢谢
丹尼尔


答案 1

这是为了为会话固定和 CSRF/XSRF 提供有限的保护。检查引用程序是停止 xsrf 的有效方法。停止会话固定的更好方法是,因为黑客无法在受害者浏览器上为他尚未控制的域设置cookie。Session.use_only_cookies

但是,Session.referer_check很容易绕过。它只是在引用域中查找子字符串。如果子字符串全部丢失,如果原始 url https:// 则发生这种情况,则会话 ID 将无效。但是,由于它是一个子字符串而不是完整字符串,因此您可以通过引用从 绕过它。所以简而言之,我认为这是完全没有用的www.somedomain.comwww.somedomain.com.some_hacker.com


答案 2

请记住,基本上所有referer_check都是这样的:

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

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

令人讨厌的是,内置的PHP不会接受一组URL,但您始终可以制作自己的URL数组。referer_check

因此,对于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();

...或者类似的东西...很抱歉代码格式,文本区域是一个迟到的:)


推荐