Ruby on rails ActionDispatch::Http::UploadedFile中的原始文件名方法是否安全?

Ruby on rails ActionDispatch::Http::UploadedFile中的原始文件名方法是否安全?,ruby-on-rails,Ruby On Rails,ActionDispatch::Http::UploadedFile中的original\u filename方法是否可以安全地在主机系统中保存为文件,而无需对其进行进一步清理?查看源代码,看起来他们不会对文件名进行任何检查,因此除非他们在其他地方进行检查(这将是糟糕的设计,因此与Rails团队不同),真正的问题是:文件名会造成什么伤害?我能想到的唯一可能恶意使用它的情况是: 如果文件名为“”。如果你真的成功地创建了它们,那么很难删除它们。我怀疑Ruby会让你用这个名字保存一个文件,你可以试试看

ActionDispatch::Http::UploadedFile
中的
original\u filename
方法是否可以安全地在主机系统中保存为文件,而无需对其进行进一步清理?

查看源代码,看起来他们不会对文件名进行任何检查,因此除非他们在其他地方进行检查(这将是糟糕的设计,因此与Rails团队不同),真正的问题是:文件名会造成什么伤害?我能想到的唯一可能恶意使用它的情况是:

  • 如果文件名为“”。如果你真的成功地创建了它们,那么很难删除它们。我怀疑Ruby会让你用这个名字保存一个文件,你可以试试看。如果没有,这一点可以忽略
  • 或者,一个很长的名称可能会在操作系统的API代码中更深的某个地方导致缓冲区溢出
  • 请注意,这两个都不应该是问题。操作系统试图使其无法创建。文件,但我已经看过了。而且,由于(大多数?)文件系统已经有一个最大文件名限制,它们应该为您错误或截断文件;截断自己是一种近乎偏执的措施,可以防止将来可能在操作系统API代码中发现的缓冲区溢出漏洞。这样的利用不太可能存在

    所以,如果你真的想,只要检查一下这两个病例,你应该会没事的。您可能希望通过对UploadedFile类进行子类化并添加功能来实现这一点,如果名称为“.”或“.”,则只需给它一个随机名称;如果它结束了,比如说100个字符,然后截断它


    但我想说的是,这两种方法都不足以保证在代码库中引入非标准类。我会尝试按给定的名称保存文件,并依靠底层的文件保存API来捕获错误,检查所述错误,并将其报告给用户。

    它只是转换为utf,但大多数上传程序实现都使用它。