不要轻信 PHP_SELF的安全问题
2015-01-24信息快讯网
开门见山,考虑下面的代码(原文连接有详细的解释)
<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_tags、htmlentities 等此类函数过滤或者转义。
echo htmlentities($_SERVER['PHP_SELF']);
-- Split --
上述的例子让我们需要时刻保持谨慎 coding 的心态。Chris Shiflett 在他的 Blog 总结的相当直白,防止 XSS 的两个基本的安全思想就是
Filter input
Escape output
我将上面翻译成 “过滤输入,转义输出”。详细的内容,可以参考他 Blog 的这篇文章,此处略。
PHP的变量总结 新手推荐
写php分页时出现的Fatal error的解决方法
zend api扩展的php对象的autoload工具
ThinkPHP采用模块和操作分析
PHP学习之数组值的操作
深入理解PHP原理之Session Gc的一个小概率Notice
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Zend Studio (eclipse)使用速度优化方法
8个出色的WordPress SEO插件收集
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
PHP编程过程中需要了解的this,self,parent的区别
php self,$this,const,static,->的使用
php 遍历数据表数据并列表横向排列的代码
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
php getsiteurl()函数
PHP 内存缓存加速功能memcached安装与用法
用PHP读取flv文件的播放时间长度
用php将任何格式视频转为flv的代码
php download.php实现代码 跳转到下载文件(response.redirect)
PHP 实现多服务器共享 SESSION 数据
彻底杜绝PHP的session cookie错误
php Sql Server连接失败问题及解决办法
PHP5中的this,self和parent关键字详解教程