我的代码是否阻止c#中的目录遍历?

本文关键字:遍历 代码 是否 我的 | 更新日期: 2023-09-27 18:18:04

请查看下面我写的代码:

private void WriteLogs(Guid _guid)
{
string varpath = ConfigurationManager.AppSettings["LogFilePath"].ToString() + @"'ErrorLogs'Logs'";
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
}
}

请让我知道这个代码是否可以防止目录遍历缺陷?

我的代码是否阻止c#中的目录遍历?

由于Guid是唯一传入的东西,而Guid不能是..'..'的形式,我认为您将安全免受目录遍历攻击。

唯一的其他输入是ConfigurationManager.AppSettings["LogFilePath"]。这可能是X:'Example'..的形式,但它也可能是X:',所以我不认为这是一个问题。无论哪种方式,您都将把@"'ErrorLogs'Logs'"添加到您正在编写的路径中。

我还建议使用Path。结合起来,这样你就不会迷失在'

string varpath = Path.Combine(ConfigurationManager.AppSettings["LogFilePath"]
                     .ToString(), @"ErrorLogs'Logs");

这是为我工作:

 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;
    }