php打开远程文件的方法和风险及解决方法

2015-01-24信息快讯网

本文讲的是php打开远程文件的使用方法,还有使用风险和解决方法

PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML),看下面的代码
<?php
$contents = file_get_contents('http://www.jb51.net/');
?>

当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏洞是PHP应用中最危险的漏洞之一,这是因为它允许攻击者执行任意代码。尽管严重性在级别上要差一点,但在一个标准文件系统函数中使用了被污染数据的话,会有类似的漏洞产生:
<?php
$contents = file_get_contents($_GET['filename']);
?>

该例使用户能操纵file_get_contents( )的行为,以使它获取远程资源的内容。考虑一下类似下面的请求:
http://example.org/file.php?file ... mple.org%2Fxss.html
这就导致了$content的值被污染的情形,由于这个值是通过间接方式得到的,因此很可能会忽视这个事实。这也是深度防范原则会视文件系统为远程的数据源,同时会视$content的值为输入,这样你的过滤机制会潜在的起到扭转乾坤的作用。
由于$content值是被污染的,它可能导致多种安全漏洞,包括跨站脚本漏洞和SQL注入漏洞。例如,下面是跨站脚本漏洞的示例:
<?php
$contents = file_get_contents($_GET['filename']);
echo $contents;
?>

解决方案是永远不要用被污染的数据去指向一个文件名。要坚持过滤输入,同时确信在数据指向一个文件名之前被过滤即可:
<?php
$clean = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
?>

尽管无法保证$content中的数据完全没有问题,但这还是给出了一个合理的保证,即你读取的文件正是你想要读取的文件,而不是由攻击者指定的。为加强这个流程的安全性,你同样需要把$content看成是输入,并在使用前对它进行过滤。
<?php
$clean = array();
$html = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
/* Filter Input ($contents) */
$html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8');
echo $html['contents'];
?>

上面的流程提供了防范多种攻击的强有力的方法,同时在实际编程中推荐使用。
smarty模板局部缓存方法使用示例
CI框架在CLI下执行占用内存过大问题的解决方法
Thinkphp模板中截取字符串函数简介
php获取网页请求状态程序示例
php版淘宝网查询商品接口代码示例
php+ajax实现图片文件上传功能实例
PHP实现删除非站内外部链接实例代码
php的SimpleXML方法读写XML接口文件实例解析
Thinkphp中Create方法深入探究
php判断数组元素中是否存在某个字符串的方法
采用thinkphp自带方法生成静态html文件详解
PHP根据传入参数合并多个JS和CSS文件的简单实现
Codeigniter实现多文件上传并创建多个缩略图
教你如何用php实现LOL数据远程获取
php实现按文件名搜索文件的远程文件查找器
PHP判断远程图片是否存在的几种方法
PHP判断远程图片或文件是否存在的实现代码
php查看请求头信息获取远程图片大小的方法分享
php后门URL的防范
php使用exec shell命令注入的方法讲解
PHP使用PHPMailer发送邮件的简单使用方法
PHP迭代器的内部执行过程详解
PHP迭代器实现斐波纳契数列的函数
PHP SPL使用方法和他的威力
php获取远程图片体积大小的实例
三种php连接access数据库方法
PHP利用str_replace防注入的方法
php多用户读写文件冲突的解决办法
php上传文件中文文件名乱码的解决方法
FireFox浏览器使用Javascript上传大文件
使用Curl进行抓取远程内容时url中文编码问题示例探讨
is_uploaded_file函数引发的不能上传文件问题
php 强制下载文件实现代码
一个PHP的远程图片抓取函数分享
利用curl抓取远程页面内容的示例代码
PHP 获取远程文件大小的3种解决方法
©2014-2024 dbsqp.com