1

セッション追跡のために、JSP で隠し変数を使用する必要があります。これはコードです:

<input type="hidden" name="REQ_TOKEN" value="<%=session.getAttribute("SESN_TOKEN").toString()%>" />

これを使用してリクエストトークンとセッショントークンを比較しているため、両方が等しい場合にのみそのリクエストを評価し、そうでない場合はエラーをスローします。

問題は、このコードを<form></form>タグ内に配置すると、正常に機能することです。残念ながら、私のアプリケーションには<form>タグのない JSP がいくつかあります (奇妙に聞こえるかもしれません!)。コードを動作させるには、どこにコードを配置すればよいですか?

<form>タグなしで隠し変数を使用できませんか?

4

3 に答える 3

1

あなたが説明している隠された値は、より一般的にナンスと呼ばれるもののようです。これは、(Web フォームについて話すとき) フォームが 1 回だけ送信され、要求した同じセッションによって送信されたことを確認するために使用される値です。フォーム。クロスサイト リクエスト フォージェリの防止に関する注意事項を参照してください。

まず、 なしでどのようにリクエストを送信しています<form>か? ユーザーは単にリンクをクリックしているだけですか? その場合、ノンスをクエリ文字列に追加できますが、ナンスの検証を実際に必要とする破壊的なものに対して GET 要求を使用している場合は、間違っています。これらのタイプのリクエストは、POST を介してのみ行う必要があります<form method="post">

<input type="hidden" />第二に、いいえ、フォームの外では使用できません。特定のフォームは、独自の値、つまり と の間の要素のみを送信し<form>ます</form>

ポストバックされるデータに非表示の値を含める場合は、送信されるフォーム内に非表示の入力を含める必要があります。あなたが言うように、必要な<form>タグを JSP ファイルに含めることができない場合は、Javascript を介して動的に要求を行うことができますが、これにより Javascript への依存が発生し、非常に単純で基本的なものを回避する必要があります。

于 2010-03-18T14:13:33.340 に答える
0

私の知る限り、正しく機能させるにはフォームタグに隠しフィールドが必要です。まだ調べていますrepost。これまでに見つけたサイトは、フォーム内にある必要があると言っています。

編集* roseindia.net/jsp/jspsession/HiddenForm

于 2010-03-18T14:11:23.027 に答える
0

CSRF 防止のためだけであれば、フォームのないページではまったく必要ありません。保護するものが何もないからです:)ポイントは、各ページ<form method="post">ではなく、各ページに含めることです。

とはいえ、「セッション トラッキング」はまったく別の概念です。は、Cookie または URLのHttpSession書き換えを使用して、舞台裏ですでに正確にそれを行っています。そのため、最初はあなたの質問がわかりにくく、明確にするためにコメントを投稿しました。ここでは、CSRF を防ぐことができるように、セッション スコープに保存する (そしてリクエストが渡されたらすぐに削除する) リクエスト ベースのトークンを使用して、"リクエスト トラッキング" が必要です。

更新:この回答は、CSRF が実際に何であるかについて詳しく知るのに役立つ場合があります。

于 2010-03-18T14:12:39.233 に答える