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

如果您对修复漏洞感兴趣,则需要:

  • 如果可能,将方法签名从public更改为private
  • 为提供的文件路径(如“D:\Temp\”或应用程序(“files\u root”)提供一个固定前缀,您可以将其添加到应用程序配置中
  • 不允许在filename参数中使用“/”或“\”或“.”或“:”。如果合适的话,只允许使用类似8.3的格式
  • 在path参数中不允许“.”或“:”。或者仅限于可接受的字符范围(例如a-z)
  • 不要返回打开的FileStream对象。您将无法控制该对象是否曾经关闭(拒绝服务漏洞)。相反,请获取所需的数据并在从该方法返回之前关闭FileStream

  • 如果您想要更具针对性的补救建议,您需要描述应用程序需要如何使用此方法。

    您需要添加代码来检查“目录”和“路径名”,以确保它们在系统上存在,然后再调用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告诉我这个?”这常常是解释强化结果的最困难的方面。请考虑添加例子和彻底解释如何解决这个问题。