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

kzipqqlq  于 2022-12-17  发布在  PHP
关注(0)|答案(3)|浏览(137)

我正在用CakePHP制作一个系统,这个系统需要相当安全,因为我们处理的是钱、客户账户等。到目前为止,一切都运行得很好,直到我不得不与一个支付平台集成,在这个平台中,我需要重定向到他们的网站,而他们重定向回我的网站。
这在我的开发机器上运行良好(debug = 2),但在生产环境中,当客户被重定向回来时,他会得到一个登录提示,而不是回到他的“登录区域”。经过深入研究,我发现这是因为CakePHP设置了session.referer_check,如果HTTP_REFERER来自另一个主机而不是我的主机,它会使会话无效。
现在,通常情况下,我会毫不犹豫地禁用它,但在这个系统中,我比平时更关心安全性。
我的问题是session.referer_check到底应该保护我不受什么影响?
如果我关闭它,会对我的网站造成什么样的攻击/漏洞利用/坏事?
我猜这东西的存在一定有原因,但我想不出它能保护我不受什么伤害。
你能给予我出个主意吗?
关掉它安全吗?
谢谢
丹尼尔

kknvjkwl

kknvjkwl1#

这是为了对Session Fixation和CSRF/XSRF提供有限的保护。检查引用是停止xsrf的有效方法。停止会话固定的更好方法是Session.use_only_cookies,因为黑客无法在受害者浏览器上为他尚未控制的域设置Cookie。
然而,Session.referer_check很容易被绕过。它只是在referer域中寻找一个子字符串。如果子字符串一起丢失,如果原始URL是https://,那么会话ID将无效。然而,因为它是一个子字符串而不是一个完整的字符串,那么你可以通过从www.somedomain.com.some_hacker.com引用来绕过www.somedomain.com。所以简而言之,我认为这是完全无用的

nhaq1z21

nhaq1z212#

请记住,referer_check所做的基本上都是类似于以下内容的:

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

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

referer_check中内置的PHP不接受URL数组,这很烦人,但您总是可以创建自己的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();

......或者类似的东西......抱歉代码格式,文本区域变钝了:)

2ekbmq32

2ekbmq323#

以这种方式检查referer有助于防范Cross-site request forgery
理想情况下,你会希望有一种方法,使推荐人检查匹配您自己的域或支付平台的域,但由于这是一个简单的子串检查,而不是模式匹配,我不认为这是可能的。
如果禁用此功能,则应采取其他措施来防范此类攻击。

相关问题