我正在尝试使用安全性开发上传文件功能,因为我的编程讲师要求我这样做。我以这样的方式实现它,它将检查文件的大小,文件格式和存在。除了检查文件的存在外,逻辑运行良好。例如,当我尝试上传已经存在的文件时,我不会收到一条消息,告诉我该文件已经存在,我不知道它为什么不起作用。
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语句中显示消息,即“Invalid File。”。的为什么吗
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\";
那么如何防止这个安全漏洞呢? ?有什么想法吗?
答案 0 :(得分:2)
您的代码存在逻辑问题。
在块中
for (int i = 0; i < validTypes.Length; i++)
每个文件总是运行两次
你可以做什么,将布尔变量设置为false。
进入循环,如果找到文件,则将boolean设置为true并使用break语句
在循环结束时,检查布尔值和相应的代码。
您可以像这样使用
而不是遍历数组string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos >- 1)
{
// the array contains the string and the pos variable
// will have its position in the array
}
string[] validTypes = { "bmp", "gif"};
string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);
int pos = Array.IndexOf(validTypes , ext );
if(pos>=0)
{
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);
}