不要轻信 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 相关文章推荐
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
PhpMyAdmin中无法导入sql文件的解决办法
Jan 08 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
Smarty foreach控制循环次数的实现详解
Jul 03 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
Nov 11 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
Sep 10 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
php服务器的系统详解
Oct 12 PHP
Thinkphp5.0框架视图view的模板布局用法分析
Oct 12 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数据饼图效果实现代码
2011/11/23 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
Js基础学习资料
2010/11/23 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
JsRender实用入门教程
2014/10/31 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
js实现表格数据搜索
2020/08/09 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python的条件锁与事件共享详解
2019/09/12 Python
Python关于反射的实例代码分享
2020/02/20 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Python如何实现FTP功能
2020/05/28 Python
职专应届生求职信
2013/11/16 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
mysql left join快速转inner join的过程
2021/06/30 MySQL
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android