2011-02-01 35 views
25

私はお金や顧客の口座などを扱っているため、CakePHPを安全にする必要があるシステムを作っています。これまでのところ、すべてがうまくいっています。私は自分のサイトにリダイレクトする必要があり、彼らは私のところにリダイレクトされます。私を保護するPHPのsession.referer_checkとは何ですか?

これは私の開発マシン(debug = 2)でうまく動作しますが、プロダクションでは、顧客がリダイレクトされたときに、彼はログインした領域に戻らずにログインプロンプトを表示します。私はCakePHPがsession.referer_checkを設定しているので、掘り下げた後に見つかった.HTTP_REFERERが私のホスト以外のホストから来た場合、セッションを無効にする。

通常、これはもう一度考えなくても無効にしていますが、このシステムではセキュリティが通常よりも少し心配です。

私の質問は、私を守るためにsession.referer_checkと正確に何が違いますか?
私のサイトをオフにすると、どのような攻撃/悪用/悪いことが私のサイトに行えますか?

私は、これが存在する何らかの理由があると推測していますが、私はそれが私を守るとは想像できません。

私に何かアイデアを教えてください。
これを無効にしても安全ですか?

はあなた
ダニエル

+0

あなたはCSRFに対して保護するために以前のリクエストでフォームと一緒に送られたトークンではなくリファラーをチェックしていますか? – Pablo

+0

100%確実です。 CakePHPは参照元をチェックしていません。それはreferer_check(参照元自体をチェックするPHP機能です:http://www.php.net/manual/en/session.configuration.php#ini.session.referer-check ) - また、私が見る結果は人々を伐採することです。 CakePHPはCSRFトークンが好きでないとき(またはそれが得られないとき)に「ブラックホール」(基本的には空白ページ)です –

+0

類似:http://stackoverflow.com/questions/22079477/cakephp -session-is-oauth-redirect-after-an-oauth-redirect – trante

答えて

22

これは、Session FixationとCSRF/XSRFの制限された保護を提供するためです。リファラーを確認するのはa valid method of stopping xsrfです。セッションの固定を停止するより良い方法はSession.use_only_cookiesです。これは、ハッカーが、まだ制御していないドメインの犠牲者のブラウザにCookieを設定できないためです。

ただし、Session.referer_checkはバイパスしやすいです。 Refererドメインの部分文字列を探しています。部分文字列がすべて欠落している場合は、元のURLがhttps://の場合に発生し、セッションIDは無効になります。しかし、部分文字列ではなく、完全な文字列でなければ、www.somedomain.com.some_hacker.comを参照してwww.somedomain.comのためにこれをバイパスすることができます。要するに、私はこれが完全に役に立たないだと思う。

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

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

referer_checkに建てPHPSは、URLの配列を受け入れないことを迷惑ですが、あなたは常にあなた自身のものを作ることができます。基本的にすべてのreferer_checkがやっている心の中で

+0

お返事ありがとうございました!これでクリア! –

3

Cross-site request forgeryを保護することができ、このようにリファラをチェックありがとうございます。

理想的には、自分のドメインまたは支払いプラットフォームのドメインのいずれかと一致するリファラーチェックを行う方法が必要ですが、パターンマッチではなく単純なサブストリングチェックであるとは思いません可能。

これを無効にした場合は、このような攻撃から保護するために、他の対策を講じてください。

+0

リフェラルチェックはなりすましを行うことができます。ノンスまたはワンタイムトークンは、CSRFに対する保護の標準です。 – gravelpot

+0

私はそれほど前提としました。さて、私のサイトでは、GETを使って**何か**を変更することはできません、POSTのみ、サイトはあなたがブラウザを閉じた後にあなたを覚えていないでしょう、そして、CakePHPはXSRFフォームPOST 。すべてのことを念頭に置いて、これを安全に無効にすることはできますか? –

+0

@gravelpot:ヘッダーは攻撃者によって偽装される可能性がありますが、それはCSRFのことではなく、ユーザーのブラウザが別の(悪意のある)サイトから自分の(良い)サイトへの要求自体を行うことです。その場合、リファラを偽装することはできません。 (そして、私はトークンを使用しています、そして私のサイトのすべては "あなたを覚えていない"ログイン壁の背後にあります) –

4

クマのようなものがありますそうです。

ので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関数では、CALL:とにかく

$this->referer_check(); 

...またはそのような何かを...ごめんコードフォーマットについては、テキストエリアはひっかかっていました:)

関連する問題