C# 打开文件流进行写入-加强路径操作
正在查找用于解析打开文件的强化查找(路径操纵):C# 打开文件流进行写入-加强路径操作,c#,asp.net,fortify,C#,Asp.net,Fortify,正在查找用于解析打开文件的强化查找(路径操纵): public FileStream OpenFile(string directory, string filename) { FileStream fs = null; string pathname = string.Empty; pathname = Path.Combine(directory, filename); fs = new FileStream(pathname , FileMode.OpenO
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 help/suggestion表示有效目录的白名单,但这相当于在应用程序中硬编码目录。它可能是安全的,但不是一个好的编程实践
提前感谢@James Nix提供了Fortify发现漏洞的原因(在评论中):
您得到这个结果是因为这个方法接受“用户提供的”路径和文件名。如果攻击者向此方法发送参数
directory=C:\Windows
和filename=notepad.exe
,则如果您的应用程序具有对该文件的写入权限,它们可能会用恶意内容覆盖notepad.exe
詹姆斯·尼克斯1月6日17:17
如果您对修复漏洞感兴趣,则需要:
如果您想要更具针对性的补救建议,您需要描述应用程序需要如何使用此方法。您需要添加代码来检查“目录”和“路径名”,以确保它们在系统上存在,然后再调用FileStream。对于.NET,您可以使用stat()用于检查的函数。如果您试图写入服务器上的虚拟目录..您需要查找如何使用
Server.MapPath
和使用/path/path/etc.
使用指向您位置的前向斜杠,例如,如果您想写入文档文件夹,则需要执行fs.write(Server.MapPath(“~/Documents/SomeData.txt”)
这里也有pathname=Path.Combine(目录,文件名);
如果您只想返回文件名,您可以执行以下pathname=Path.Combine(目录,路径.GetFileName(文件名));
。请澄清“但不写入虚拟目录”。"备注?您想做什么-写入应用程序根目录之外的磁盘上的特定位置,或者让此代码仅在应用程序根目录内写入?Alexi----是的,我希望代码在虚拟目录之外写入。该目录不仅不是应用程序目录,也根本不是虚拟目录。您之所以获得此结果,是因为s方法接受“用户提供的”路径和文件名。如果攻击者向该方法发送参数directory=C:\Windows`和filename=notepad.exe`如果您的应用程序对该文件具有写入权限,则它们可能会用恶意内容覆盖notepad.exe
。我不知道为什么会将此标记为应答---fortify告诉我为什么会收到此消息使用詹姆斯·尼克斯(James Nix)提供的详细信息的发现。我一直在(现在仍然在)寻找该发现的编程解决方案。@Birdman我想它被标记为一个答案,因为你的隐含问题似乎是,“为什么Fortify告诉我这个?”这常常是解释强化结果的最困难的方面。请考虑添加例子和彻底解释如何解决这个问题。