クロスサイトリクエストフォージェリ (CSRF) の対策と確認方法 | asp.net
- 2018/03/08
- 01:03
今回は asp.net において クロスサイトリクエストフォージェリ (cross-site request forgeries / CSRF) への対策方法についてご紹介いたします。
クロスサイトスクリプティング (cross-site scripting / XSS) となんとなく似ているワードですね。(ちなみに XSS ではスタイルシートのCSSと紛らわしいので、Cross=X と変更されたという逸話があります。)
尚、XSS では任意の JavaScript を埋め込みできてしまうことにより閲覧したユーザーに対してスクリプトが実行されてしまう危険性を含むことでしたが、CSRF ではサーバーがリクエストを十分に検証していない場合に、攻撃者が意図しないリクエストを送信することによって、正常なリクエストとして処理を実行できてしまう危険性の事を言います。

前提条件
・Windows 7 Professional 以降 / Windows Server 2008 R2 以降
・Visual Studio 2010 Professional 以降
・VB.NET
・.Net Framework 4.0 以降
1.対応方法
(対策1)ViewState にセッションIDを埋め込みます。
以下のように Page の Init イベントにセッションIDをビューステートに埋め込みます。マイクロソフト推奨とのことですが、完全ではありません。マスターページに埋め込むと全てのページに対して CSRF の対策が実装できるのではないでしょうか。
※下記サンプルコードは WebForm に対しての実装方法です。asp.net MVC などは別途実装方法があるようです。
Public Class Site
Inherits System.Web.UI.MasterPage
Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
'CSRF対策
Me.Page.ViewStateUserKey = Session.SessionID
End Sub
End Class
(対策2)
フォーム認証のパスワードを確認する画面を表示します。
決済時など何か登録・実行を促す際に、パスワードを求める画面を表示することにより不正なリクエストを排除することができます。Yahoo や Google などのアカウントはアカウントに関する情報を変更するページでは必ずログイン画面が表示されますね。
2.検証方法
大まかに説明しますとセッションハイジャックを行い、POST を実行すると以下のようなエラー出力を確認できます。ViewState に埋め込んだセッションIDをサーバー側で検査した結果が異なることからエラーが発生します。Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
※セッションハイジャックの方法は以前の記事「セッションハイジャック対策がされているか確認する方法」をご確認ください。
以下、検証手順詳細を記載ます。
(1)まずは正常なログインを行ったユーザーのセッションIDをコピーします。

(2)別のセッション(別のブラウザでも新しいタブで開いた別のセッションでも構いません。)でログインします。
(3)別セッションのログイン後にセッションIDを(1)でコピーしたセッションIDに置き換えます。(ここまではセッションハイジャックと同じ手順です。)

(4)WEBフォームに用意したボタン(SubmitでPOSTできるものなら何でも)を押下します。
(5)以下のように asp.net のエラーが出力されます。

ViewState にセッションIDを埋め込みしていない場合は、送信した POST がサーバー側で正常に受付され、セキュリティリスクとなります。
最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。
- 関連記事
-
- 複数のWebサイトを別セッションで管理する方法 | asp.net
- デフォルトページを設定してURL正規化を行う方法 | asp.net
- クロスサイトリクエストフォージェリ (CSRF) の対策と確認方法 | asp.net
- ルート相対参照を用いて共通してリンクを記述する方法 | asp.net
- '__o'は宣言されていません。アクセスできない保護レベルになっています。 | asp.net