ローカルのSQL Expressデータベースの情報を更新するために作成したHTTPハンドラがあります。相対URIパスを防ぐために文字列を消化する
ユーザーは、相対URIパス "/../../file.zip"をクエリ文字列として使用することができ、制限された領域外のファイルをダウンロードできる可能性があることを認識しました。
サイトはまだライブではありませんので、セキュリティ上の問題はありませんが、このようなことは避けてください。
入力クエリから「..」を削除する単純なstring.replace行を追加しました。
これを保護するためにここで行うべきことがありますか?
public void ProcessRequest(HttpContext context)
{
string filesPath = "C:/Downloads/";
string fileName = context.Request.QueryString["filename"];
fileName = fileName.Replace("'", "''").Replace("..", "").Replace("/", "").Replace("\\", "");
if (!string.IsNullOrEmpty(fileName) && File.Exists(filesPath + fileName))
{
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", fileName));
context.Response.WriteFile(filesPath + fileName);
//Do work to update SQL database here
}
else
{
context.Response.ContentType = "text/plain";
context.Response.Write(filesPath + fileName + " Invalid filename");
}
}
一般的に、有害なシーケンスを削除しようとするのではなく、無効な入力を拒否するべきです。あなたの置き換えが './ 'に何をするのかを考えてください。空のファイル名、先頭と末尾のドットとスペース、制御文字、 'SHORTN〜1.AME'と潜在的に予約されたファイル名(' com1'など)のような奇妙さを引き起こすパターンがたくさんあります。ファイル名に入力を使用することは、特にWindows(特に、Windows)(http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247(v = vs.85).aspx)では難しくなります。 (Jasonが示唆しているように)ローカルディスク上のファイル名に生成されたIDを使用することができれば。 – bobince
@bobinceそこに大きなヒント。これが私が質問した理由です。私がこのアプローチにもっと良い方法があることを知っていたので、私はちょうどこのような重要な問題について少しの指針を探していました。 –