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由于并没有事先把 $checkin 初始化,当register_globals为on时,可能通过GET ./?checkin=1 来定义该变量值,就可以绕过。如果 register_globals为off,就不能通过URL方式来给$checkin 赋值,就不会存在绕过验证的问题。如果开发者有一个好的编程习惯。在上面的代码执行之前对$checkin 变量进行初始化的话,那不管register_globals 是 on 还是 off ,都将不会存在类似的问题。
if ($username) {
$checkin = true;
}
if ($checkin) {
Header("Location:./admin/admin.php");
}
?>
仅仅只是关闭 register_globals 这并不能代表所有的代码都安全了。所有的输入都是有害的,所以对于提交来的数据,都要对其进行严格的检查,永远都得用户提交的数据进行验证及对所有的变量进行初始化处理!

