Laravel5.8の
@csrfってなに?
<form method="POST" action="/profile">
@csrf
...
</form>
Laravelではテンプレートで(View側で)上記のような記述をします。
しかし@csrfとだけかかれていてもどういう処理になっているのかさっぱりですよね。
ぼくもさっぱりわからないので、まとめてみます。
まずLaravelの@csrfは、クロス・サイト・リクエスト・フォージェリ(CSRF)からアプリケーションを簡単に守ることができるものです。
CSRF攻撃の詳細な説明は省きます。
各自調べておいてね。(最後にwikiから引用して少しだけ説明してるよ)
##@csrfでどうやって守るの?
めっちゃ簡単です。
POSTリクエストを送るときに@csrfを書くだけです。というか書かないと送信時にエラーになります。
Laravelでformタグを書いたら脳死で@csrfを書きましょう。
それだけです。
@csrf を記述した箇所には次のような input 要素が出力されます。
<input type="hidden" name="_token" value="loiuhJKkjhUI664hjgk6jhg6fjg675JHGGOogo">
inputタグですがhiddenになっているのでサイト上では見えないようになっています。
そしてこのvalue属性のランダムな文字列が CSRF トークンです。
このCSRFトークンを用いて自分のサイトからのPOSTリクエストだけを受け付けるようにします。
下記のような流れです。
CSRFトークン(ランダムな文字列)を発行し、セッションに保存。hidden属性でinputに埋め込む。これでリクエストを送るのと同時にトークンも送信することになるのでークンが含まれていて、かつセッションに入れた値と一致する場合のみ正規のリクエストとして受け入れることができます。
これで予期しない(悪意のある)POSTリクエストが送信されることを防ぎます。
##クロスサイトリクエストフォージェリとは
結局こいつは何?
ようは不正規のやりかたでHTTPリクエストを送信して攻撃することだよ。
wikipediaで見てみる。
攻撃者はブラウザなどのユーザ・クライアントを騙し、意図しないリクエスト(たとえばHTTPリクエスト)をWebサーバに送信させる。Webアプリケーションがユーザ・クライアントからのリクエストを十分検証しないで受け取るよう設計されている場合、このリクエストを正規のものとして扱ってしまい、被害が発生する。CSRF攻撃はURL、画像の読み込み、XMLHttpRequestなどを利用して実行される。
例まで書いてあった。以下引用
CSRF脆弱性を具体例を用いて説明する。 今ある銀行のWebサイト(標的サイト)にログインしているユーザALICEが自身の口座からBOBという別のユーザの口座に100ドルを送金する際、ALICEのブラウザから
GET http://bank.com/transfer.do?acct=BOB&amount=100 HTTP/1.1
というHTTPリクエストが銀行のWebサイトに向かって送信されるものとする.攻撃者MARIAは
http://bank.com/transfer.do?acct=MARIA&amount=10000 HTTP/1.1
というURLを公開掲示板に張ったり、不特定多数にメールしたりする
銀行のユーザALICEがこのURLをクリックしてしまうと、ALICEのブラウザから
GET http://bank.com/transfer.do?acct=MARIA&amount=10000 HTTP/1.1
というHTTPリクエストが銀行に向かって送信される[7]。この際たまたまALICEが銀行にログインしていたら、銀行のサーバはこのリクエストを送金要求だと解釈してしまい、ALICEの口座からMARIAの口座に一万ドルが不正送金されてしまう。
本来、銀行のサーバは、ALICEのブラウザから受け取ったHTTPリクエストが本当にALICE当人の意志で送られたものなのかをチェックし、チェックを通った時のみHTTPリクエストを受け付けるべきである。
しかし上述した銀行サーバのWebサイトの実装にはこのようなチェック機構は備わっておらず、これがMARIAにCSRF攻撃を可能にしてしまった原因である。
###参考にしたサイトさん
Laravelチュートリアル←Laravel始めたい人はこれからやるのがいい
Wikipedia-クロスサイトリクエストフォージェリ