web-dev-qa-db-ja.com

Strutsトークンを使用したクロスサイトリクエストフォージェリの防止

Struts1.xフレームワークに基づくWebアプリケーションにクロスサイトリクエストフォージェリ防止を実装したいと思います。 struts 2フレームワークがこのためのトークンインターセプターを提供し、フィルターを使用して同様の機能を実装できることを知っています。

私はいくつかの考えについて少し混乱しています1)簡単な方法で一意のトークンを生成する方法は? (フォームの重複送信を回避するために使用されるこの目的でアクションクラストークンを使用できますか)

CSRF防止のためのstruts1.xフレームワークトークンメカニズムの使用に問題はありますか

20
Niraj Sonawane

Struts 1アクショントークンメソッドは、セッションにトークンを追加してフォーム送信時にチェックするという点でStruts 2トークンインターセプターと同じように機能しますが、はるかに手動のプロセスです。基本的なワークフローは次のとおりです。

  1. ユーザーは、Strutsアクションを介してフォームにアクセスします(JSPに直接アクセスするのではありません)。 Strutsアクションは、フォームを含むJSPに転送する前に、saveToken(request)を呼び出します。
  2. JSPのフォームでは、_<html:form>_タグを使用する必要があります。
  3. フォームが送信するアクションは最初にisTokenValid(request, true)を呼び出し、falseが返される場合は、エラーメッセージを表示して最初のアクションにリダイレクトする必要があります。これにより、次のリクエストのトークンもリセットされます。

これを行うと、フォームの重複送信が防止されるだけでなく、スクリプトが2番目のStrutsアクションに送信してフォームを送信する前に、最初のStrutsアクションを実行してセッションを取得する必要があります。サイトは別のサイトのセッションを設定できないため、これによりCSRFが防止されます。

通常、ユーザーを直接JSPに送信する場合は、送信しないでください。代わりに、ActionForwardを継承する新しいクラスを作成し、これをexecute()メソッドとして設定します。

_public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    saveToken(request);
    return super.execute(mapping, form, request, response);
}
_
17
Joseph Erickson