不要轻信 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中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
php通过字符串调用函数示例
Mar 02 PHP
yii框架builder、update、delete使用方法
Apr 30 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
php连接mysql数据库
Mar 21 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
使用Apache的rewrite
2021/03/09 Servers
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
python实现连接mongodb的方法
2015/05/08 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
诉讼财产保全担保书
2014/05/20 职场文书
大学生个人求职信
2014/06/02 职场文书
励志演讲稿300字
2014/08/21 职场文书
单位委托书格式范本
2014/09/29 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android