不要轻信 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 相关文章推荐
图形数字验证代码
Oct 09 PHP
PHP 组件化编程技巧
Jun 06 PHP
php抓取https的内容的代码
Apr 06 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
PHP架构及原理知识点详解
Dec 22 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
Jun 03 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读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
jQuery事件对象总结
2016/10/17 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
python中virtualenvwrapper安装与使用
2018/05/20 Python
便捷提取python导入包的属性方法
2018/10/15 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
python3.8下载及安装步骤详解
2020/01/15 Python
python中列表的含义及用法
2020/05/26 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
python如何写try语句
2020/07/14 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
会计自我鉴定
2014/02/04 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
2014年审计工作总结
2014/11/17 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
无故旷工检讨书
2015/08/15 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书