フルスタックエンジニアのノウハウ
2021.05.08    2022.06.11

CSRFとは? サイバー攻撃&対策

この記事の動画版はこちら(画像クリックでYoutubeに飛びます)

チャンネル登録お願いします!


CSRFとは?


CSRFとは、クロス サイト リクエスト フォージェリの略で、Webアプリケーションに対するサイバー攻撃手法の1つです。



ログインしているユーザーに、不正なリンクを踏ませることで、あたかもそのユーザーが操作をしたかのように、Webアプリケーションに対して不正なリクエストを送信する攻撃手法です。


被害にあったユーザー本人は気付かないまま、例えば、SNSや掲示板にユーザー名義で不正な投稿が行われてしまったり、オンラインバンキングなどで身に覚えのない決済処理が行われてしまったりする危険性があります。



具体的な攻撃手法


CSRFの具体的な攻撃手法はこのようなイメージです。


ユーザーがWebアプリケーションにログインすると、そのブラウザはログイン状態となり、ログインしているユーザーだけが利用可能な機能を使える状態になります。


例えば、Twitterにログインすれば、自分のツイートを投稿したり、他のユーザーをフォローしたりできますよね。


ここまでは正常な動作です。


ここで悪意のある攻撃者は、このログイン状態のユーザーに、メールやSNSなどを利用して不正なリンクを踏ませます。


例えば、「面白い画像を見つけた」とか「プレゼントに当選しました!」とか「至急、口座の確認が必要です!」といったような、ユーザーの興味を引くような文面や、不安を煽るような文面で巧みにリンクをクリックさせるようにしてきます。


そして、このリンクには、Webアプリケーションに対して、勝手に投稿を行ったり、決済したりするような処理が仕込まれており、ログイン状態にあるユーザーがこれをクリックすることで、自分がWebアプリケーションに対してその操作を命令した状態になってしまいます。


この処理リクエストを受け取ったWebアプリケーションは、ユーザーからの正規のリクエストだと判断してしまい、実際にその処理が実行されてしまうという流れです。




CSRF攻撃は、特定のユーザーがメールなどで標的として狙われる場合もあれば、多くの人が使っているようなWebサービスの不正リンクをばらまき、不特定多数に罠を仕掛けるような手口もあります。



対策するには?


CSRF攻撃の対策方法を「ユーザー側」と「サービス開発側」の両面から解説します。



まず、ユーザー側の対策としては、怪しいリンクは絶対にクリックしないことです。


例えば、ショッピングサイトやネットバンキングからの本当に重要なお知らせであれば、サイトにも通知として表示されているはずですので、気になるようであれば、メールのリンクをクリックしてアクセスするのではなく、普段の手順で実際にサイトにログインして確認するようにしましょう。


また、リンクにマウスポインターを合わせると、ブラウザの画面下部にURLが表示されますので、怪しいドメインになっていないかどうかも1つの判断基準になります。




ただ、ぱっと見本物と見間違うようなドメインになっていたり、URLを表示させないようにしていたりするケースもあるので、ちょっとでも怪しいと思ったら絶対にクリックしないようにしましょう。


なお、メールの場合、Gmailを使っていれば、怪しいメールは自動的に迷惑メールフォルダに振り分けてくれたり、不正なリンクが含まれるメールにはこのような注意喚起をしてくれたりします。




ただし、これも完璧ではないので、これだけに頼らず自分でしっかり確認するようにしましょう。



次に、サービス開発側の対策としては、処理リクエストが「正規なアクセスなのかどうか」をチェックしてから処理を行う仕組みを導入します。


具体的にはこのようなイメージです。


例えば、投稿系の画面の場合は


まず、入力画面を表示する前に「ワンタイムパスワード」を発行します。

ワンタイムパスワードとは、その場だけで一時的に使われる暗号文字列です。


発行したワンタイムパスワードを、サーバー上のセッションと、入力画面のhiddenタグに保存しておきます。


処理リクエストが送信されたら、一緒に送られてくるワンタイムパスワードとサーバー上のセッションに保存されているワンタイムパスワードが一致しているかどうかを確認します。


一致していたら、正規のリクエストと判断して処理を続行し、一致していなかったら、不正なリクエストとして処理を中止する。



このような流れになります。


正規の方法で表示された入力画面しか、正しいワンタイムパスワードを保持していないため、CSRF攻撃によって送信された不正なリクエストは拒否されるという訳ですね。


これが基本の対策となりますが、さらにこれに加えて、リクエスト送信元のリファラーのチェックやreCAPTCHAの実装も行えば、セキュリティレベルはより高くなります。


※リファラーについてはこちら

関連記事

リファラーとは?

※reCAPTCHAについてはこちら

関連記事

スパムBOTを排除せよ!reCAPTCHAの実装方法


また、プログラム的な対処だけでなく、例えば決済など重要な処理を行う場合は、直前でもう一度パスワード入力を求めるような画面構成にしたり、重要な処理の完了直後にはユーザーに対して確認のための通知メールを送ったりといった設計上の対処も有効です。


ちなみに、今回説明したようなCSRF対策を実際にコーディングする手順については、講座の方でご説明しています。


講座では、自分で作ったWebアプリに対して、実際にセキュリティ実験を行いながら対策を施していきますので、興味があればぜひカリキュラムをチェックしてみてくださいね。



まとめ


・CSRFとは、クロス サイト リクエスト フォージェリの略でWebアプリケーションに対するサイバー攻撃手法の1つである。

・ログインしているユーザーに、不正なリンクを踏ませてあたかもそのユーザーが操作をしたかのように、Webアプリケーションに対して不正なリクエストを送信する攻撃手法である。

・ユーザー側の対策としては、怪しいリンクは絶対にクリックしないこと。

・サービス開発側の対策としては、ワンタイムパスワードの実装や設計上のセキュリティ対策を行うこと。



おすすめ記事