首页 > PHP, Web技术 > 谨慎使用$_SERVER[‘PHP_SELF’](漏洞及解决办法)
2010十一月21

谨慎使用$_SERVER[‘PHP_SELF’](漏洞及解决办法)

$_SERVER[‘PHP_SELF’]PHP语言中的“服务器端系统变量”,它的值是“当前php文件相对于网站根目录的位置地址”。举例说明,如果在http://www.shuihan.com/output/html/data.php文件中使用$_SERVER[‘PHP_SELF’],代码如下:

echo $_SERVER['PHP_SELF'];

则在浏览器中打开该页输出为:
/output/html/data.php

  正是由于$_SERVER[‘PHP_SELF’]能输出“当前文件相对根目录的位置非常好用,所以很多程序员在写程序的时候很喜欢用到它,PHPBB中就使用的这个变量递交查询结果。然而现在我要说的不是他多好用,而是它存在着漏洞,可能被坏人利用,恶意注入代码

  可能有人会问,既然是服务器端的系统变量,Hacker怎么可能利用呢?这种认识是错误的。对于表单提交页面,Hacker可以通过巧妙地递交查询代码修改$_SERVER[‘PHP_SELF’]的值,从而注入设计好的恶意代码。我们还是看一个例子,下面这个代码在很多程序中广泛使用:(假如该代码所在页面是http://www.shuihan.com/form.php

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<!-- My Form -->
</form>

一个有经验的Hacker可能会用下面的地址访问该页面

http://www.shuihan.com/form.php%22%3E%3Cscript%3Ealert(’XSS attack!’)%3C/script%3E%3Cbr

用上面这句话访问页面,相当于下面的代码:

<form method="post" action="http://www.shuihan.com/form.php">
<script>alert('XSS attack!')</script><br />
<!-- My Form --> </form>

  通过上面的演示,现在你是否看到危险性了?(当然上面的演示例子是没有危险的)。经过细心的设计,Hacker可以设计出任何可能的恶意注入查询。

看到了危险的存在,那我们怎么才能避免这个问题呢?或者我们已经在自己的设计中大量的使用了$_SERVER[‘PHP_SELF’],怎样回避这个漏洞呢?

  网上有很多帖子提及到这个漏洞,但是却没有几个给出具体的解决办法,这里水寒参考了一位外国朋友的解决办法,整理了一下贴出来供大家使用时参考。

//获取"当前文件名"(form.php)
$phpself = basename(__FILE__);
//截取相对路径中的"目录部分"(php不含文件名),然后再在该"目录部分"后面加上"当前文件名"
//两部分接起来就构成了完整的"当前文件路径",使用该路径就清理掉了恶意代码
$_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'],
$phpself)) . $phpself; 

文章作者:水寒
本文地址:http://www.shuihan.com/article/211
版权所有 © 转载时必须以链接形式注明作者和原始出处!

文章标签:
本文目前尚无任何评论.

发表评论