CSRFのワンタイムトークンって意味があるのでしょうか?
ajaxで攻撃先のhtmlを取得してトークンを取り出しpostすれば攻撃が成立してしまいませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
php等で攻撃先サイトのhtmlを取得するプログラムを攻撃用サイトと同じドメインに置けばajaxでトークンを取得できませんか?
はい,出来ます.PHP使えるくせにサブドメイン割り振らずにパスだけ割り振ってるホスティングサイトありましたよね.パスワード流出とかで大問題になってた国内の某企業.www1
www2
などアカウント取得時期によってサブドメインは別のものになっていましたが,同一サブドメインの中ではいとも簡単にCSRFが成立するでしょう.**「セッション用CookieのPath属性指定すればいいんじゃないの?」**と思うかもしれませんが,この指定にはセキュリティ的な意味は無いことが知られています.
なので,そもそも**「サブドメインを個人に割り振っていないホスティングサイトにセキュリティを求めてはいけない」**というところに帰着します.
ちなみにワンタイムにする意味はあまりありません.ワンタイムトークンは多重送信を防ぐ役割を併せ持ちますが,汎用性・利便性を考えると固定トークンのほうが望ましいケースが多いです.例えばPHPならこんな感じの実装があるんじゃないでしょうか.
php
1class CsrfValidator { 2 3 const SALT_ENV_NAME = 'TOKEN_SALT'; 4 const HASH_ALGO = 'sha256'; 5 6 public static function generate() 7 { 8 if (session_status() === PHP_SESSION_NONE) { 9 throw new \BadMethodCallException('Session is not active.'); 10 } 11 $salt = getenv(self::SALT_ENV_NAME); 12 if ($salt === false) { 13 throw new \BadMethodCallException('Environment variable ' . self::SALT_ENV_NAME . ' is not set.'); 14 } 15 return hash(self::HASH_ALGO, session_id() . $salt); 16 } 17 18 public static function validate($token, $throw = false) 19 { 20 $success = self::generate() === $token; 21 if (!$success && $throw) { 22 throw new \RuntimeException('CSRF validation failed.', 400); 23 } 24 return $success; 25 } 26 27}
投稿2016/03/24 17:42
編集2016/03/24 18:11総合スコア5223
0
それができないよう、Ajaxでは同オリジンルールといって他サイトからデータを取得できないようになっています。
投稿2016/03/24 14:50
総合スコア5568
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/24 15:08
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/03/25 06:37