不要轻信 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 相关文章推荐
支持php4、php5的mysql数据库操作类
Jan 10 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
php数组去重实例及分析
Nov 26 PHP
laravel容器延迟加载以及auth扩展详解
Mar 02 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 PHP
浅谈Laravel核心解读之Console内核
Dec 02 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 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
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
php把数组值转换成键的方法
2015/07/13 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
jquery简单体验
2007/01/10 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
js实现随机抽奖
2020/03/19 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
深入浅析Python中的yield关键字
2018/01/24 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
艺人经纪人岗位职责
2014/04/15 职场文书
国庆横幅标语
2014/10/08 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
生日答谢词
2015/01/05 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
MySQL创建管理子分区
2022/04/13 MySQL