不要轻信 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 相关文章推荐
一个MYSQL操作类
Nov 16 PHP
PHP strtotime函数详解
Dec 18 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
54个提高PHP程序运行效率的方法
Jul 19 PHP
Yii2 assets清除缓存的方法
May 16 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 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/03/27 PHP
PHP 数组入门教程小结
2009/05/20 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
php删除数组元素示例分享
2014/02/17 PHP
ThinkPHP控制器详解
2015/07/27 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
总结Javascript中的隐式类型转换
2016/08/24 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
python+requests接口自动化框架的实现
2020/08/31 Python
python全栈开发语法总结
2020/11/22 Python
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
高中毕业的自我鉴定
2013/12/09 职场文书
八年级数学教学反思
2014/01/31 职场文书
安全生产承诺书范文
2014/05/22 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
车间质检员岗位职责
2015/04/08 职场文书
HAM-2000摩机图
2021/04/22 无线电
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
海弦WR-800F
2022/04/05 无线电