首页 » 建站技术 » PHP 技术 » 浏览内容

当心$_SERVER[‘PHP_SELF’]的安全漏洞


2009-01-05 21:40:13 6,312 1 发表评论 字体: 作者:C.K.
标签: php安全漏洞

体验版 88 元,个人版 128 元,多用户版 288元个人版160元升级到多用户版。

我们在本页处理提交表单的时候往往习惯于这样写:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>">

看上去没有什么问题,但看看下面的情况你就知道它有多么危险了:

我们假设表单提交页面的名称为foo.php,放到PHP环境中之后,在地址栏这样输入:

foo.php/%22%3E%3Cscript%3Ealert('xss攻击')%3C/script%3E%3Cfoo

会弹出一个JS的alert!很明显这就是一次典型的XSS攻击(跨站攻击),原因在于”>,直接输出了没有进行任何过滤的$_SERVER[‘PHP_SELF’],这个例子的后果还不严重,如果你把这个变量直接保存到数据库,而别人又写了段JS破坏脚本。。。那就不堪设想了。

在手册上是这样解释$_SERVER[‘PHP_SELF’]的:

“PHP_SELF”&&
  • 当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。
  • 很明显,$_SERVER[‘PHP_SELF’] 虽然“看起来”是服务器提供的环境变量,但这的确和 $_POST 与 $_GET 一样,是可以被用户篡改的,如果不进行过滤的话,谁知道后果有多严重呢?

    解决方案很简单,和以前讲过的安全知识一样,使用 strip_tags、htmlentities 等此类函数过滤或者转义。

    echo htmlentities($_SERVER['PHP_SELF']);

    htmlentities, htmlspecialchars

    htmlspecialchars把某些特殊字符转换成html的编码,常用到的场合可能就是处理客户留言的留言版了。

    这些特殊字符仅限于以下几个:

    &   ->  &    
  • “    ->  "    
  • <   ->  <    
  • >   ->  >
  • htmlentities跟htmlspecialchars的功能类似,但是htmlentities是对所有HTML定义的entity都不放过,包括各种特殊字符和中文,这样得出来的结果是中文字符部分变为一堆乱码。

    htmlspecialchars_decode是htmlspecialchars的逆向过程,把html的编码转换成字符。

      网站统计 Statistics

      • 创建时间: 2005年1月3日 距今4855 天
      • 日志总数: 2461
      • 评论总数: 630
      • 标签总数: 654
      • 链接总数: 273
      • 最后更新: 2017-7-1 18:16:33
      • 您是本站第 13459354 位访客

      广告区 Guǎng Gào