不要轻信 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下清空字符串中的HTML标签的代码
Sep 06 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
基于empty函数的输出详解
Jun 17 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
php ZipArchive压缩函数详解实例
Nov 06 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
php利用imagemagick实现复古老照片效果实例
Feb 16 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
PHP环形链表实现方法示例
Sep 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缓存技术的使用说明
2011/08/06 PHP
php不写闭合标签的好处
2014/03/04 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php简单压缩css样式示例
2016/09/22 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
图片之间的切换
2006/06/26 Javascript
自己的js工具 Event封装
2009/08/21 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
js中运算符&amp;&amp; 和 || 的使用记录
2014/08/21 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
给校长的建议书100字
2014/05/16 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
Django migrate报错的解决方案
2021/05/20 Python
SQL Server中的游标介绍
2022/05/20 SQL Server