不要轻信 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 相关文章推荐
PHP入门速成教程
Mar 19 PHP
php 删除数组元素
Jan 16 PHP
php 上传文件类型判断函数(避免上传漏洞 )
Jun 08 PHP
深入PHP变量存储的详解
Jun 13 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
thinkphp模板继承实例简述
Nov 26 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
php去除二维数组的重复项方法
Nov 03 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
thinkphp 获取控制器及控制器方法
Apr 16 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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
php模板中出现空行解决方法
2011/03/08 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
详解Django配置优化方法
2019/11/18 Python
python实现ip地址的包含关系判断
2020/02/07 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
4S店售后客服自我评价
2014/04/09 职场文书
环保建议书600字
2014/05/14 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
扬州个园导游词
2015/02/06 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
详解MySQL中的主键与事务
2021/05/27 MySQL