Php 如何避免滥用图像预览流量?

Php 如何避免滥用图像预览流量?,php,image,preview,Php,Image,Preview,Facebook和Google+都有一个很好的功能:图像预览。当你们在你们的网站的URL中写的时候,图像被拍摄下来,你们可以在它们之间进行选择——这是用代理脚本完成的 我的问题是-有没有一种方法可以重现相同的行为,但防止用户插入指向大文件的链接,而这些文件应该是HTML文件?代理脚本可以如下所示 <?php $contents = file_get_contents($_GET['url']); //problem is on this line - When $_GET['url'] i

Facebook和Google+都有一个很好的功能:图像预览。当你们在你们的网站的URL中写的时候,图像被拍摄下来,你们可以在它们之间进行选择——这是用代理脚本完成的

我的问题是-有没有一种方法可以重现相同的行为,但防止用户插入指向大文件的链接,而这些文件应该是HTML文件?代理脚本可以如下所示

<?php
$contents = file_get_contents($_GET['url']); //problem is on this line - When $_GET['url'] is url to 5GB file, it will try to download it - How could I prevent it?
$images = preg_match_all('~img src="(.*?)"~', $contents, $images);
if ($images){
    echo json_encode($images[1]);
else 
    die('[]');

使用(或一些传真)并首先抓取
标题
请求。这将提供标题,在尝试检索整个内容之前告诉您URL的最终结果(大小以字节为单位)。

发出
HEAD
请求,该请求基本上是
GET
,但不传输任何文件内容。然后,您可以提取
内容长度
标题,并查看如果它是GET,您将获取多少数据

但是,请注意,没有任何东西可以阻止恶意用户通过“head”提供两组不同的数据——“此图像为10k”,然后通过“get”提供一TB的数据。这会浪费他们和你的带宽,但这是可能的。

实际上,
file\u get\u contents
中有一个可选参数,用于读取最大长度

maxlen读取数据的最大长度。默认值是一直读取到结束 已到达文件的第页。请注意,此参数应用于流 由过滤器处理


然而,这并不是万无一失的,因为您可以很容易地欺骗头部。使用php
header()
web上的一切都是“可作弊的”。可作弊吗?对万无一失的网络上没有任何东西是安全的。然而,您正在协议范围内工作,以获得可能的“最准确”答案(以最少的努力)。你也可以使用“硬”fopen/fread/close进行读取,直到达到阈值字节限制(当你超出读取字节的舒适区时停止)。那么你认为Facebook有时也会有这些问题吗?Facebook不会使用像文件获取内容那样简单的工具。他们有自己的解决方案,可以执行get,但在100k或1mg或其他时间后终止传输。同样,考虑到FB的大小,恶意用户不太可能通过提供TB大小的.jpg来淹没FB的带宽。在FB庞大的服务器场中,他们最多只能占用一台服务器。我知道他们不会这样做,这只是一个例子,所以这确实限制了通过CURL发送/获取超过3200万的数据?@genesis无视我之前的回答。现在我明白了,您可以为
文件\u获取内容
指定要读取的最大长度