手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

不要轻信 PHP_SELF

首页 > PHP >

原文地址:http://www.phpv.net/html/1639.html,作者:手气不错

未删节版本

开门见山,考虑下面的代码(原文连接有详细的解释)

PHP代码
  1. <html>  
  2.     <body>  
  3.         <?php  
  4.             if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {  
  5.                 echo "Form submitted!";  
  6.             }  
  7.         ?>  
  8.         <form action="<?php echo $_SERVER['PHP_SELF']; ?>">  
  9.             <input type="hidden" name="submitted" value="1" />  
  10.             <input type="submit" value="Submit!" />  
  11.         </form>  
  12.     </body>  
  13. </html>  

看似准确无误的代码,但是暗藏着危险。让我们将其保存为 foo.php ,然后放到 PHP 环境中使用

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

访问,会发现弹出个 Javascript 的 alert -- 这很明显又是个 XSS 的注入漏洞。究其原因,发现是在

echo $_SERVER['PHP_SELF'];

这条语句上直接输出了未过滤的值。追根数源,我们看下 PHP 手册的描述

'PHP_SELF'

The filename of the currently executing script, relative to the document root.
For instance, $_SERVER['PHP_SELF'] in a script at the address
http://example.com/test.php/foo.bar would be /test.php/foo.bar. The __FILE__
constant contains the full path and filename of the current (i.e. included) file.
If PHP is running as a command-line processor this variable contains the script
name since PHP 4.3.0. Previously it was not available.

原因很明确了,原来是 $_SERVER['PHP_SELF'] 虽然“看起来”是服务器提供的环境变量,但这的确和 $_POST 与 $_GET 一样,是可以被用户更改的。

其它类似的变量有很多,比如 $_COOKIE 等(如果用户想“把玩”他们的 cookie,那我们也是没有办法)。解决方案很简单,使用 strip_tagshtmlentities 等此类函数过滤或者转义。

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

-- Split --

上述的例子让我们需要时刻保持谨慎 coding 的心态。Chris Shiflett 在他的 Blog 总结的相当直白,防止 XSS 的两个基本的安全思想就是

Filter input
Escape output

我将上面翻译成 “过滤输入,转义输出”。详细的内容,可以参考他 Blog 的这篇文章,此处略。




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: php, php_self

« 上一篇 | 下一篇 »

只显示10条记录相关文章

使用PHP得到所有的HTTP请求头 (浏览: 63787, 评论: 3)
我为什么会选用phpstorm (浏览: 54026, 评论: 5)
快速生成目录树 (浏览: 47792, 评论: 7)
通过file_get_contents来Post数据的实例 (浏览: 47438, 评论: 5)
PHP导入导出Excel方法 (浏览: 46289, 评论: 3)
PHP的XSS攻击过滤函数 (浏览: 43839, 评论: 2)
PHP中Eval的作用 (浏览: 42644, 评论: 4)
超详细:在Mac OS X中配置Apache + PHP + MySQL (浏览: 42006, 评论: 1)
PHP常见错误(二) (浏览: 40914, 评论: 1)
PHP sendmail (浏览: 38891, 评论: 7)

3条记录访客评论

你太牛了,就连找个php $PHP_SELF都能找到你这里来,哈

Post by 文福 on 2010, August 28, 11:41 PM 引用此文发表评论 #1

MSN居多

Post by gouki on 2008, November 14, 5:58 PM 引用此文发表评论 #2

沙发~~~
这几天不见你上Q?

Post by 小茗 on 2008, November 14, 4:25 PM 引用此文发表评论 #3


发表评论

评论内容 (必填):