我有一个带有文本输入的php页面,用户应该粘贴图像的远程URL,我必须将其存储在服务器中并显示给用户。 现在的问题是,我不相信用户总是会提供一个正确的图片网址,我不希望他们上传一个pdf或其他文件,或者一个巨大的,几个gb的文件。 现在我可以检查扩展,但这不是很有帮助,我听说我可以检查mime类型,但我不知道如何打开文件一次并检查所有验证,如mime-type和file一次性大小,然后复制文件。 此外,由于文件将按原样提供(稍有名称更改),我想知道是否可以确保该文件没有任何注入的病毒或有问题的代码。

任何建议赞赏。

===============>>#1 票数:1

您可以使用exif_imagetype()来查看它是否是图像。

如果你想100%确定它不是恶意软件或奇怪的东西。 最好使用GD库并通过GD库保存。 所以里面没有dangerous代码。

===============>>#2 票数:0

使用Curl,您可以使用https存在任何问题,您可以存储文件并进行检查。
下面是检查图像内容类型的代码,然后使用exif_imagetype()检查文件(启用php_mbstring和php_exif扩展)。

$url = 'https://www.google.com/images/icons/ui/doodle_plus/doodle_plus_google_logo_on_grey.gif';

$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';       
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_exec( $ch ) ;
if(!curl_errno($ch))  
{
    $type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 
    if ( stripos($type, 'image') !== FALSE )
    {
        curl_setopt($ch, CURLOPT_NOBODY, false);  
        curl_setopt($ch, CURLOPT_HEADER, false);    
        $filename = tempnam('/path/to/store/file/', 'prefix');
        $fp=fopen($filename,'wb');
        curl_setopt($ch, CURLOPT_FILE, $fp); 
        curl_exec($ch);
        fclose($fp);
        if ( exif_imagetype($filename) !== FALSE )
        {
            echo "100% IMAGE!";
            // take it!
        }

        unlink($filename);
    }      
}

curl_close($ch);

===============>>#3 票数:0 已采纳

那么有很多事情可以在这里完成。 我建议使用cURL作为传输文件的机制(而不是file_get_contents()或类似的)。 这样做的原因是您可以先对资源发送HEAD请求,以便在提交实际下载之前获取标头信息。 从标题中,您应该能够评估文件名,文件大小,mime类型信息等。请注意,此信息的任何信息都应该是可信的,但它至少会在提交文件下载之前进行健全性检查。

完成完整性检查后,可以将文件下载到本地snadbox目录中。 这不应该是Web可访问的目录。 您可以使用exif_imagetype()来确定文件是否确实是您感兴趣的类型的图像。

假设这一切看起来都不错,我会做最后一点清理 - 并在GD库中重命名(也许使用imagecreatefrom*()函数从临时下载文件制作最终图像)。

  ask by Bluemagica translate from so

未解决问题?本站智能推荐:

2回复

我可以用任何方式检查url是否指向有效图像(使用JS / PHP / ZendFramework)?

我正在开发一个测试/学习应用程序。 我想知道如何测试来自其他网站/域的图像...我将我的验证逻辑分解为以下内容 存在 是一个图像 是有效的类型 具体的尺寸 低于最大尺寸 - 说我希望图像快速加载。 托管资源不是我的。
3回复

网站如何判断用户是否在URL中插入了自己的值

我很好奇,因为我希望自己能够在自己的网站上进行检查,因为我目前正在设计中。 一个例子是: www.somesite.com/product.php?id=1356 使用Facebook时,用户可以对其进行更改,并获得与此ID相关联的用户。 但是在其他网站(特别是电子商务网站)中,
2回复

是否可以创建指向绝对外部URL的路由?

Google,Symfony Docs和Cookbook都没有帮助。 假设我们有一个名为http://www.example.com的网站,该网站正在Symfony2上运行,并且我们正在使用位于http://example.externalservice.com的外部FAQ和支持服务(无论
1回复

检查网址是否指向网页,而不是指向文件php

我正在使用curl检查网址是否在线: 我想知道网址是否指向网页而不是其他内容(例如文件),可能是.jpg或.png而不是网页,因此我想确保它是网页。 谢谢
1回复

如何判断地址栏网址是否具有特定顺序(php)

页面加载后,我的地址栏看起来像这样- 如果我进行搜索,我的地址栏看起来像这样- 或像这样- 如果只有网址是以下格式,我想运行一个函数: 如果网址格式如下,则不应运行该功能- 要么 我试图用$IsSearch = explode(":",$_GET[
3回复

Yii2检查网址是否指向有效图片

我刚刚开始学习Yii2。 我有一个表单,用户必须在其中输入外部图像的URL。 是否有一些规则/验证可以检查此url是否存在? 标准[['image'],'image']和[['image'],'url']并未执行我想要的操作。
1回复

在PHP中,有没有一种简单的方法可以判断URL是否是单个文件资源?

我正在用PHP编写代码,以找出给定网页的总大小。 但是,如果URL指向单个文件资源(例如png,gif,txt等文件),则无需解析URL所指向的页面即可查看是否存在任何链接。其他资源(例如.js,.css等文件)。
3回复

是否可以将完整的URL指向另一台服务器?

有点奇怪。 我的一位客户拥有一台共享的托管服务器,他在其上托管他的网站: http://www.example.com 要为他开发Web应用程序,我不得不使用其他服务器,例如255.255.255.255,该服务器允许SSH访问。 我的客户希望http://www.exa
2回复

如何在不扩展的情况下指向图像文件的网址

我在网站上按类别在特定文件夹中有一组图像。 每个图像都有一个ID ,也就是它的名称。 图像可以是PNG或JPG 。 如果PNG图像的ID为abc123 ,URL为何为example.com/category/abc123/并且服务器指向/images/category/abc123.p
3回复

如何知道两个URL是否指向同一页面

我想编写一个小脚本,以了解两个URL是否指向同一页面。 例如: http : //google.com和http://google.com/#将导致相同的URL。 同样,有时http://URL1.com和http://URL2.com也指向相同的页面,尽管它们不是相同的URL。 有没