Webセキュリティの小部屋

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

ディレクトリ・トラバーサル対策(ASP.NET,C#,VB.NET編)

ディレクトリ・トラバーサルの対策は以下の記事を参照してください。

この一部を ASP.NET(C#,VB.NET)で実現すると以下のようになります。

根本的対策

■ファイルを開く場合は、固定ディレクトリ+ファイル名にする

ファイル名を取得後、ディレクトリと結合してパスを作成します。

・C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace TestCS
{
  public partial class DirectoryTraversal : System.Web.UI.Page
  {

    protected void ButtonSubmit_Click(object sender, EventArgs e)
    {
      const string DIRECTORY_PATH = @"C:\Files\";

      //ファイル名取得
      string fileName = Path.GetFileName(@"..\..\..\hosts");
      
      //パス結合
      string path = Path.Combine(DIRECTORY_PATH, fileName);

      //表示
      TextBoxPath.Text = path;
    }
  }
}

・VB.NET

Imports System.IO

Public Class DirectoryTraversal
  Inherits System.Web.UI.Page

  Protected Sub ButtonSubmit_Click(sender As Object, e As EventArgs) Handles ButtonSubmit.Click
    Const DIRECTORY_PATH As String = "C:\Files\"

    'ファイル名取得'
    Dim fileName As String = Path.GetFileName("..\..\..\hosts")

    'パス結合'
    Dim myPath As String = Path.Combine(DIRECTORY_PATH, fileName)

    '表示'
    TextBoxPath.Text = myPath

  End Sub
End Class

実行結果は以下のようになります。

C:\Files\hosts

保険的対策

■ファイル名のチェックを行う
正規表現で、パスに含まれる「/」、「../」、「..\」をチェックします。

・C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Text.RegularExpressions;

namespace TestCS
{
  public partial class DirectoryTraversal : System.Web.UI.Page
  {
    protected void ButtonSubmit_Click(object sender, EventArgs e)
    {
      //ファイル名
      string fileName = @"..\..\..\hosts";

      //正規表現でチェック
      string result =
        Regex.IsMatch(fileName, @"(/|\.\./|\.\.\\)") ? "true" : "false"; 

      //表示
      TextBoxResult.Text = result;
      
    }
  }
}

・VB.NET
※If 演算子は Visual Studio 2008から。

Imports System.Text.RegularExpressions

Public Class DirectoryTraversal
  Inherits System.Web.UI.Page

  Protected Sub ButtonSubmit_Click(sender As Object, e As EventArgs) Handles ButtonSubmit.Click

    'ファイル名'
    Dim fileName As String = "..\..\..\hosts"

    '正規表現でチェック'
    Dim result As String = _
      If(Regex.IsMatch(fileName, "(/|\.\./|\.\.\\)"), "true", "false")

    '表示'
    TextBoxResult.Text = result

  End Sub
End Class

実行結果は以下のようになります。

true

参考

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


スポンサーリンク





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

コメントを残す

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

CAPTCHA