用户数据,就是任何种类的输入(来自于 Web 请求或者 URL 中的数据,输入在 Microsoft Windows 窗体应用程序的控件中的数据,等等),它能够对代码产生影响,因为这些数据经常被直接当成参数来使用并且用来调用其他的代码。这种情况类似于恶意代码以奇特的参数来调用你的代码,并且应该采取相应的措施来进行防范。然而,用户输入实际上更加难以安全化,因为并没有堆栈框架来追踪所出现的潜在的不被信任的数据。
这是最敏感与难度最高的安全漏洞之一,因为尽管它们能够存在于表面上看起来与安全无关的代码中,但是它们却是把坏数据传递给其他代码的主要通道。如果要查看这些漏洞,就需要按照任何种类的输入数据来想象可能的值范围,并且考虑是否代码已经看见了这些数据并且能够对所有情况作出处理。你可以通过范围检查与注入任何不能够被代码所处理的输入来修复这些漏洞。
包括用户数据的一些重要考虑如下:
- 服务器回应中的任何用户数据都运行在位于客户端的服务器网站环境中。如果你的 Web 服务器获取了用户数据,那么就会把它插入到被返回的 Web 页面中,例如,包括并且运行一个 <script> 标记。
- 记住客户端能够请求任何 URL。
- 考虑狡猾的路径或者无效的路径:
- ..\,过长的路径。
- 使用通配符(*)。
- 符号扩展(%符号%)。
- 有特殊意义的奇特路径。
- 预定义的文件系统流名称(比如 "文件名称::$DATA")。
- 文件名称的简短版本(比如代表 longfilename 的 longfi-1)。
- 记住 Eval(userdata) 能够做任何事。
- 留意包括了一些用户数据的名称延迟绑定。
- 如果你需要分配 Web 数据,那么就需要考虑被允许的不同形式的编码,其中包括:
- 十六进制编码(%nn)。
- Unicode 编码(%nnn)。
- 超长的 UTF-8 编码(%nn%nn)。
- 双重编码(%nn 变成 %mmnn,如果 %mm 是 '%' 的编码)。
- 留意可能拥有多种规范格式的用户名称。例如,在 Microsoft Windows 2000 中,你经常可以使用 MYDOMAIN\username 或者 username@mydomain.example.com 中的任何一种来表示同一用户。