Jun
15
2016
register_globals的ON和Off配置
register_globals是php.ini里的一个配置,这个配置影响到php 如何接收传递过来的参数比如:GET,POST,Cookie
register_globals可设置为ON和Off
注:当的method属性为post的时候应该用$_POST['user_name']和$_POST['user_pass']
register_globals的作用就是注册为全局变量,所以当register_globals=On的时候,传递过来的值会被直接的注册为全局变量直接使用,而register_globals=Off的时候,需要到特定的数组里去得到它。
所以,当你碰到无法得到值的时候应该首先检查一下你的register_globals的设置和你获取值的方法是否匹配(查看可以用phpinfo()函数或者直接查看php.ini文件)。
PHP 4.2.0版开始,配置文件中 register_globals 的默认值从 on 改为 off 了,所以一般出错的原因都是你用的php4.2.0以前版本的编程风格,用$name取值。但你当前所用的php版本高于4.2.0。导致用$name取不到值。
推荐把此项关闭,设置为Off。
2:此项要是打开,会存在很多安全隐患。例如在验证用户时,如果你的代码写的不够严谨,会导致攻击都构造特殊值来饶过验证。
举例一:
register_globals可设置为ON和Off
1:当register_globals=Off
接收数据的程序应该用根据表单form传值的方法来决定。GET:用$_GET['name']、$HTTP_GET_VARS['name']来接收值;POST:当form用POST提交数据$_POST['name']、$HTTP_POST_VARS['name']来接收值;2:当register_globals=On
接收数据的程序可以直接使用$user_name和$user_pass的这种类似访问变量的方式得到值。注:当的method属性为post的时候应该用$_POST['user_name']和$_POST['user_pass']
register_globals的作用就是注册为全局变量,所以当register_globals=On的时候,传递过来的值会被直接的注册为全局变量直接使用,而register_globals=Off的时候,需要到特定的数组里去得到它。
所以,当你碰到无法得到值的时候应该首先检查一下你的register_globals的设置和你获取值的方法是否匹配(查看可以用phpinfo()函数或者直接查看php.ini文件)。
PHP 4.2.0版开始,配置文件中 register_globals 的默认值从 on 改为 off 了,所以一般出错的原因都是你用的php4.2.0以前版本的编程风格,用$name取值。但你当前所用的php版本高于4.2.0。导致用$name取不到值。
推荐把此项关闭,设置为Off。
那我们为什么要使用Off呢?
1:php以后的新版本默认都用Off,虽然你可以设置它为On,但是当你无法控制服务器的时候,你的代码的兼容性就成为一个大问题,所以,你最好从现在就开始用Off的风格开始编程2:此项要是打开,会存在很多安全隐患。例如在验证用户时,如果你的代码写的不够严谨,会导致攻击都构造特殊值来饶过验证。
举例一:
<?php // 当用户合法的时候,赋值 $authorized = true if (authenticated_user()) { $authorized = true; } // 由于并没有事先把 $authorized 初始化为 false, // 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值 // 所以任何人都可以绕过身份验证 if ($authorized) { include "/highly/sensitive/data.php"; }上面的代码中存在的问题是你可以很容易地获得访问的权力,而不需要提供正确的用户名和口令。只在要你的浏览器的地址栏的最后添加?authorized=1。因为PHP会自动地为每一个提交的值创建一个变量 -- 不论是来自动一个提交的表单、URL查询字符串还是一个cookie -- 这会将$authorized设置为1,这样一个未授权的用户也可以突破安全限制。
发表评论: