はじめに
現場では主にモバイルアプリ開発(React Native, TypeScript)を行っているのですが、WEBアプリ開発(Laravel)にも3割くらい携わっています。
これまでなんとなくやってこれたのですが、振り返ってみるとよく理解せずに実装してきたところがいろいろありました。
例えば、タイトルの@csrf
などformを書く際のおまじない的な感じで書いてきましたが、何のための記述なのかよくわかっていませんでした。
言語のスキルをいくら高めてようとしても、基礎理解がおろそかなままだとレベルの上限があります。
ということで、これまで理解がふわふわだったところを一個ずつまとめていくことにしました。
この記事の対象読者
- CSRFについて知りたい方
- Laravelの
@csrf
が何を行っているのかを知りたい方
Cross Site Request Forgery (CSRF)
Cross Site Request Forgery(CSRF)は、WEBアプリケーションが偽装されたリクエストを正規のものとして受信してしまう脆弱性、または攻撃手法を意味します。
例えば、とあるWEBアプリでパスワードを変更するためのフォームがあったとします。
CSRFの対策がされていないと、以下の流れでそのアプリにログインするためのパスワードが書き換えられてしまう恐れがあります。
- 見知らぬリンクが記載されたメールが送られてくる
- メールを開いてリンクをクリックしてしまう
- リンクにパスワード変更のフォームが組み込まれており、WEBアプリにリクエストが送られてしまう
- WEBアプリのログインパスワードが変更されてしまう
ユーザの気が付かないうちに偽装されて送信されたパスワード更新のリクエストが、そのままWEBアプリ側で受け付けてしまうのが問題だということですね。
つまり、CSRF対策というのは、このようなリクエストがブロックされるような仕組みをつくることと同義ということになります。
@csrf
って何?
@csrf
というのは、CSRFトークンを利用したLaravelにおけるCSRF対策の一つです。
Laravelでは、アプリケーションによって管理されているアクティブなユーザーの各セッションごとに、CSRFトークンを自動的に生成します。
@csrf
をformに加えることで、リクエストが送信されたときにCSRFトークンが生成され、セッションに保存されたトークンと一致するかどうかをVerifyCsrfToken
ミドルウェアが確認してくれます。
トークンが一致しない場合にはリクエストをブロックするため、このようにして悪意のあるリクエストからアプリを守ってくれるようになっています。
<form method="POST" action="{{ route('login') }}">
@csrf //CSRFトークンを付与
...
</form>
おわりに
これからLaravelのアウトプットもやっていきます。