本章的绝大部分介绍有效对抗Web应用(不考虑编程语言或者平台)的技术。不同的应用技术的安全性都不是与生俱来的。不充足的输入校验是主要的问题,当开发人员没有意识到Web应用面对的威胁,或者低估了应用被攻击的可能性时,这个问题就会出现。
然而,有些语言引入的特性被误用或者误解,从而造成了不安全的应用。PHP在超级全局变量的使用中就有一个这样的特性。超级全局变量具有最大的可能范围,从而可以从PHP文件中的任何函数或者类中访问。最常用的4个超级全局变量是$_GET、$_POST、$_COOKIE和$_SESSION。每个变量都包含一个相关的参数数组。例如,通过表单POST发送的数据以名称/值的形式存储于$_POST变量中。也可以使用$GLOBALS变量创建自定义的超级全局变量。
在应用中没有正确初始化的超级全局变量可能被作为GET或POST参数发送的值覆盖。这对于预期来自用户提供输入的数组值,以及不应该受到操纵的值来说,都是如此。例如,config数组变量可能有一个用于root_dir的项目。如果config被注册为全局PHP变量,就可能用写入新值的一个请求来攻击它:
http://www.website.com/page.php?config[root_dir]=/etc/passwd%00
PHP将采用config[root_dir]参数,应用新值——一个肯定不该在应用中使用的值。
在不访问源代码的情况下确定全局变量的名称不总是很容易;但是,其他的技术依靠通过POST发送GET参数(或者相反)了解提交的数据能否绕过校验过滤器。
更多的信息可以在Hardened PHP项目网站上找到:http://www.hardenedphp.net/。特别要看看http://www.hardened-php.net/advisory_172005.75.html和http://www.hardened-php.net/advisory_202005.79.html。