请查看下面我写的代码:
private void WriteLogs(Guid _guid)
{
string varpath = ConfigurationManager.AppSettings["LogFilePath"].ToString() + @"ErrorLogsLogs";
string FileName = _guid.ToString() + ".txt";
string finalPath = System.IO.Path.GetFullPath(varpath + FileName);
if (Path.GetDirectoryName(finalPath) == Path.GetDirectoryName(varpath))
{
if (!Directory.Exists(varpath))
{
Directory.CreateDirectory(varpath);
}
// Other code
}
}
请让我知道这个代码是否可以防止目录遍历缺陷?
由于Guid
是唯一传入的东西,而Guid
不能是....
的形式,我认为您将安全免受目录遍历攻击。
唯一的其他输入是ConfigurationManager.AppSettings["LogFilePath"]
。这可能是X:Example..
的形式,但它也可能是X:
,所以我不认为这是一个问题。无论哪种方式,您都将把@"ErrorLogsLogs"
添加到您正在编写的路径中。
我还建议使用Path。结合起来,这样你就不会迷失在的
string varpath = Path.Combine(ConfigurationManager.AppSettings["LogFilePath"]
.ToString(), @"ErrorLogsLogs");
这是为我工作:
private bool IsValidPath(string fileNamePath)
{
if (string.IsNullOrWhiteSpace(fileNamePath))
return false;
var decodedPath = HttpUtility.UrlDecode(fileNamePath);
return decodedPath.IndexOfAny(Path.GetInvalidPathChars()) < 0 &&
decodedPath.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
fileNamePath.IndexOfAny(Path.GetInvalidPathChars()) < 0 &&
fileNamePath.IndexOfAny(Path.GetInvalidFileNameChars()) < 0;
}