不要轻信 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 相关文章推荐
ie6 动态缩略图不显示的原因
Jun 21 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
学习php分页代码实例
Oct 24 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
TP5框架安全机制实例分析
Apr 05 PHP
如何重写Laravel异常处理类详解
Dec 20 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
创建无限极分类树型结构的简单方法
2017/06/20 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
再探JavaScript作用域
2014/09/24 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
python线程中同步锁详解
2018/04/27 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
资产经营总监岗位职责
2013/12/04 职场文书
寄语学生的话
2014/04/10 职场文书
建筑工地宣传标语
2014/06/18 职场文书
给老婆道歉的话
2015/01/20 职场文书
2015年暑期见闻
2015/07/14 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏