CSRF攻撃に対するPhalcon + AngularJS Webアプリケーションの保護

みなさんこんにちは! 少し前まで、Phalcon PHP Frameworkで作成されたWebアプリケーションをAngularJSとともに保護する問題に遭遇しました。 問題は、AJAXリクエストをサーバーに送信するページ上にいくつかのフォームがあることです。 セキュリティ問題に関する2つのフレームワークの友達を作る方法、私は集中化されたソリューションを見つけることができませんでした、異なるソースからの断片にそれを組み立てなければなりませんでした。 そして、この記事では、このような問題に遭遇した、または遭遇するすべての人に、既製の実用的なソリューションを提供したいと思います。



メタタグでトークンを生成する



残念ながら、今はソースを覚えていませんが、タグの間にメタトークンが大規模なサイトに置かれていることがよくあります。 Phalconのドキュメントを見ると、トークンの生成がフォームで発生していることがわかります。 これは、フォーム内のトークンがデフォルトで生成される方法です。



<input type="hidden" name="<?php echo $this->security->getTokenKey() ?>" value="<?php echo $this->security->getToken() ?>"/>
      
      





そして、2つのフォームがある場合はどうですか フォーラムには解決策がありましたが、サードパーティのライブラリを使用していたため、私の場合は良い解決策ではなかったため、フォーラムでもう少し検索した後、メタタグにトークンを生成する解決策を見つけました。

 <meta name="token" title="<?= $this->security->getTokenKey() ?>" content="<?= $this->security->getToken() ?>"/>
      
      







すべてのAJAXリクエストにトークンを添付します



トークンの操作に関するAngularJSドキュメントを読んだ後、ヘッダーのトークンをX-XSRF-TOKENという名前で転送することが提案されていますが、悲しいことに、Phalconでは、そのようなトークンを処理するために別個のライブラリを作成する必要がありました。 これには時間がありません。怠け者なので、もっと簡単な解決策を見つける必要がありました。



 var app = angular.module('selfmd', [], function ($httpProvider) { $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; $httpProvider.defaults.transformRequest = [function (data) { if (data === undefined) { data = {}; } var token = $('meta[name=token]'); data[token.attr('title')] = token.attr('content'); return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data; }]; }
      
      





単純であることに加えて、$ http関数を使用して送信されるすべてのAJAXリクエストは、Phalconが標準手段によって簡単かつ便利に受け入れるトークンによって絶対に保護されるため、柔軟性もあります。



  if ($this->security->checkToken()) { //  }
      
      







考えられる問題と解決策



1.ページのソースコードを(firebug経由ではなく、別のウィンドウで)表示する場合、読み込み時に新しいトークンが生成され、ページに戻ると、リクエストは処理されません。 おそらくこれは良いことであり、ソースコードに入るべきものは何もありません。

2.ページに突然ファビコンがない場合、または空の背景画像がある場合:url( ""); このデータをリクエストするブラウザは、目に見えない新しいトークンを生成します。 トークンが拒否された理由を見つけるのに2、3日費やしましたが、少なくとも空の背景画像でブロックを疑うことができました:url( "");

3.そして、AJAXと$ httpなしでフォームを保護する方法は? とても簡単です!

コントローラーで、新しいスコープを追加します。



  var token = $('meta[name=token]'); $scope.token_id = token.attr('title'); $scope.token_val = token.attr('content');
      
      





そして、ビューでは非表示フィールドに表示します:



 <input type="hidden" name="{{token_id}}" value="{{token_val}}"/>
      
      





これですべてのフォームが保護され、Phalconは使い慣れたデータに満足し、不必要なライブラリを使用せず、すべての$ httpトークンに問題なくAngularフックします。



あとがき



私はセキュリティの専門家からは程遠い、私はPHPの第一人者ではありません。好きなことをするときに生じる問題を解決するだけです。 同じ便利でわかりやすい解決策が見つからなかったので、共有したいと考えました。 問題に気付くまで、このソリューションを実際のプロジェクトで使用します。 おそらくあなたはコメントの誤りを指摘し、私はあなたに感謝するでしょう。 私は今年の8月からPhalconとAngularJSを使用しており、それ以前はCodeIgniterとjQueryを使用していました。そのため、このようにクールに見えない場合は、このような解決策をあまり判断しないでください。



ご清聴ありがとうございました。 あなたがPhalconについて読むことに興味があるなら、サインアップしてください。



All Articles