许多应用程序都受到某种外部组件的保护,这些组件或者位于应用程序所在的同一主机上,或者位于基于网络的设备上;它们要么执行入侵防御(应用程序防火墙),要么执行入侵检测(如传统的入侵检测系统)。由于这类设备用于确定攻击的方法基本类似,因此,我们将把它们当做同一类设备看待。虽然许多人认为安装这类设备总比什么都不做要强,但是,许多时候,它们会造成一种错误的安全意识,人们觉得:既然实施了另一层防御,安全状况将会自动改善。虽然此类系统并不会降低安全防御,并且可以阻止目标明确的攻击(如因特网蠕虫),但在许多情况下,它并不像人们认为的那样能够显著改善安全状况。
值得注意的是,除非此类防御设备采用大量定制规则,否则它们并不能防御我们在第4~8章中讨论的任何漏洞,并且在防范业务逻辑中的潜在漏洞(第11章)方面也没有任何实际用途。同时,它们也无法防范某些特定的攻击,如基于DOM的XSS(第12章)。至于其他漏洞(利用这些漏洞的攻击会表现出某种攻击模式),以下问题通常会降低Web应用程序防火墙的用处。
如果防火墙过于严格地遵循HTTP规范,它可能会对应用程序服务器如何处理请求做出假设。相反,网络层防御中的防火墙或IDS设备通常并不了解某些HTTP传输方法的细节。
请求通过防火墙后,在处理请求的过程中,应用程序服务器本身可能会修改用户输入,如对其进行解码、添加转义字符,或过滤掉特定字符串。前几章中介绍的许多攻击步骤均以避开输入确认为目标,应用程序层防火墙可能易于受到类似的攻击。
许多防火墙和IDS警报基于特定的常见攻击有效载荷,而不是基于利用漏洞的常规方法。如果攻击者能够检索文件系统中的任意文件,针对/manager/viewtempl?loc=/etc/passwd的请求可能会被阻止,但针对/manager/viewtempl?loc=/var/log/syslog的请求并不会被视为攻击,即使其内容可能对攻击者更加有用。
从整体看,我们并不需要区分全局输入确认过滤器、基于主机的代理或基于网络的Web应用程序防火墙。以下步骤适用于所有设备。