質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1169閲覧

CSRF対策の実装を理解したい

k499778

総合スコア599

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

3クリップ

投稿2018/01/15 12:42

編集2018/01/15 12:43

現在Webアプリを作っていてCSRF対策を実装します。

作りとしてトークンを設定する方法なのですが、いまいちなぜその実装をするとなぜ不正リクエストを防げるのか理解できていません。
その理解の手助けをしていただきたいです。

実装といたしましては、初期表示時にHTMLにトークンをhiddenで設定し、また同じ値をサーバーサイドでsessionで管理します。
更新ボタン押下後、HTMLのトークンをサーバーサイドに渡し、sessionで管理しているトークンの値と一致していれば処理を進めて、一致していなければエラーで返します。

ただそうすることでなぜCSRF対策になっているのかわかっていません。

私の知っているのCSRFによる攻撃の事例は、「はまちゃん問題」のようにmixiで不正なURLが表示されていてそれを踏んだユーザーが日記を投稿してしまうというものです。あとは悪質なページが用意されていてそこに遷移させられるといったような。

hidden値を書き換えられた時にちゃんとエラーになる実装ではあると思うのですが、
上記の事例がなぜ防ぐ理由になるかわかりません。

もし分かる方がいらっしゃれば教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

https://teratail.com/questions/108091
での回答の繰り返しになります。すべてのセキュリティ対策に共通のことですが、対象となる脅威について具体的に考えて見る必要があります。

脅威

CSRF攻撃によってユーザの意図しない更新処理が行われてしまう。

方法

以下の手順が成立すると攻撃が成功する

  1. ユーザが攻撃対象のサイトにログインする(ブラウザに Cookie がセットされる)
  2. 悪意のあるサイトの運営者がユーザに攻撃ページを開かせる
  3. 攻撃ページに隠しの form を埋め込みスクリプトで submit する→このフォームは更新処理を行うPOSTであり、Cookieも付与されているので、攻撃対象のサイトがリクエストを受け入れてしまい、更新が行われてしまう

ここで、注意が必要なのは、 1. の手順でユーザがログインしている場合にのみ攻撃が成立するという点です。悪意のあるサイトを踏ませてもユーザがログインしていなければ未認証のエラーになるだけです。

防御方法

実装といたしましては、初期表示時にHTMLにトークンをhiddenで設定し、また同じ値をサーバーサイドでsessionで管理します。
更新ボタン押下後、HTMLのトークンをサーバーサイドに渡し、sessionで管理しているトークンの値と一致していれば処理を進めて、一致していなければエラーで返します。

このとおりです。ここで、「サーバサイドで session で管理します」となっていますが、その session はユーザがログインしたときに作られたものであり、ログイン時にブラウザにセットされた Cookie に結び付けられています。CSRF攻撃はこのCookieが悪意のあるサイトからのリクエストにも付与されることで成立しますのが、 session に結び付けられているトークンの値を外から知ることはできないので、上記手順で防御できるわけです。

もう一点、この防御方法が前提としているブラウザの仕様があります。それは、CSRF攻撃で単発のリクエストを発行することはできても、その結果を参照したり操作したりすることはできないということです。「初期表示時にHTMLにトークンをhiddenで設定し」→「更新ボタン押下後、HTMLのトークンをサーバーサイドに渡す」の2つのリクエストを攻撃サイトが連続して発行することができてしまうと、上記防御は成り立ちませんが、初期表示のリクエストはできても、そこから(たとえば、 javascript から form の submitするなどにより)「更新ボタン押下」を実行することはできません。従って、悪意のあるサイトからトークンの入ったリクエストを送ることはできないわけです。

投稿2018/01/16 00:35

編集2018/01/16 01:52
mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2018/01/17 09:47

回答ありがとうございます。丁寧に書いてくださって感謝いたします。熟読します。
guest

0

  • 「予め罠を仕掛けたページ」にフォームを用意しておき、アクセスされた瞬間JavaScriptでサブミットする手法の場合

たとえ罠ページでトークンの値をセットしても、サーバーにトークンの値がセットされていないのでリクエストは通らず、セッションの値と送られてきた値を検証するときにはじかれます。確かこっちがmixiの件で使われた方法だったと思います(違ったらすいません)。

  • iframeを使う場合

CORSの制約でそもそも困難かなと思います。

投稿2018/01/15 23:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2018/01/17 09:47

回答ありがとうございます。 悪質ユーザーが値を設定するのはフロント側なんですね。(もちろんサーバー側までは触れないため) そこに我々が設定したのと同じトークンを設定するということですか。あるいはもっと大量のトークンを用意して。 悪質ユーザーは彼らが作ったサーバー側に飛ばすことはできないんですか?
退会済みユーザー

退会済みユーザー

2018/01/17 11:25

> そこに我々が設定したのと同じトークンを設定する 攻撃対象のページにアクセスしたときのトークンが予測できるのであれば、攻撃が成立するケースもあります。 > あるいはもっと大量のトークンを用意して... 大量のトークンを用意して総当りのようなことも可能だと思いますが、トークンの文字数によっては組み合わせが膨大になるなど、効率の面で不都合があるため現実的ではない方法だと思います。
k499778

2018/01/17 22:57

回答ありがとうございます。現実的ではないんですね。理解しました。
guest

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2018/01/15 22:51

資料提供ありがとうございます。しかし、やはりわかりづらい部分があります。質問の趣旨である、セッションidとHTMLのidを使う意図が理解しきれていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問