不要轻信 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使之能同时支持GIF和JPEG
Oct 09 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
Jan 06 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
php代码架构的八点注意事项
Jan 25 PHP
Yii2实现log输出到file及database的方法
Nov 12 PHP
如何解决PHP获取不到SESSION信息之一般情况
Oct 10 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
Laravel登录失败次数限制的实现方法
Aug 26 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实现快速排序法函数代码
2012/08/27 PHP
PHP代码优化之成员变量获取速度对比
2014/02/28 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
电气工程和自动化自荐信范文
2013/12/25 职场文书
保险经纪人求职信
2014/03/11 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
地心历险记观后感
2015/06/15 职场文书
行政处罚决定书
2015/06/24 职场文书
珍爱生命主题班会
2015/08/13 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL
Java字符串逆序方法详情
2022/03/21 Java/Android
方法汇总:Python 安装第三方库常用
2022/04/26 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技