PHP作为目前最为流行的服务器端脚本语言之一,具有易于学习、灵活、开源等优势,是Web应用、高并发服务开发中的重要工具。然而,PHP也存在一些安全问题,其中很重要的一点就是PHP配置中的register_globals选项。
register_globals是一种PHP变量处理机制。当它被打开时,服务器会自动将请求参数中传递过来的POST、GET、COOKIE、ENV、SERVER、FILES这些全局变量的值自动转换为全局变量,使得程序员可以直接调用这些值而不需要再通过特定的代码获取。register_globals虽然方便快捷,但是在实际应用中往往会造成一些安全隐患。
register_globals的弊端
首先,register_globals会直接改变变量的作用域,使得局部变量会成为全局变量。这会使得多个脚本之间的变量容易发生冲突,导致代码的不稳定性,尤其在使用第三方库时更是容易出现异常的情况,大大增加了代码维护的难度。
其次,当register_globals被开启时,黑客可以通过篡改请求中的参数将任意变量的值改变,从而在不需要正常验证的情况下,让应用程序执行他们有意的脚本代码,导致应用程序受到攻击,造成一系列的危害,如数据泄露和服务器的崩溃。而如果register_globals被关闭,则由于变量只能在自己的作用域中使用,黑客就不可能实现这种危害。
最后,register_globals也会使解释器的执行效率降低,因为当它被打开时,所有的变量都会被一次性处理,这会消耗大量的内存和CPU资源,对服务器的负载造成影响。
register_globals的应用
为了避免register_globals存在的这些安全问题,我们需要在PHP配置文件中进行设置。在php.ini文件中,将register_globals设置为Off即可。除此之外,也可以在PHP脚本的开头通过代码将其关闭,如下:
if(ini_get('register_globals')){
$globals = array($_REQUEST, $_SERVER, $_FILES);
if(isset($_SESSION)) {
$globals[] = $_SESSION;
}
foreach($globals as &$global) {
foreach($global as $key => $val) {
unset($GLOBALS[$key]);
}
unset($global);
}
}
在实际应用中,我们应该在代码设计过程中尽可能避免使用全局变量,而采用局部变量或常量等更为安全的方式。
总结
register_globals是一个易用但不太安全的PHP特性,当它被开启时会引发一系列潜在的安全问题。因此,关闭register_globals对于Web应用程序的安全至关重要。我们需要在PHP的配置文件中与代码中遵循最佳实践,采用比较规范的方式进行系统的开发和管理,以最大限度地保护系统的安全性。