输入校验的最大失败之一是以JavaScript编写例程,并将它们放置在浏览器中。一开始,使用客户端脚本语言编写校验例程似乎是可取的,因为处理不需要在服务器上执行。客户端过滤器的实现很简单,而且广泛受到Web浏览器的支持(但是个别浏览器的怪癖仍然让开发人员头痛)。最重要的是,它们将许多处理从Web服务器移到了最终用户的系统,这对于应用来说确实得不偿失。Web浏览器是不可信任、不可控制的环境,因为来往于浏览器的所有数据可以在传输中被修改,而不用顾及校验例程。如果性能是个问题,再购买一台Web服务器硬件来处理额外的服务器端校验过程比起等着恶意用户用简单的%0a参数危害应用要经济得多。
针对校验例程的攻击可能瞄准应用的不同方面。理解攻击者如何利用不能胜任的校验例程很重要。这些威胁远远超出“垃圾数据”的错误。
·数据存储: 这包括用于SQL注入攻击的字符。这些字符可能用于重写数据库查询,这样就可以为攻击者执行一次自定义操作。错误可能仅仅简单地泄露用于应用中的编程语言,也可能是详细的从应用发送到数据库的原始SQL查询。
·其他用户: 这包括跨站脚本和其他与“钓鱼”相关的攻击。攻击者可能提交数据重写HTML,从未起疑心的用户那里窃取信息,或者误导用户泄露敏感信息。
·Web服务器主机: 这些攻击可能专门针对操作系统,比如插入一个分号在Unix Web服务器上运行任意命令。应用可能打算在Web服务器上执行一条命令,但是受到欺骗而通过使用特殊字符执行了另一条命令。
·应用内容: 攻击者可能生成泄露关于应用编程语言的信息的错误。其他攻击可能绕过浏览器读取的文件类型上的限制。例如,许多版本的Nimda蠕虫使用斜杠字符(用于分隔目录)的替代编码绕过用于避免用户请求Web文档根目录之外的文件的IIS安全检查。
·服务器缓冲区溢出: 溢出攻击多年来折磨着各种程序,Web应用也不例外。这种攻击包括传递极大的输出给应用,最终扩展到超过分配的内存空间,从而污染内存中的其他区域。结果可能是应用程序崩溃,或者在提供特殊制作的输入时,导致运行提供的任意代码。缓冲区溢出一般对于编译语言如C和C++来说,比Perl和Python这样的解释型语言更令人担心。基于.NET和Java的Web平台的特性使得应用层缓冲区溢出非常困难,因为它们不允许编程人员直接处理栈和堆的分配(这是缓冲区溢出的用武之地)。缓冲区溢出将更有可能存在于语言平台。
·获得任意数据访问: 用户可能访问对等用户的数据,例如一个顾客能够看到另一个顾客的订单信息。用户还可能访问特权数据,例如匿名用户能够列举、创建或者删除用户。数据访问也适用于受限的文件或者应用的管理区域。