发布于2026-07-11 阅读(0)
扫一扫,手机访问
先列出几个核心判断:
在C#里防目录遍历攻击,最靠谱的路径就是拿Path.GetFullPath做归一化,然后用它来校验。别指望靠字符串里找..或者拿正则替换就能搞定,那些手段在真实攻击面前基本是纸糊的。

规范做法就一条:归一化之后再做检查,光靠字符串过滤".."或者用正则替换,根本靠不住。
Path.Combine 加字符串检查靠不住很多人习惯把用户输入和根目录拼一起,然后查有没有..,或者干脆用string.Replace("..", "")。这种做法遇到真实攻击路径时,漏洞百出:
Path.Combine("C:\\app", "..\\..\\windows\\system32\\cmd.exe") 出来的是C:\app\..\..\windows\system32\cmd.exe——Combine本身不做归一化,你再用StartsWith去判断,结果必然是“通过”%2e%2e/、Unicode点号(比如..)、甚至混合斜杠(..和../混着来)轻松绕开字符串检查Path.Combine("C:\\app", "C:\\evil\\web.config"),结果直接跳到另一个盘符,字符串检测在这种场景下毫无意义归一化 → 比对前缀 → 注意分隔符边界
Path.GetFullPath(candidate),让操作系统帮你解析出最终的绝对路径(比如C:\app\..\config.json变成C:\config.json)StartsWith(safeRoot + Path.DirectorySeparatorChar, StringComparison.Ordinal)做检查——必须加上后缀分隔符,否则C:\safe会错误地匹配上C:\safeguardFile.Open前、在Directory.EnumerateFiles前,一个不能少读操作越界,最多是泄露些配置信息;写操作一旦被突破,后果可能就是web.config被覆盖、WebShell被植入、日志被篡改。
appsettings.json这样的关键文件).aspx——Windows允许长文件名,攻击者可以用shell.aspx:zone.id这种手法绕过DirectoryInfo和File.Exists默认会跟随符号链接或junction点,Path.GetFullPath的校验在这种情况下是无效的。
File.GetAttributes(path) & FileAttributes.ReparsePoint检测重解析点File.GetLinkTarget(path)(.NET 6+)确认是不是符号链接(junction点会返回null)SearchOption.AllDirectories,要手动做BFS/DFS,对每个FileSystemInfo逐一校验最容易忽略的一点:校验逻辑必须跑在真实的文件系统路径上,而不是在URL解码后、没有归一化的字符串上。攻击者不会和你比谁的正则写得漂亮,他们只会盯着GetFullPath的行为去对齐——那就让它成为唯一权威的判断标准。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8