用户数据(任何类型的输入(来自 Web 请求或 URL 的数据、Microsoft Windows 窗体应用程序的控件的输入等)可能会对代码产生不利影响,因为数据通常直接用作参数来调用其他代码。 这种情况类似于使用奇怪的参数调用代码的恶意代码,应采取相同的预防措施。 用户输入实际上很难确保安全,因为没有堆栈帧来跟踪可能存在不受信任的数据。
这些都是最微妙和最难找到的安全 bug 之一,因为尽管它们存在于看似与安全性无关的代码中,但它们是将不良数据传递到其他代码的网关。 若要查找这些 bug,请跟随任意一种输入数据,设想可能的值的范围,并考虑看到这一数据的代码是否能够处理所有这些情形。 可以通过范围检查和拒绝代码无法处理的任何输入来修复这些 bug。
涉及用户数据的一些重要注意事项包括:
服务器响应中的任何用户数据在客户端上的服务器站点的上下文中运行。 如果 Web 服务器获得了用户数据,并将这些数据插入到返回的网页中,那么这些数据可能会包含诸如 <script> 之类的标记,并且就像是从服务器运行的一样。
请记住,客户端可以请求任何 URL。
请考虑棘手或无效的路径:
..\ ,非常长的路径。
使用通配符 (*)。
标记展开 (%token%)。
具有特殊含义的奇怪的路径形式。
备用文件系统流名称,例如
filename::$DATA
。文件名的短版本,例如
longfi~1
是longfilename
的简写。
请记住,Eval(userdata)可以执行任何操作。
在后期绑定到包含某些用户数据的名称时要多加小心。
如果正在处理 Web 数据,请考虑所允许的各种转义形式,包括:
十六进制转义 (%nn)。
Unicode 转义 (%nnn)。
超长 UTF-8 转义 (%nn%nn)。
双转义(%nn 成为 %mmnn,其中 %mm 是 '%' 的转义)。
谨慎使用可能具有多个规范格式的用户名。 例如,通常可以使用 MYDOMAIN\username 窗体或 username@mydomain.example.com 窗体。