【问题标题】:Reliably and securely save an image from external server可靠安全地保存来自外部服务器的图像
【发布时间】:2012-11-09 19:28:57
【问题描述】:

我正在开发一个网站,用户可以在其中提交链接,并指定该链接中的图像用作缩略图。图片将从网页中保存,而不是由用户上传。

看来我有两个选项可以做到这一点,它们是file_get_contentscURL

file_get_contents 示例:

$url = 'http://example.com/file_name.jpg';
$img = '/path/file_name.jpg';
file_put_contents($image, file_get_contents($url));

cURL 示例:

$ch = curl_init('http://example.com/file_name.jpg');
$fp = fopen('/path/file_name.jpg', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

在可靠性和安全性方面,哪个更受欢迎?使用现有方法获取远程文件有哪些安全问题,我该如何防范?

如果有任何有助于解决此问题的类或函数,我正在使用 Codeigniter。

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    在可靠性和安全性方面,哪个更受欢迎?使用现有方法获取远程文件有哪些安全问题,我该如何防范?

    好吧,对于初学者来说,这并不比允许人们上传更安全,如果这是重点的话。如果你不是很小心,jimmyB 可以将恶意.js 上传到他的服务器,然后你的任何一种方法都会在你的网站上提供他的文件。

    我建议考虑 CI 的文件上传类,而不是尝试使用这些方法。无论哪种方式,最终结果都是您最终在服务器上得到一个文件;使用 CI 的文件上传,至少有一些内置的文件类型检查等。您还可以利用 CI 的 XSS 过滤和东西。

    http://ellislab.com/codeigniter/user_guide/libraries/file_uploading.html

    【讨论】:

    • 我避免上传文件,因为这不是用户应该做的事情。我不希望他们保存图片并上传。
    • 至于安全性,我更关心的是确保文件只是一个图像并且不包含任何恶意内容。
    • 查看 codeigniters core/libraries/Upload.php 文件(特别是 MIME 类型检查)。您不能依赖文件扩展名(例如 jpg/png)来确定文件的实际类型。就内容而言,除了使用 A/V 软件进行扫描之外,您无能为力。见stackoverflow.com/a/8638112/183254
    • 对于图像,您可以使用exif_imagetypegetimagesize 来验证文件实际上是图像。更多信息:stackoverflow.com/a/2006664/398242
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多