PHP in the Register Globals

by amxku
2008-09-28
http://www.wolfexp.net

php中用户的输入数据为 GET、POST 和 COOKIE 三种,一般被称为 GPC 数据。php4.3.0之后的版本中register_globals 的默认值为off,但现在还是有部分在php.ini中将register_globals 的设为on,所以这里就存在了一些隐藏的风险。

register_globals 本身并没有安全风险。但如果将register_globals设为on,在全局名称空间和 $_GET、$_POST 或 $_COOKIE 数组中,将创建 GET、POST 和 COOKIE 传递到 PHP 脚本的所有变量。各种变量都被注入代码。再加上 PHP 在使用变量之前是无需进行初始化的,如果开发人员没有好的编程习惯,这就使得更容易产生一些安全风险。

我们来看下面的代码:

PHP代码
  1. <?php   
  2. if ($username) {   
  3.  $checkin = true;   
  4. }   
  5. if ($checkin) {   
  6.  Header("Location:./admin/admin.php");   
  7. }   
  8. ?>  

由于并没有事先把 $checkin 初始化,当register_globals为on时,可能通过GET ./?checkin=1 来定义该变量值,就可以绕过。如果 register_globals为off,就不能通过URL方式来给$checkin 赋值,就不会存在绕过验证的问题。如果开发者有一个好的编程习惯。在上面的代码执行之前对$checkin 变量进行初始化的话,那不管register_globals 是 on 还是 off ,都将不会存在类似的问题。

仅仅只是关闭 register_globals 这并不能代表所有的代码都安全了。所有的输入都是有害的,所以对于提交来的数据,都要对其进行严格的检查,永远都得用户提交的数据进行验证及对所有的变量进行初始化处理!

关键词: 脚本 , 原创 , 安全 , php

上一篇: 猥琐的notclickjacking
下一篇: SEBUG重构完成

相关文章
访客评论
#1
回复 云舒 2008-09-28, 09:39:34
现在越来越多的php.ini中将register_globals 的默认值设为on
真的嘛?
#2
回复 amxku 2008-09-28, 11:50:03
已经修正了。
#3
回复 amxku 2008-09-28, 12:09:40
http://www.redflag-linux.com/info.php
#4
回复 amxku 2008-09-28, 12:32:20
dedecms恰好有这样一个问题,在最新版本里面补过了
<?php
if (xxx) {
   include(xxx)
}?>
类似这样的
#5
回复 雨夜 2008-09-28, 13:24:30
BS,要是都行的话, 就神奇了
#6
回复 amxku 2008-09-28, 13:38:46
引用 雨夜 说过的话:
BS,要是都行的话, 就神奇了
在实际的应用中肯定是不行的。这里只是为了说明不好的编程习惯,会导致一些安全风险。
#7
回复 xiaomi 2008-09-28, 15:13:21
这个才是科普嘛,支持
#8
回复 GZ 2008-09-29, 00:02:46
我也来科普科普。
#9
回复 jimmy 2009-10-28, 13:48:42
其实,我对这里面一直不解的地方是:
# <?php  
# if ($username) {  
#  $checkin = true;  
# }  
# if ($checkin) {  
#  Header("Location:./admin/admin.php");  
# }  
# ?>
我们是怎么知道这个$checking变量名的?
发表评论

评论内容 (必填):