我正在开发一个完全支持 SSL 的网站。成员可以发布包含文本、youtube 视频、soundcloud 声音和外部图像的个人资料。我有一个过滤器来删除所有 iframe、js 等,并格式化 youtube 和 soundcloud 播放器以使用 https。我不确定如何处理通常托管在非 ssl 域上的图像。我的第一个想法是制作一个代理系统来获取图像并通过本地 ssl 提供它。但是我拼凑起来测试的系统不起作用!
基本上所有外部 URL 都会像这样被过滤../external/?url=http://www.somedomain.com
。这包括外部图像 URL。然后他们被传递给这个;
public function index() {
$url = $this->input->get('url', TRUE);
$data = FALSE;
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
$type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$responce = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$sub_type = explode('/', $type); // so we return just image instead of e.g. image/jpg
if ($type == 'text/html') {
redirect($url);
} else if ($sub_type[0] == 'image') {
header('Content-type: ' . $type);
echo $data;
}
}
但是,这并不能安全地提供外部图像,所以我需要什么?这也是最好的方法吗?我不想从我的服务器下载和提供所有外部图像。
最终目标是让这个函数检查内容是否存在(不是 404),并可能探测外部文件以确保它不是恶意的。现在虽然我只是希望它通过 ssl 提供文件,除非这是一个非常糟糕的主意。