我在 google 上搜索了规范表示的含义,并找到了完全太神秘的文档。谁能提供关于规范表示的快速解释,以及网站中针对规范表示攻击的一些典型漏洞是什么?
4 回答
规范化是您将输入(例如文件名或字符串)转换为标准表示的过程。
例如,如果您的 Web 应用程序只允许访问 C:\websites\mydomain 下的文件,那么通常任何引用文件名的输入都会被规范化为物理的直接路径,而不是使用相对路径的路径。如果您想打开 C:\websites\mydomain\example\example.txt,该函数的一个输入可能是 example\example.txt。很难确定这是否超出了您网站的边界,因此规范化功能将查看应用程序目录并将该相对路径更改为物理路径,C:\websites\mydomain\example\example.txt。这显然更容易检查,因为您只需在文件路径的开头进行字符串比较。
对于 HTML 输入,您采用 %20 之类的输入并通过取消编码对其进行规范化,因此这将变成一个空格。这是一个好主意,因为不同编码方式的数量很多,规范化意味着您将只检查解码的字符串,而不是尝试覆盖所有编码变化。
基本上,您正在接受逻辑上等效的输入并将它们转换为标准形式,然后您可以对其采取行动。
以下解释来自此处找到的“应用程序安全和开发 STIG” :
3.11 规范表示 当资源的名称用于控制资源访问时,就会出现规范表示问题。在计算机系统上有多种表示资源名称的方法。如果名称以无法识别的格式指定,则仅依赖资源名称来控制访问的应用程序可能会错误地做出访问控制决定。
例如,在 Windows 中,notepad.exe 可能由以下文件名和路径名组合表示:
C:\Windows\System32\notepad.exe
%SystemRoot%\System32\notepad.exe
\?\C:\Windows\System32\notepad.exe
\host\c$\Windows\system32\notepad.exe
尝试仅基于文件路径和名称来限制对文件的访问的应用程序可能会不正确地授予或拒绝访问。如果对数据使用了替代编码机制,则相同的问题可能适用于系统上的其他命名资源,例如硬链接和软链接、URL、管道、共享、目录、设备名称或数据文件内。
以下项目可能表明应用程序中潜在的规范表示问题:
• 基于资源名称的访问控制决策。
• 未能在使用前将资源名称简化为其规范形式。
为了最大限度地减少应用程序中的规范表示问题,请实施以下过程:
• 不要仅仅依靠资源名称来控制访问。
• 如果使用资源名称来控制访问,请验证名称以确保它们的格式正确;拒绝所有不符合已知良好标准的名称。
• 使用基于操作系统的访问控制机制,例如权限和 ACL。
规范化意味着将接收到的数据简化为最简单的形式,用于输入验证。
规范(我认为)意味着控制台输入是“典型行为”。Non-canonical 意味着输入是非标准的,需要特殊的知识,比如“vi”在linux上的输入行为。