清理字符串以防止相对URI路径
本文关键字:相对 URI 路径 字符串 | 更新日期: 2023-09-27 18:08:40
我创建了这个HTTP处理程序来更新本地SQL Express数据库中的信息。
我意识到用户可以使用相对URI路径"/../../file.zip"作为查询字符串,并且可以下载受限制区域之外的文件。
这个网站还没有上线,所以现在还不是一个安全问题,但是我真的很想防止这样的事情发生。
我添加了一个简单的字符串。替换从输入查询中删除任何".."的行。
我还应该做些什么来确保这个吗?
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");
}
}
我通常使用这个简单的代码来检查这个问题:
(我直接键入它,所以它可能无法编译,只是给你一个概念)
private string getPath(string basePath, string fileName)
{
var fullPath = System.IO.Path.GetFullPath(System.IO.Path.Combine(basePath, fileName));
if (fullPath.StartsWith(basePath))
return fullPath;
return null;
}
目标是使用Path.GetFullPath
。这个方法将翻译任何/../etc到完整的路径。然后检查返回的路径是否在允许的目录中。
请注意,此方法可能返回与预期略有不同的路径,请阅读MSDN获取详细解释
您可以让Request.QueryString["filename"]
实际上是一个表示文件的键。如果您不希望用户能够轻松猜测文件密钥,则密钥可以是数字或随机字符串。您可以将映射存储在数据库中,并使用该键检索本地文件名(如果您希望使两者不同并真正隐藏实现细节,则可以使用显示文件名)。