プログラミングのインストラクターから頼まれたので、セキュリティ付きのファイルアップロード機能を開発しようとしています。サイズ、ファイル形式、ファイルの有無を確認できるように実装しました。ファイルの存在をチェックすることを除いて、ロジックはうまく機能していました。たとえば、すでに存在するファイルをアップロードしようとしても、ファイルがすでに存在していることを通知するメッセージが表示されず、なぜ機能しないのかわかりません。
protected void UploadFile(object sender, EventArgs e)
{
if(FileUpload1.HasFile)
try
{
string[] validTypes = { "bmp", "gif"};
string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);
if (size < limit)
{
for (int i = 0; i < validTypes.Length; i++)
{
if (ext == "." + validTypes[i])
{
string path = @"~\Images\";
string comPath = Server.MapPath(path + "\\" + FileUpload1.FileName);
if (!File.Exists(comPath))
{
FileUpload1.PostedFile.SaveAs(comPath);
Label1.Text = "File uploaded";
}
else
{
Label1.Text = "Existed";
}
}
else
{
Label1.Text = "Invalid File." + string.Join(",", validTypes);
}
}
}
else
{
Label2.ForeColor = System.Drawing.Color.Red;
Label2.Text = "file is heavy";
}
}
catch (Exception ex)
{
Label2.Text = "The file could not be uploaded. The following error occured: " + ex.Message;
}
}
コードをデバッグしたところ、elseステートメントが実行されることがわかりましたが、ユーザーに表示する代わりに、外側のelseステートメントに「無効なファイル」というメッセージが表示されます。なんで?
if (ext == "." + validTypes[i])
{
string path = @"~\Images\";
string comPath = Server.MapPath(path + "\\" + FileUpload1.FileName);
if (!File.Exists(comPath))
{
FileUpload1.PostedFile.SaveAs(comPath);
Label1.Text = "File uploaded";
}
else
{
Label1.Text = "Existed";
}
}
else
{
Label1.Text = "Invalid File." + string.Join(",", validTypes);
}
また、私のインストラクターは、次の行がパストラバーサルと呼ばれる脆弱性を引き起こすと私に言いました。
string path = @"~\Images\";
では、このセキュリティホールを防ぐ方法は??何か案は?