web-dev-qa-db-ja.com

リバースプロキシを使用してフォームをキャッシュし、古いフォームトークンを処理する方法

Form API がフォームを生成するとき、フォームとともに非表示フィールドに渡され、返されることが期待されるトークンも生成します。そうであれば、フォームは処理されます。

たとえば Varnish によってキャッシュされるレンダリングされたフォームがある場合、このメカニズムは機能しません。フォームを送信した最初のユーザーがトークンを使用し、その後のフォームの使用の試みは拒否されます。

レンダリングされたフォームをキャッシュしている間、フォームを機能させ続けるにはどのような戦略が利用できますか?

8
Letharion

私のサイトでは [〜#〜] boa [〜#〜] を使用していますが、デフォルトでは、BOAはフォーム送信用のオンザフライでフロントエンドキャッシュを無効にするだけです。 ニュージーランドポストがDrupal&Varnish をどのように処理するか、およびフォームについて、実際の経験を超えて、1歳の人工的なクロスに行きましたトークンの問題。ホーリージョンウェイン、そのDrupalキャッシング-本当に-を読む必要があります。フォームの問題にのみ焦点を当てます:

パズルの最後のピースは Cookie Cache Bypass Advancedモジュール で、ユーザーがPOSTを送信するたびに特別なNO_CACHE Cookieを自動的に設定しますログインフォームなどを含む、サイトのフォーム。ワニスは、このCookieを検出したときに、ページキャッシュ(ESIキャッシュ)ではなく)をバイパスするように構成されています。

XSRFプロダクションがform_alter(unset($ form [‘#token’]);)または($ form [‘#token’] = FALSE;)で再要求されない場合は、フォームトークンを無効にすることもできます。

Acquia Drupalのパフォーマンスに関する記事Drupal Module Authcache を公開していますが、Authcacheのドキュメントを読んでうまくいきます フォームのプレースホルダーを使用したキャッシュ (フォームをキャッシュしない):

Authcacheは、カスタマイズされたコンテンツをインターセプトし、HTML内にプレースホルダーを設定しようとします。次に、ページが読み込まれた後、Ajaxコールバックを使用してカスタムデータを取得し、プレースホルダーに入力して、ページのHTMLを動的に更新します。

現在のAuthcacheプレースホルダー:フォームトークン(ログインユーザーのみ。> Drupalで必要)、クロスサイトリクエストフォージェリ攻撃を防止する)

戦略は、フォーム以外のすべてをキャッシュすることです。それでは、他のすべてに対処します。たぶんVarnishはまったく使用されません。MemcacheとRedisですか。私の戦略は、BOAとその背後にあるウィザード( omega8.cc )を使用しているため、BOAが提供するものを使用することです。問題を解決する外部キャッシュ。それらはすべてフォームをバイパスするようです。

前述のauthcacheと、NZ Postの記事で言及されているように微調整されたビューとパネルを使用して部分キャッシュを実行し、 Wunderkrautのブレイントラストによって説明されています -古いですが、問題に対処しています。

Drupal ESI Module を使用し、ワニスは部分的にESI準拠):

ESI(エッジサイドインクルード)は、認証済みユーザー向けの高性能キャッシュソリューションですが、匿名ユーザーにも役立ちます。

通常、認証されたユーザー向けにパーソナライズされたページ(「Manarthとしてログイン」と言うブロックなどのマイナーなパーソナライズでも)は、リバースプロキシ(Drupalの100倍の速度で簡単に実行できる)がページをキャッシュするのを防ぎます。あるユーザーを対象とすることで、別のユーザーが見ることができます。

それがもっと役立つことを願っています。

5
Tom

考えられる解決策の1つは、$form[‘#token’] = FALSE;と一緒にトークンをすべて無効にし、実際にコメントを投稿する代わりに送信コールバックをオーバーライドし、トークンで元のフォームを再生成し、投稿を確認するようユーザーに依頼することです。

ユーザーが ECMAScript をサポートしている場合、新しいフォームトークンのフォーム生成を公開し、関連するフォームをform_cacheに挿入する services リソースを使用することで、ユーザーエクスペリエンスを向上させることができます。次に、ユーザーがフォームにフォーカスし、送信を希望するようになるとすぐに、送信ボタンを無効にし、新しいトークンをフェッチして、既にレンダリングされているフォームに挿入し、送信ボタンを再度有効にします。

0
Letharion