不要轻信 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 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
PHP调用Linux的命令行执行文件压缩命令
Jan 27 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 PHP
php strftime函数获取日期时间(switch用法)
May 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下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
php的4种常用运行方式详解
2016/12/22 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
详解PHP队列的实现
2019/03/14 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
javascript实现微信分享
2014/12/23 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
jQuery事件详解
2017/02/23 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
Python中装饰器高级用法详解
2017/12/25 Python
Sanic框架路由用法实例分析
2018/07/16 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
django admin 添加自定义链接方式
2020/03/11 Python
python实现邮件循环自动发件功能
2020/09/11 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
自荐信写法介绍
2014/01/25 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
Mysql基础之常见函数
2021/04/22 MySQL
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL