LoginSignup
0
0

More than 3 years have passed since last update.

【Laravel】@csrf ←コイツの存在について

Posted at

はじめに

現場では主にモバイルアプリ開発(React Native, TypeScript)を行っているのですが、WEBアプリ開発(Laravel)にも3割くらい携わっています。
これまでなんとなくやってこれたのですが、振り返ってみるとよく理解せずに実装してきたところがいろいろありました。
例えば、タイトルの@csrfなどformを書く際のおまじない的な感じで書いてきましたが、何のための記述なのかよくわかっていませんでした。

言語のスキルをいくら高めてようとしても、基礎理解がおろそかなままだとレベルの上限があります。
ということで、これまで理解がふわふわだったところを一個ずつまとめていくことにしました。

この記事の対象読者

  • CSRFについて知りたい方
  • Laravelの@csrfが何を行っているのかを知りたい方

Cross Site Request Forgery (CSRF)

Cross Site Request Forgery(CSRF)は、WEBアプリケーションが偽装されたリクエストを正規のものとして受信してしまう脆弱性、または攻撃手法を意味します。

例えば、とあるWEBアプリでパスワードを変更するためのフォームがあったとします。
CSRFの対策がされていないと、以下の流れでそのアプリにログインするためのパスワードが書き換えられてしまう恐れがあります。

  1. 見知らぬリンクが記載されたメールが送られてくる
  2. メールを開いてリンクをクリックしてしまう
  3. リンクにパスワード変更のフォームが組み込まれており、WEBアプリにリクエストが送られてしまう
  4. WEBアプリのログインパスワードが変更されてしまう

スクリーンショット 2021-04-25 13.44.11.png

ユーザの気が付かないうちに偽装されて送信されたパスワード更新のリクエストが、そのままWEBアプリ側で受け付けてしまうのが問題だということですね。

つまり、CSRF対策というのは、このようなリクエストがブロックされるような仕組みをつくることと同義ということになります。

@csrfって何?

@csrfというのは、CSRFトークンを利用したLaravelにおけるCSRF対策の一つです。

Laravelでは、アプリケーションによって管理されているアクティブなユーザーの各セッションごとに、CSRFトークンを自動的に生成します。
@csrfをformに加えることで、リクエストが送信されたときにCSRFトークンが生成され、セッションに保存されたトークンと一致するかどうかをVerifyCsrfTokenミドルウェアが確認してくれます。

トークンが一致しない場合にはリクエストをブロックするため、このようにして悪意のあるリクエストからアプリを守ってくれるようになっています。

<form method="POST" action="{{ route('login') }}">
  @csrf //CSRFトークンを付与
  ...      
</form>

おわりに

これからLaravelのアウトプットもやっていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0