不要轻信 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 printf输出格式使用说明
Dec 05 PHP
php从数组中随机抽取一些元素的代码
Nov 05 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
PHP实现图片压缩的两则实例
Jul 19 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 PHP
PHP函数积累总结
Mar 19 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
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python注释详解
2016/06/01 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
python分析作业提交情况
2017/11/22 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
Python中修改字符串的四种方法
2018/11/02 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Python坐标线性插值应用实现
2019/11/13 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
Python 实现一个计时器
2020/07/28 Python
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
奖学金自我鉴定范文
2013/10/03 职场文书
工程资料员岗位职责
2014/03/10 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
交通处罚决定书
2015/06/24 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技