ディレクトリ・トラバーサルの対策は以下の記事を参照してください。
この一部を 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アプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。
コメント