background image

PHP 程序员:PHP fopen 读取带中文 URL 地址的一点

见解

之前喜欢用

fopen

()函数跨域读取图片或其它文件,一直都没发现什么问题。我所用的 PHP

版本都是 5 的了,应该不会有 CRLF Injection 攻击危险吧
但昨天在读取一张图片的时候出问题了,后来发现是 URL

 

里带中文字符。

 

 

例如下面这种情况:
代码如下:
 

$files

 = 

fopen

('我的 PP.jpg', 'rb'); 

 

$files

的返回值将会是 False”。首先我想到的是将 URL 用 urlencode 编码一下,发现还

是不行,原来 urlencode

会把 :” “

、 /”字符也编码了,那 URL 就不是 URL 了。呵,说得有些

绕口,那就把 :” “

、 /”

 

字符的编码替换回来就应该行的。

 

复制代码 代码如下:
 

$url

 = '我的 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 是可以修改流的行为的一套选项。