現在独学でLaravelを使用し、簡単な掲示板を作成しています。
掲示板を作成していくなかで、投稿や編集画面でフォームを作成する際formタグの中に@csrfを記載することで、CSRF攻撃を防げる機能がLaravelには備わっておりました。
CSRF攻撃とはそもそも何?というところから、@csrfと記載する事でどのような処理を行なってくれているのかという所までご紹介させていただきます。
理解を深める意味と備忘を兼ねて投稿をさせていただきます。
●そもそもCSRFとは
正式名称:cross-site request forgeries(クロスサイトリクエストフォージェリ)
CSRFとは、Webアプリケーションに存在する脆弱性、もしくはその脆弱性を利用した攻撃方法のことです。
ユーザーが悪意のあるURLにアクセスしてしまった場合に、意図しないリクエストを特定のWebサービスに送られてしまうというものです。掲示板であれば意図しない投稿や、オンラインバンキングであれば意図しない送金処理などが他者によって行われてしまうみたいですね。
恐ろしすぎる。。。
●@csrfについて
上記の攻撃を簡単に保護してくれるのが、@csrfです。
使い方は、
Laravelでformタグを記載した際は、必ず@csrfを記載する。
以上です。
簡単すぎます。
むしろ記載しないと419エラーが返ってきてしまいます。
行っている内容としては
Laravelはリクエスト毎にトークンと呼ばれるランダムな文字列を生成します。
クライアントは次回のリクエスト時に発行されたトークンをサーバーに送り返します。
サーバーはトークンを受け取り、発行したトークンと照合します。トークンの文字列が合致する場合、正当なユーザーからのリクエストとみなして処理を続行します。
①サーバーサイドで、40字のランダムな文字列データ(暗号)を生成します。 ※後でこの値とフォームから送られてくる_csrfの値を照合する
②暗号の値をセッションへ保存します
③暗号の値を読み取ります
@csrfを記載することで、
<input type="hidden" name="_token" value="Q9fYbbZYy8dK4p9RiMdfOsnDuTnwMTq91kAFbu60">
④ブラウザはリクエストを投げます
⑤サーバー側は暗号化して保持している値とリクエストのトークンの内容が一致するかをチェックします。
⑥チェックが完了したら、レスポンスヘッダーに、Cookieをセットしてブラウザに返す。
●被害実例
被害の一つとして 『横浜CSRF事件』 と呼ばれるサイバー犯罪が過去に存在するようです。
横浜CSRF事件では、CSRFの被害を受けたパソコンから、掲示板サービスに犯行の予告が書き込まれてしまいました。このリクエストを強要されたユーザーが誤認逮捕されてしまう事態が起きているそうです。
身に覚えのない投稿が自分のアカウントから書き込まれるなんて恐ろしすぎます。。
最後に
Laravelには標準で様々なディレクティブな用意されているので、今後もぜひうまく活用し製造の質とスピードを高めていきたいと思いました。