クロスサイトリクエストフォージェリ(CSRF)について色々と調べてみた

未分類

クロスサイトリクエストフォージェリ(CSRF)について色々と調べてわかったこと

クロスサイトリクエストフォージェリ(CSRF)とは

クロスサイトリクエストフォージェリ(CSRF)とは、
WEBアプリケーションの微弱性を利用した攻撃方法の一種です。

危険性

webアプリケーションにログイン中に、悪意のある第三者が用意したURLにアクセスしてしまうと、
不正な書き込みや誹謗中傷が行われてしまいます。

実際にそれで誤認逮捕になったケースもあるようです。

ユーザー側の対策

  • 不明なサイトやリンクにアクセスしない
  • 不要なときはなるべくログアウトする

開発者側の対策

すごく簡単に説明すると、

  1. 入力フォームのname属性に、PHPによってある決まったルールでランダム文字列を生成する
  2. 受け取ったフォームを処理する側で、「1」と同じルールでランダム文字列を生成する
  3. フォームの送信後、「1」「2」で生成したランダム文字列が一致したら処理を続行、異なったら処理を中止

ランダム文字列は、以下のように生成します。

echo hash('sha256', session_id());

ユーザーのセッション情報(sesseion_id())を、ランダム文字列生成のルールに組み込むことで、
そのユーザーのみのユニークなランダム文字列を生成することができます。

このハッシュメソッドを使って、具体的に書いてみると以下のようになる。

まずはHTML側。

<form action="〜" method="post">
    <input type="hidden" name="csrf_token" value="<?=hash('sha256', session_id())?>">
      :
</form>

そして、処理側(PHP)。

if ($_POST['csrf_token'] !== hash('sha256', session_id())) {
    // ハッシュ文字列が一致しない場合、処理を中止する処理を記述
}
// 一致して問題ない場合は、そのまま処理を続行

Laravelだと、このcsrf対策がとてもシンプルです。

以下のように、formタグ内に「@csrf」を記述すればOK。

<form action="〜" method="post">
    @csrf
   :
   :
</form>

参考:

コメント

タイトルとURLをコピーしました