黑名单是一个没有成功的方案。这只能保护您免受已知 威胁。您在此处使用的任何代码扫描工具都会继续报告该漏洞……因为黑名单是漏洞。请参阅OWASP: 的此注释
这种策略,也称为“否定”或“黑名单”验证是一种
积极验证的弱替代方案。本质上,如果你不
希望看到 %3f 或 JavaScript 或类似字符,拒绝
包含它们的字符串。这是一个危险的策略,因为集合
可能的不良数据可能是无限的。采用这种策略
意味着您将必须维护“已知不良”列表
字符和模式永远存在,而你将根据定义拥有
保护不完整。
此外,字符编码和操作系统也使这成为一个问题。假设我们接受 *.docx 文件的上传。以下是需要考虑的不同极端情况,适用于您投资组合中的每个应用程序。
- 接受应用程序是在 linux 平台还是 NT 平台上运行? (文件分隔符在 Windows 中为
\,在 linux 中为 /。)
一种。跨系统的文件/目录路径中的空格也有不同的处理方式。
- 应用程序是否已经考虑了 URL 编码?
- 发送的文件是存储在数据库中还是系统本身上?
- 您收到的文件是否可执行?例如,如果我将
netcat.exe 重命名为 foo.docx,您的应用程序是否真的会检查正在上传的文件是否包含 exe 文件的 magic numbers?
- 我可以继续。但我不会。我可以写一本百科全书。
如果这是针对您公司的产品组合的多个应用程序,那么您有义务明确说明这一点,然后您的公司需要提出一个应用程序/按/应用程序白名单。
就 ESAPI 而言,您可以将Validator.getValidInput() 与一个正则表达式一起使用,该正则表达式是您想要拒绝的所有文件的 OR,即。在validation.properties 中,您会执行以下操作:Validator.blackListsAreABadIdea=regex1|regex2|regex3|regex4
请注意,黑名单的解析惩罚也更高......每个输入字符串都必须针对黑名单中的每个正则表达式运行,正如 OWASP 指出的那样,它可以是无限的。
同样,正确的解决方案是让您投资组合中的每个应用程序团队为其应用程序构建一个白名单。如果这真的不可能(我对此表示怀疑),那么您需要确保您已向管理层明确说明此处引用的风险,并且您拒绝继续使用黑名单方法,直到您有书面文件公司选择承担风险。当黑名单失败并将您告上法庭时,这将保护您免于承担法律责任。
[编辑]
您正在寻找的方法称为HTTPUtilites.safeFileUpload()listed here as acceptance criteria,但由于我在上面发布的困难,这很可能从未实现过。黑名单是非常为应用程序定制的。最好的方法是 HTTPUtilities.getFileUploads() 方法,它使用在 ESAPI.properties 中定义的列表,位于 HttpUtilities.ApprovedUploadExtensions 键下
但是,默认版本需要自定义,因为我怀疑您是否希望您的用户将 .class 文件和 dll 上传到您的系统。
另请注意:此解决方案是 whitelist 而不是 blacklist.