如果我有一个web方法,在调用时删除文件,它接受三个参数(cNum,year和fileName).我是否需要担心这种方法的漏洞利用.我唯一能想到的就是..\..\..\用来进一步推动删除文件夹结构.这应该很容易删除.但还有什么我应该担心的吗?
[WebMethod(EnableSession = true,
Description = "Method for deleting files uploaded by customers")]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public Boolean deleteCustFiles(string cNum, string year, string fileName)
{
try
{
if (String.IsNullOrEmpty(cNum)
|| String.IsNullOrEmpty(year)
|| String.IsNullOrEmpty(fileName))
throw new Exception();
string path = Server.MapPath(@"~\docs\custFiles\"
+ year + @"\"
+ cNum + @"\" + fileName);
File.Delete(path);
}
catch
{
throw new Exception("Unable to delete file");
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
cas*_*One 12
我建议使用类上的GetFileName方法来清理filename参数,如下所示:Path
public Boolean deleteCustFiles(string cNum, string year, string fileName)
{
// Cleanse fileName.
fileName = Path.GetFileName(fileName);
Run Code Online (Sandbox Code Playgroud)
该GetFileName方法从路径中删除所有目录信息,这正是您要在此处执行的操作.
输入如下:
..\..\..\filename.ext
Run Code Online (Sandbox Code Playgroud)
你会得到:
filename.ext
Run Code Online (Sandbox Code Playgroud)
作为回报,您不必担心有人会注入一个会逃避您所定位目录的路径(假设此文件名是用户输入的,或者来自开放端点,其中有人可以输入他们想要的任何输入).
然后,您可以将自定义路径追加到fileName.
只有当你的所有文件都在一个预定义的目录中时,这才有效.
但是,这并不能处理删除用户无权访问的文件.如果文件属于该目录中的另一个用户,那么这里没有检查是否是这种情况(但是如果所有用户都有权删除这些文件,那么没关系).
此外,您可能希望使用类上的Combine方法Path来组合路径,如下所示:
string path = Server.MapPath(@"~\docs\custFiles\")
path = Path.Combine(path, year);
path = Path.Combine(path, cNum);
path = Path.Combine(path, fileName);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是.NET 4.0或更高版本,则可以使用将路径部分作为参数数组的Combine方法的重载:
string path = Path.Combine(
Server.MapPath(@"~\docs\custFiles\"),
year, cNum, fileName);
Run Code Online (Sandbox Code Playgroud)
最后,正如Shai指出的那样,如果可能(对于完整的解决方案),为了使这更加安全,您应该在文件系统级别启用权限.
如果您模拟用户或使用受约束的用户帐户来处理所有请求,则应该授予该用户仅访问~\docs\custFiles\目录(以及任何子目录)的权限 .
用户帐户应该无权访问该目录之上的任何内容.
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |