ASP.NET MVCを用いたセキュリティ設定を調べてみました。
1.ユーザ権限管理
MVCフレームワークには、標準でアカウント画面が付いています。
これを利用し、特定のユーザのみ、サービスにログインできるようにしてみます。
手順は、コントローラのCreateアクション等にロールを設定するだけです。
1)アプリケーション管理ツールを使用してユーザを作成します。
→VS2008ではメニューのプロジェクト→ASP.NET構成で起動できます。
2)ロール「Admin」を作成し、Adminに属したユーザ「admin」を作成します。
3)コントローラの遷移先アクションに、ロールを設定します。
→Authorize属性でロール「Admin」を指定しています。
// // GET: /Address/Create [Authorize(Roles = "Admin")] public ActionResult Create() { return View(); }
以上で設定は終わりです。早っ(笑)
ロールを設定した画面へアクセスすると、ログオン画面が表示されます。
ログオン後、サービスへ入れるようになります。
以下蛇足になりますが、上記のユーザ管理情報は、プロジェクトの¥App_Data¥ASPNETDB.MDFファイルにSQL Serverファイル形式で保持されていますが、セキュリティ管理のしやすいDBサーバーに移行することも可能です。
※以下のサイトが大変参考になりましたm(_ _)m
→どっとねっとふぁんBlog : レンタルサーバでログインコントロールを利用する
2.リクエスト元検証
リクエスト元が、必ず特定の所であることをチェックします
※登録処理であれば指定の登録画面がリクエスト元であるか等
チェック方法として、リクエスト元でトークンを生成・ポストし、リクエスト先でトークンをチェックする感じです。
まず、リクエスト元のビューにトークンを生成するコードを埋め込みます。
<p> <%= Html.AntiForgeryToken() %> <input type="submit" value="Create" /> </p>
AntiForgeryTokenメソッドで、トークンをポストする隠しタグを生成します。
HTMLソースを覗くと下記のような感じで出力されていました。
<input name="__RequestVerificationToken" type="hidden" value="HxtOUtturWYbv8T8kz/fpQMfPUP50dictKYTkyKX/dF/BCyTuhTj6J8Z20l8/WZ73SefSoZPk61fiC2Mfnb+rw==" />
次に、コントローラのアクション側に、トークンを受け取りチェックする属性を付与します。
指定のアクションに、ValidateAntiForgeryToken属性を追加して終わりです。
// // POST: /Address/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(Address ad, FormCollection collection) {
実際に不正アクセスして弾かれるか確認したい!という方は以下の方法で確認できます。
※CSRF対策を有効化~という部分を参考
→第4回 フィルタ属性による認証/キャッシュ/セキュリティ対策の実装 - @IT
3.クロスサイト スクリプティング阻止
スクリプトタグ等が混入された文字列を無害化する方法です。
詳細画面等でコントローラから受け取った値をダイレクトで出力せずに、 Html.Encodeにてエンコード済み文字列を出力するようにします。MVCフレームワークを使用し詳細画面を生成した場合は、デフォルトで下記のように記載されています。
<%= Html.Encode(Model.name) %>
4.SQLインジェクション阻止
LINQを使用すれば防げます(詳細は以下のサイト参照)。
→ASP.NET MVCのセキュリティ対策とクライアントサイドスクリプト活用方法
5.エラー画面変更
デフォルトのエラー画面ではエラー個所のソースコードが丸見えになってしまうので、自分で作成した画面に差し替えて隠ぺいいます。
以下に、カスタムエラー画面を表示しつつエラーログを出力する方法がわかりやすく紹介されています。
→[ASP.NET MVC]例外フィルタをカスタマイズするには?[3.5、C#、VB]
セキュリティ絡みで必要なものがあれば、後で自分が忘れないよう追記する予定です。