不要轻信 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防注入安全代码
Apr 09 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
PHP 反射(Reflection)使用实例
May 12 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
PHP简单留言本功能实现代码
Jun 09 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自定义apk安装包实例
2014/10/20 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
php中namespace use用法实例分析
2016/01/22 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
Python实现抢购IPhone手机
2018/02/07 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
优秀士兵个人事迹材料
2014/01/19 职场文书
更夫岗位责任制
2014/02/11 职场文书
借款协议书
2014/04/12 职场文书
财务务虚会发言材料
2014/10/20 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
民事上诉状范文
2015/05/22 职场文书
读书笔记怎么写
2015/07/01 职场文书
小学班主任研修日志
2015/11/13 职场文书
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android