1. register_globals的概念
register_globals是PHP的一个配置选项,用于控制是否将POST、GET和COOKIE中的变量自动注册到全局变量中。当register_globals设置为on时,PHP会将这些变量自动注册为全局变量,可以在脚本的任何地方使用。而当register_globals设置为off时,这些变量就不会被自动注册为全局变量,需要使用$_POST、$_GET和$_COOKIE等超全局变量来访问。
2. register_globals的on和off的区别
2.1 安全性
将register_globals设置为on可能会导致安全问题。当register_globals为on时,攻击者可以通过构造特定的URL或提交特殊的表单数据,将数据赋值给脚本中的变量,从而覆盖原有变量的值。这样的话,攻击者就可以执行某些恶意操作,比如修改数据库中的数据、执行远程代码等。因此,在安全性方面,建议将register_globals设置为off。
在register_globals为on时,攻击者可以通过构造URL或提交表单数据,强制赋值变量,进而修改数据。
2.2 全局变量的冲突
当register_globals为on时,如果多个请求同时使用了相同的变量名,就可能会造成变量的冲突。这可能会导致脚本出现不可预料的结果,甚至引发错误。因此,在编写脚本时,需要格外注意全局变量的命名,避免与其他代码冲突。
2.3 程序移植性
将register_globals设置为off可以提高程序的移植性。因为在register_globals为off时,无论在任何服务器上运行,都可以使用$_POST、$_GET和$_COOKIE等超全局变量来获取用户提交的数据。而将register_globals设置为on的情况下,则必须依赖于服务器的配置,可能会导致程序在不同的环境下运行出现问题。
3. 如何关闭register_globals
关闭register_globals的方法有以下几种:
3.1 在php.ini中进行配置
register_globals = Off
修改php.ini文件,将register_globals设置为Off。这样一来,所有的PHP脚本都会遵循该设置。但是需要注意的是,修改php.ini文件可能会影响整个服务器上的其他PHP应用程序,需谨慎操作。
3.2 在.htaccess文件中进行配置
php_flag register_globals off
在.htaccess文件中添加一行代码php_flag register_globals off,即可关闭register_globals。这种方法相对较为灵活,只对当前目录及其子目录下的PHP脚本生效。
3.3 在脚本中使用ini_set函数进行配置
ini_set('register_globals', 'off');
在脚本中使用ini_set函数将register_globals设置为off,可以临时关闭register_globals。这种方法适用于只在特定脚本中关闭register_globals的情况。
4. register_globals的历史
register_globals在过去是PHP默认的配置选项,而且在某些旧版本的PHP中默认值是on。但随着PHP的发展和漏洞的曝光,register_globals被认为是一个安全风险,并且在PHP 5.4.0版本开始移除了该选项。由于register_globals的潜在风险,PHP官方建议将其设置为off或通过其他方式来避免使用全局变量。
总之,register_globals的on和off的区别主要在于安全性、全局变量的冲突和程序的移植性。为了保障脚本的安全性,建议将register_globals设置为off,并采用$_POST、$_GET和$_COOKIE等超全局变量来访问用户提交的数据。