2016-11-29 1 views
0

私はSpring CSRF保護の仕組みをよりよく理解しようとしています。人々が候補者に投票できる場所https://example.com/があるとします。ユーザーはメッセージを交換することもできます。私もログインしているユーザーと、リンクhttps://example.com/vote/candiate/30をクリックするとメッセージを送る別のユーザーがいます。Spring CSRF保護シナリオ?

ユーザがこのリンクをクリックすると、ブラウザはCSRFトークンとログインしたユーザのセッションIDの両方を送信しないため、CSRF保護チェックをバイパスしませんか?

答えて

2

理由リンクは通常ですが、CSRFに関する問題はありません。CSRFは要求が変更された場合にのみ問題になります。リンク(GETリクエスト)は何も変更すべきではありません。それがあなたの例のように私が想定している候補者に投票を加えると、外部の起源(別のウェブサイト)からのリンクも、そのURLにリンクするだけで "通常の" CSRFを利用することができます。

この例の問題は、SpringでCSRF保護が不十分であるということではなく、この場合の投票はGET要求であり、GETは通常CSRFに対して設計保護されていないという点です。解決策は、投票要求をPOSTに変更することです。このPOSTはCSRFに対して保護されます(さらにRESTfulなbtwになります)。

+0

スプリングコントローラが、https://example.com/vote/candiate/30スタイルURLのポストリクエストを受け入れるエンドポイントを実装しているとします。このURLはCSRFで保護されますか? – Ole

+1

OK - 私は今それを得ると思います。ブラウザは、リンクをクリックしたときにget要求を発行します。get要求を使用して状態を更新するコントローラエンドポイントを実装していない限り、すべて正常です。 – Ole

0

主なアイデア: リクエストが送信されると、サーバーは特別なCookieを受信し、このCookieで定義された値を待機します。この値が異なる場合、要求は失敗するはずです。 したがって、このフォームにはパラメータが含まれており、フォームが送信されたときに受信すると予想されるパラメータが含まれており、このパラメータを指定せずにデータを送信すると、リクエストは処理されません。