私は、HttpServletRequest
を作成する私のTomcatサーバー上のサーブレットにjquery投稿を含むjspを持っています。私のサーブレットへのjspのコールだけが処理され、私のjsp以外のソースからのリクエストは無視されるようにしたいと思います。 私のサーバーを呼び出す参照ページが何であるかを確認する方法はありますか?私はrequest.getHeader("referer")
を使って偽装することができるので、私はそれに頼ることができないことを知っています。誰が私のHttpServletRequestに電話していますか?
答えて
トークンとして固有の文字列を生成し、それをセッションに格納し、JSPのPOSTフォームに隠し入力値として埋め込み、最後にサーブレットをチェックインします。
基本的に:セッションの作成に
(例えば、HttpSessionListener#sessionCreated()
で):(例えば、HttpServlet#doGet()
で)JSP要求の前に
Set<String> tokens = new HashSet<String>();
event.getSession().setAttribute("tokens", tokens);
:オン
String token = UUID.randomUUID().toString();
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");
tokens.add(token);
request.setAttribute("token", token);
JSP自体を処理する:
<input type="hidden" name="token" value="${token}" />
フォームの後処理に
(例えば、HttpServlet#doPost()
に)提出:もちろん
String token = request.getParameter("token");
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");
if (!tokens.remove(token)) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// ...
私はそれが正確に通常の同期要求をシミュレートするように、あなたのjQuery.post()
機能が$.post(form.action, form.serialize(), callback)
のように控えめな方法で書かれていることを前提としてい(言い換えれば、あなたのフォームはJSが無効になっていると完全にうまく動作します)。
あなたのJSPに安全なトークンをレンダリングし、それを確認できるサーブレットへのAjax呼び出しにインクルードすることができます。これは、Ajax呼び出しがブラウザとJavascriptを使用して行われることを保証するものではありませんが、呼び出しを行う前に少なくともJSPから安全なトークンを取得する必要があります。
CSRFを緩和するのに同様の概念が推奨されます。
jspのランダムなクッキーを作成し、それをPOSTフォームに追加し、正しいクッキー値を持つリクエストのみを受け入れることができます。
これは実際に言及された他のソリューションよりも安全です。アップボーニング。 – Perception
@Perception:HTTPセッションはすでに「ランダムなクッキー」によってバックアップされていることに注意してください。 – BalusC
@BalusC - 一般的に真です(URLの書き換えを使用するものもあります)。私の主なポイントは、クッキーは、HTMLページに埋め込まれたトークンよりも不正なクライアントによって偽装するのが難しいことです。 – Perception
ちょっとしたセマンティクス。リクエストは通常、JSPを表示するブラウザから作成されます。別のプログラムがあなたのJSPをリクエストするのを止め、何か情報を使ってリクエストすることはできません。
ユーザーのブラウザで表示されている別のWebページを、サイトへの要求の実行を停止することができます。これはCross-site request forgeryと呼ばれます。このシナリオを緩和することができます。
あなたが防止しようとするものによっては、CSRFソリューションが役立つかもしれません。 Webサーバーからプレマイドソリューションを見つけることができます。たとえば、ここにはTomcat's
- 1. 誰かが電話をかけたときに電話を終了する
- 2. アンドロイドハウツが話していないのに電話をかける
- 3. jquerymobileがウェブや電話アプリに使用していますか?
- 4. 私は、Windowsの電話7に新しいです、Windowsの電話7
- 5. 左のボタンを押すと電話がかかり、私に連絡します
- 6. 私はviewdidLoadで電話したい
- 7. noiseAlertアプリが私の携帯電話で動作していません
- 8. は、どのように私は私の非根ざしネクサス電話で(上のデバッグと)私のアンドロイドアプリケーションがインストールされている非根ざし電話
- 9. 私の電話は動いていませんが、GPSデータはまだ変化しています
- 10. Androidで誰かが電話するのを防ぐにはどうすればいいですか?
- 11. インターネット経由で電話から電話にデータを送信しますか?
- 12. 私はWindows 7の電話エミュレータに私の電話番号を表示したい
- 13. 誰が私のjavascriptメソッドを呼び出していますか?
- 14. 携帯電話がクリックして電話をかけないようにする - Rails、JavaScript
- 15. 私のアンドロイド携帯電話のマイクドライバにアクセスできますか
- 16. 誰かがJavaで話しているときに静止画を取得しようとしています
- 17. レスポンシブウェブサイト、CSSの種類は、私が電話で私のウェブサイトが応答したい
- 18. 電話:WebBrowserはパン/ズームwp7を無効にしますか?私はこのコードを使用しています
- 19. TwilioがSMSを受信して電話をかけます。
- 20. iOSで携帯電話ネットワークパケットをキャプチャしていますか?
- 21. 電話番号を使用して電話を探す
- 22. Paypalエクスプレスチェックアウトは、オプションをオフにしても電話番号を主張します(Magentoから電話する)
- 23. 加入電話が携帯電話か固定電話かどうかはどのように判断しますか?
- 24. アスタリスクを使用して携帯電話に電話をかける方法
- 25. 誰かに電話をかけてアンドロイドでオーディオファイルを再生する方法はありますか?
- 26. iOS、電話帳プッシュプラグイン( '通知')が発生していません
- 27. Linux:VI - 誰かが「コマンドモードキーシーケンス」と言うとき、彼らは何について話していますか?私のLinux VIの割り当ての1に
- 28. 電話がないVoiceXML
- 29. アンドロイド:電話が
- 30. 電話がメッセージ
ありがとうございました。私はjqueryを初めて使っていることを認めなければならないので、このアプローチが私の問題のために働くかどうかはわかりません。私のJSPでは、次のようなものがあります。[code type] "text/JavaScript"> ... var aMap = {"action": "getdata"} $ .getJSON( "/ MyServlet"、aMap、function(json ){// jsonの結果で何かする}}; [/ code]だから私はあなたが説明したようにトークンを渡す方法については明確ではない。ありがとうございました。 – Steve
ああ、Webサービスとしてサーブレットを使用しています。これは実際にあなたの質問に記載されているように "jQueryの投稿"ではありません。それは単なるGET要求です。正確にこれが呼び出されるのはいつですか?ページの読み込み中に1回だけ?または、ユーザーインタラクションで何回も使用できますか? – BalusC
混乱して申し訳ありません。実際には、javascriptタイマーに基づいて呼び出されます(ループ内のsetTimeoutメソッドを使用)。数秒ごとに、 "$ .getJSON ..."が呼び出され、返されたjsonオブジェクトに基づいてjspのステータスが更新されます。 – Steve