如何摆脱asp.net中的路径遍历问题?

时间:2018-04-17 09:25:12

标签: c# asp.net security web-applications

应用程序允许用户输入来控制或影响文件系统操作中使用的路径或文件名。此信息可进一步用于攻击可能导致敏感数据泄露和利用的应用程序。

如何在处理用户输入之前对其进行验证和清理。?

2 个答案:

答案 0 :(得分:1)

为避免路径遍历,您可以

  1. 为用户输入制作白名单(或限制), 例如,只允许用户输入特定的文件名,不包括“/”或“\”之类的字符等。

  2. 为系统文件夹配置适当的权限, 例如,将允许用户访问的资源文件放在特定文件夹中,并且只为该程序帐户授予该文件夹的权限。在这种情况下,系统可以帮助您防止路径遍历攻击。

答案 1 :(得分:0)

为了搜索者的利益,我已经制定了一个合理的起点来确定是否存在对文件的遍历尝试。这假定文件名类似于“somefile.pdf”,而不是“c:/tmp/somefile.pdf”。

/// <summary>
/// This is to guage whether someone is trying a directory traversal attack.
/// I.e. they should be requesting 'somefilename.pdf'
/// but they request '../anotherlocation/someotherfilename.pdf
/// </summary>
/// <param name="fileName">The file name to check</param>
/// <returns></returns>
public bool IsDirectoryTraversing(string fileName)
{
    bool isTraversing = false;

    if(String.IsNullOrWhiteSpace(fileName))
    {
        return isTraversing;
    }

    // Url decode to reveal sneaky encoded attempts e.g. '%2f' (/) or '%2e%2e%2f' (../)
    var decodedFileName = HttpUtility.UrlDecode(fileName);

    if(decodedFileName.Contains("/") || 
        decodedFileName.Contains(@"\") ||
        decodedFileName.Contains("$") ||
        decodedFileName.Contains("..") ||
        decodedFileName.Contains("?"))
    {
        isTraversing = true;
    }

    return isTraversing;
}