Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら RSSフィードのご登録はこちらから
公開日:2013年3月16日
最終更新日:2020年8月13日

クロスサイト・スクリプティング(XSS)対策(ASP.NET,C#,VB.NET編)

クロスサイト・スクリプティング(以下、XSS)の対策は以下の記事を参照してください。

これを ASP.NET で実現すると以下のようになります。

要求検証

ASP.NET では、XSS などの危険な文字列が入力されると要求検証により、以下のようなエラー画面を表示して XSS などの攻撃を防ぎます。

pic01

要求検証は基本的にデフォルトのまま有効にしておくべきです。この記事でも、要求検証を有効にしている前提で説明をします。

しかし、要求検証のために入力できない文字があるケースでは、要求検証を無効にする必要があります。その場合は、要求検証を無効にすることが可能です。要求検証の無効は、全体に対してでなく、特定のページに対してのみ行うようにします。なお、ASP.NET 4 以降とそれ以前とでは要求検証を無効にする方法が異なります。詳しくは以下のサイトの記事を参照してください。

根本的対策

■1.HTTP レスポンスヘッダーに文字コードを指定する

ASP.NET のデフォルトでレスポンスヘッダーの Content-Type は UTF-8 になっています。ですので、何も設定しない状態だと Content-Type は以下のように設定されます。

Content-Type: text/html; charset=utf-8

デフォルトで問題ないのですが、明示的に指定したい場合は、web.config で以下のように設定します。

<globalization
  fileEncoding="utf-8"
  requestEncoding="utf-8"
  responseEncoding="utf-8"
/>

これを Shift-jis で指定する場合は以下のように設定します。

<globalization
  fileEncoding="shift-jis"
  requestEncoding="shift-jis"
  responseEncoding="shift-jis"
/>

するとレスポンスヘッダーの Content-Type は以下のようになります。

Content-Type: text/html; charset=shift_jis

■2.HTML 要素の属性は""(ダブルクオーテーション)で囲む
これはそのままですが、HTML の属性は''(シングルクォーテーション)ではなく、""(ダブルクオーテーション)で囲むようにしてください。ASP.NET のコントロールであれば、デフォルトで""(ダブルクオーテーション)になっています。

<a href="https://www.websec-room.com/">Webセキュリティの小部屋</a>

■3.出力する全ての要素に対してエスケープ処理を行う
ASP.NET でエスケープ処理を行う方法は、ASP.NET 4以降とそれ以前で方法が異なります。

・ASP.NET 4 より以前
HttpUtility を使用して手動でエスケープを行います。

<%=HttpUtility.HtmlEncode("<script>alert(document.cookie)</script>") %>

・ASP.NET 4 以降
<%: %> コードナゲットを使用すればデフォルトでエスケープされます。

<%: "<script>alert(document.cookie)</script>" %>

■4.URL は「http://」か「https://」で始まるもののみ出力する
URL 判定の実装例は以下のようになります。

・C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text.RegularExpressions;

namespace TestCS
{
  public class Xss
  {
    public static bool IsUrl(string url)
    {
      if (Regex.IsMatch(url, "^http://")
        || Regex.IsMatch(url, "^https://"))
      {
        return true;
      }
      else
      {
        return false;
      }
    }
  }
}

・VB.NET

Imports System.Text.RegularExpressions

Public Class Xss
  Public Shared Function IsUrl(url As String) As Boolean
    If Regex.IsMatch(url, "^http://") _
      Or Regex.IsMatch(url, "^https://") Then
      Return True
    Else
      Return False
    End If
  End Function
End Class

■5.<script></script> 要素の内容を動的に生成しない
これはそのままですね。

保険的対策

■1.入力値のチェックを行う
XSS で危険な文字である、&<>"'が文字列に含まれているか正規表現でチェックする実装例です。

・C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text.RegularExpressions;

namespace TestCS
{
  public class Xss
  {
    public static bool HasXssChars(string str)
    {
      if (Regex.IsMatch(str, "[&<>\"']"))
      {
        return true;
      }
      else
      {
        return false;
      }
    }
  }
}

・VB.NET

Imports System.Text.RegularExpressions

Public Class Xss
    Public Shared Function HasXssChars(str As String) As Boolean
        If Regex.IsMatch(str, "[&<>""']") Then
            Return True
        Else
            Return False
        End If
    End Function
End Class

■2.Cookie に HttpOnly 属性を付与する
Cookie に HttpOnly 属性を付与するには、以下のように記述します。

・C#

HttpCookie cookie = new HttpCookie("key", "value");
cookie.HttpOnly = true;
Response.SetCookie(cookie);

・VB.NET

Dim cookie As HttpCookie = New HttpCookie("key", "value")
cookie.HttpOnly = True
Response.Cookies.Add(cookie)

なお、ASP.NET のセッション ID には、ASP.NET 2.0 から HttpOnly 属性が付与されるようになりました。詳しくは、以下の記事を参照してください。

■3.Trace メソッドを無効化する
IIS7.5 では Trace メソッドを実行すると、デフォルトでエラーが発生するようになっています。

・HTTP リクエストヘッダー

TRACE http://localhost/ HTTP/1.0
Host: localhost
Content-length: 0

・HTTP レスポンスヘッダー

HTTP/1.1 501 Not Implemented
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
X-Frame-Options: DENY
Date: Sat, 16 Mar 2013 10:45:59 GMT
Connection: close
Content-Length: 5770

参考

Webアプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。


スポンサーリンク





カテゴリー:Webアプリケーションセキュリティ対策

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA