PHP fopen 读取带中文URL地址的一点见解

2015-01-24信息快讯网

之前喜欢用fopen()函数跨域读取图片或其它文件,一直都没发现什么问题。我所用的PHP版本都是5的了,应该不会有CRLF Injection攻击危险吧

但昨天在读取一张图片的时候出问题了,后来发现是URL里带中文字符。

例如下面这种情况:
 
$files = fopen('http://www.website.com/我的PP.jpg', 'rb'); 

那“$files”的返回值将会是“False”。首先我想到的是将URL用urlencode编码一下,发现还是不行,原来urlencode会把“:”、“/”字符也编码了,那URL就不是URL了。呵,说得有些绕口,那就把“:”、“/”字符的编码替换回来就应该行的。
 
$url = 'http://www.website.com/我的PP.jpg'; 
$url = preg_replace('/\%3A/i', ':', preg_replace('/\%2F/i', '/', urlencode(urldecode($url)))); $file = fopen($url, 'rb'); 


试试,嘿~还真是行了。下面再温习一下fopen()函数:

fopen() 函数打开文件或者URL。 如果打开失败,本函数返回FALSE。 打开成功,本函数返回TRUE。

一、语法:

fopen(filename, mode, include_path, context) 


参数描述
filename规定要打开的文件或 URL。
mode规定要求到该文件/流的访问类型。可能的值见下表。
include_path如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。
context规定文件句柄的环境。Context 是可以修改流的行为的一套选项。

二、mode 参数的可能的值:

mode说明
"r"只读方式打开,将文件指针指向文件头。
"r+"读写方式打开,将文件指针指向文件头。
"w"写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
"w+"读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
"a"写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
"a+"读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
"x"创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
"x+"创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
解析file_get_contents模仿浏览器头(user_agent)获取数据
CURL状态码列表(详细)
解析php扩展php_curl.dll不加载的解决方法
深入file_get_contents与curl函数的详解
解析如何去掉CodeIgniter URL中的index.php
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
解析PHP中的file_get_contents获取远程页面乱码的问题
深入file_get_contents函数抓取内容失败的原因分析
解析php中获取url与物理路径的总结
解析php中的fopen()函数用打开文件模式说明
php fsockopen伪造post与get方法的详解
基于php socket(fsockopen)的应用实例分析
php FLEA中二叉树数组的遍历输出
PHP可逆加密/解密函数分享
PHP curl 并发最佳实践代码分享
PHP文章采集URL补全函数(FormatUrl)
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
UCenter 批量添加用户的php代码
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
Zend Framework中的简单工厂模式 图文
工厂模式在Zend Framework中应用介绍
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
深入理解PHP之数组(遍历顺序) Laruence原创
php中通过curl smtp发送邮件
openflashchart 2.0 简单案例php版
php中通过curl模拟登陆discuz论坛的实现代码
用phpmailer实现简单openvpn用户认证的实现代码
openPNE常用方法分享
php fsockopen中多线程问题的解决办法[翻译]
防止本地用户用fsockopen DDOS攻击对策
©2014-2024 dbsqp.com