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

Tags: 脚本 , 原创 , 安全 , php

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

相关文章

访客评论( 9 楼)

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

发表评论

评论内容 (必填):