不要轻信 PHP_SELF的安全问题


Posted in PHP onSeptember 05, 2009
<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 相关文章推荐
下载文件的点击数回填
Oct 09 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
May 09 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
php封装一个异常的处理类
Jun 08 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
php-fpm中max_children的配置
Mar 15 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 #PHP
php getsiteurl()函数
Sep 05 #PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 #PHP
用PHP读取flv文件的播放时间长度
Sep 03 #PHP
用php将任何格式视频转为flv的代码
Sep 03 #PHP
ajax php 实现写入数据库
Sep 02 #PHP
php 正则表达式小结
Aug 31 #PHP
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php实现word转html的方法
2016/01/22 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
JScript的条件编译
2007/05/29 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
python获取标准北京时间的方法
2015/03/24 Python
Python中的集合类型知识讲解
2015/08/19 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
django文档学习之applications使用详解
2018/01/29 Python
python pandas模块基础学习详解
2019/07/03 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
ASP.NET Core中的配置详解
2021/02/05 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
优秀应届毕业生推荐信
2014/02/18 职场文书
装修施工安全责任书
2014/07/24 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
2015年仓库工作总结
2015/04/09 职场文书
python数字图像处理实现图像的形变与缩放
2022/06/28 Python