不要轻信 PHP_SELF的安全问题

 更新时间:2009年09月05日 01:53:14   作者:  
开门见山,考虑下面的代码(原文连接有详细的解释)

复制代码 代码如下:

<html>
<body>
<?php
if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {
echo "Form submitted!";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit!" />
</form>
</body>
</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 的这篇文章,此处略。

相关文章

  • php使用Cookie实现和用户会话的方法

    php使用Cookie实现和用户会话的方法

    这篇文章主要介绍了php使用Cookie实现和用户会话的方法,分析了Cookie的原理、设置与使用技巧,需要的朋友可以参考下
    2015-01-01
  • PHP实现的随机IP函数【国内IP段】

    PHP实现的随机IP函数【国内IP段】

    这篇文章主要介绍了PHP实现的随机IP函数,可实现输出国内IP段的功能,涉及php字符串与数组的计算操作相关技巧,需要的朋友可以参考下
    2016-07-07
  • php微信开发之自定义菜单实现

    php微信开发之自定义菜单实现

    这篇文章主要为大家详细介绍了php微信开发之自定义菜单实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • c#中的实现php中的preg_replace

    c#中的实现php中的preg_replace

    最近在按照一个php项目用c#重写,一边学习同时发现了他们的神似神不似的很多地方
    2009-12-12
  • php准确计算复活节日期的方法

    php准确计算复活节日期的方法

    这篇文章主要介绍了php准确计算复活节日期的方法,涉及php操作日期的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • PHP数组递归排序实现方法示例

    PHP数组递归排序实现方法示例

    这篇文章主要介绍了PHP数组递归排序实现方法,结合实例形式分析了php基于递归算法针对特定key对数组进行排序的相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • php 多继承的几种常见实现方法示例

    php 多继承的几种常见实现方法示例

    这篇文章主要介绍了php 多继承的几种常见实现方法,结合实例形式分析了两种PHP实现多继承的操作方法,需要的朋友可以参考下
    2019-11-11
  • PHP对象、模式与实践之高级特性分析

    PHP对象、模式与实践之高级特性分析

    这篇文章主要介绍了PHP对象、模式与实践之高级特性,结合实例形式分析了php面向对象程序设计中的静态属性和方法、抽象类、接口、拦截器、克隆对象等概念与简单实现方法,需要的朋友可以参考下
    2016-12-12
  • php读取30天之内的根据算法排序的代码

    php读取30天之内的根据算法排序的代码

    今天做一个读取30天内,如果推荐则×20+收藏+点击的算法排序的代码
    2008-04-04
  • PHP语法小结之基础和变量

    PHP语法小结之基础和变量

    本系列文章,我们将简单的为大家总结一下PHP之中语法知识,第一篇,我们先来介绍基础和变量,希望大家能够喜欢。
    2015-11-11

最新评论