2

私は周りを検索しましたが、これについては何も見つかりませんでした。CodeIgniter の CSRF 保護がページ キャッシングで機能しないことを経験したのは私だけですか?

私は何を持っていますか:

この行を通してキャッシュされる Web ページ:

$this->output->cache( 120 );

そのページのJavascriptでは、データにCSRFトークンも含まれるAjax呼び出しがあります。キャッシュを無効にするか、CSRF 保護を無効にすると、すべて正常に動作します。

キャッシングとCSRF保護を有効にできるように、誰かが回避策などを知っていますか?

ありがとう!

4

1 に答える 1

1

form_open()ベンチマーク関数の出力がキャッシュされないのと同様に、それを処理しないことに少し驚いています。

考えられる回避策は 2 つあります。

キャッシュドライバーを使用する (!= output->cache())

完全にレンダリングされたページをキャッシュする出力クラス キャッシュを使用する代わりに、キャッシュ ドライバのキー値キャッシュを使用して、ページのレンダリングされた部分を保存できます。

この問題のある CSRF トークンを含むフォームが複雑で、外部データ ソースからの多くの動的コンテンツが含まれている場合は、それらのデータベース結果をキャッシュし (キャッシュ ドライバーを使用するか、データベース結果キャッシュを有効にして)、キャッシュされた値を動的フォームにフィードします。

マニュアルからのファイルベースのキャッシュに関する警告:

出力クラスからのキャッシュとは異なり、ドライバーのファイルベースのキャッシュでは、ビュー ファイルの一部をキャッシュできます。これを慎重に使用し、アプリケーションのベンチマークを行ってください。ディスク I/O がキャッシングによるプラスの利益を無効にするポイントが来る可能性があるためです。

もちろん、memcached または APC にアクセスできる場合は、代わりにそれを使用してください。

そのページとプロファイルの出力キャッシュを無効にします。

出力キャッシュ (完全にレンダリングされたページ) をインターセプトし、CSRF トークン値を置き換える

CSRFトークンを使用したフォームのキャッシングに関する興味深いソリューションに出会いました(Symfonyで)。原作者を言い換えると:

  1. キャッシュされた応答を設定する前に、CSRF トークンを見つけて置き換えます。
  2. レスポンスとともにトークンの位置を保存します (これもキャッシュされます)。
  3. キャッシュから応答を返す前に、新しい CSRF トークンを注入します。

CodeIgniter では、キャッシュをインターセプトするにhook-pointを使用する必要があるようですが、あなたの場合は. CodeIgniter がインスピレーションを得るためにCRSFトークンを実装する方法については、この優れた記事をご覧ください。ただし、実装するのは簡単ではないと思います。pre_systemcache_override

そのページをキャッシュせず、心配しないでください

これは明らかに最も簡単な解決策です。試して。ページの複雑さによっては、そのページのサブセットをキャッシュしないことによるパフォーマンスへの悪影響は、上記の 2 つのソリューションのいずれかを実装することの苦痛をはるかに上回る可能性があります。(ビューやコントローラーがどのように見えるかがわからないため、これがあなたの場合に受け入れられる解決策であるかどうかはすぐにはわかりません)。それがSPA の分離されたログインフォームである場合、おそらくそれを回避できます。

于 2013-02-28T16:17:31.553 に答える