打开文件流进行写入 - 加强路径操作
本文关键字:路径 操作 文件 | 更新日期: 2023-09-27 18:36:31
希望解决用于解决打开文件的强化发现(路径操作):
public FileStream OpenFile(string directory, string filename)
{
FileStream fs = null;
string pathname = string.Empty;
pathname = Path.Combine(directory, filename);
fs = new FileStream(pathname , FileMode.OpenOrCreate);
return (fs);
}
此代码在 .NET 应用程序中运行,但不写入虚拟目录。
Fortify 帮助/建议指示将有效目录列入白名单,但这无异于对应用程序中的目录进行硬编码。它可能很安全,但不是一个好的编程实践。
提前致谢
@James Nix提供了Fortify发现漏洞的原因(在评论中):
您之所以获得此结果,是因为此方法接受"用户提供的"路径和文件名。如果攻击者向此方法发送参数directory=C:'Windows
并filename=notepad.exe
,如果您的应用程序具有该文件的写入权限,则他们可能会用恶意内容覆盖notepad.exe
。– 詹姆斯·尼克斯 1 月 6 日 17:17
如果您有兴趣修复漏洞,则需要:
- 如果可能,请将方法签名从公共签名更改为私有签名。
- 为提供的文件路径提供固定前缀(如"D:''Temp''"或"files_root"),您可以将其添加到应用程序配置中。
- 文件名参数中不允许使用"/"或"''"或".."或":"。或者如果合适,只需限制为 8.3 之类的内容。
- 不要在路径参数中允许".."或":"。或者只是限制为可接受的字符范围(例如 a-z)。
- 不要返回打开的文件流对象。您将失去对它是否关闭的控制(拒绝服务漏洞)。相反,获取所需的数据并在从方法返回之前关闭 FileStream。
如果需要更有针对性的修正建议,则需要描述应用程序需要使用此方法执行的操作。
在调用 FileStream 之前,您需要添加代码来检查"目录"和"路径名"以确保它们在系统上的存在。 对于 .NET,可以使用 stat() 函数进行检查。