CSRFとは「Cross-Site Request Forgery(リクエスト強要)」の略で、Webアプリケーションの脆弱性を利用した攻撃手法の1つです。またこの攻撃を受ける可能性のある脆弱性のことを指すこともあります。
CSRFの脆弱性を持つWebサイトがこの攻撃を受けた場合、Webアプリケーションが利用者の意図しない処理を実行してしまう可能性があります。その結果、意図しない書き込みが行われる、オンラインショップに意図しない発注が行われる、ユーザ設定が勝手に変更される、等の被害が発生する危険性があります。
CSRFは以下の手順で行われます。
(1) 攻撃者は特別に公開した攻撃のためのWebページに攻撃対象サイトの利用者を誘導します。利用者に表示されるこのWebページは、一見無害であるように偽装されていることが多いのです。
(2) 利用者が偽装されたボタンをクリックすると、攻撃対象サイトに対する書き込みリクエスト(POSTリクエスト)が実行されます(ページにアクセスしただけでリクエストが実行される攻撃ページの作成も可能です)。
(3) 攻撃対象サイトはこの書き込みリクエストを受け、利用者が意図しない処理を実行します。この利用者が攻撃対象サイトにログインした状態の場合には、Webアプリケーションは「利用者本人による操作」であるとみなし、処理を実行することになります。
WebアプリケーションでCSRFの被害を防止するには、利用者から送られてきたPOSTリクエストが正規のリクエストであるか否かを確認する必要があります。そのための代表的な手法として知られているのが「nonce」と呼ばれるものです。これは「number used once」の略で、1回だけ使われる識別情報を意味します。ワンタイム トークンと呼ばれることもあります。
一般的なWebアプリケーションは、POSTリクエストを受ける前に必ず、GETリクエストによるフォーム表示を行っています。このGETリクエストに対してフォームを送る際に、外部からは推測できない情報(nonce)を埋め込んでおきます。WebブラウザからPOSTリクエストが来た時には、このnonceが含まれていること確認します。正しいnonceが含まれていないPOSTリクエストをブロックすれば、CSRFを防止できます。
現在では多くのWebアプリケーション開発フレームワークが、この機能を提供しています。