我的网站上已经存有很多照片,我希望其他人可以在自己的网站上发布这些照片。我要做的是为每张照片创建嵌入代码,以允许第三方在iframe中发布照片(我正在使用PHP)。它就像Getty Images have done here - 允许其他人嵌入他们的照片。
Getty的嵌入代码使用iframe,其中图片/网页的来源是这样的:
src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="
我的问题是我不知道创建/引用图像/页面的最佳方法。 Getty创建了一个新页面来托管每个单独的图像,这允许他们添加标题等。我的图像不在数据库中,它们只包含在某些文件夹中,我将它们显示在我的网站上一个foreach / glob脚本。
要显示iframe的目标源页面,我可以拥有一个PHP模板,该模板由嵌入代码提供唯一的图像文件名。
src="//embed.mydomain.com/embed/embed-image.php?path/to-the-photo"
PHP模板然后显示正确的图像和任何适当的图像元数据。我确信这会带来很多安全隐患 - 有更好的方法吗?
答案 0 :(得分:3)
我非常确定Getty不会为每张图片创建新页面。他们可能只是使用htaccess
将图像请求重定向到处理请求的脚本。也许是这样的事情:
//this will allow alphanumeric id's with _ and -. You could alter to only allow numeric by only using [0-9] instead of [a-zA-Z0-9_-]
RewriteRule ^embed/([a-zA-Z0-9_-]+)$ embed.php?id=$1
RewriteRule ^embed/([a-zA-Z0-9_-]+)/$ embed.php?id=$1
现在,/embed/hash6834hfds
或/embed/hash6834hfds/
等请求会被重定向到embed.php?id=hash6834hfds
。现在,您可以使用embed.php
文件显示正确的图像。
这有多安全,完全取决于embed.php
的实现,但由于这与任何请求一样,您应该应用相同的警告和混乱。有些事情要记住,但不限于:
即使您想使用自己的解决方案,将PATH作为参数提供给脚本也不成问题。只是确保你不使用服务器上的位置的完整路径(EG:不要在Windows上使用c:\inetpub\wwwroot\images\image.jpg
但是使用\images\image.jpg
)
此外,如果您确实收到了完整路径,请确保它符合您的预期。人们可能正在使用\images\..\index.php
移动到您的根文件夹。甚至最坏的一直到系统文件夹。第一个也是最重要的检查是它只是一个他们要求的图像。如果他们确实使用某种奇特的方式绕过您的文件夹检查,如果他们只能访问图像,您仍然相对安全。
无论你走到哪里,如果你使用PHP
来实际显示图像,那么你需要使用更多资源。因此,如果您期望有大量访问者或关心性能,请不要使用PHP
来读取文件并使用正确的标头输出。
我个人投票将使用以下程序
htaccess
将唯一键链接到PHP文件PHP
文件中检查哈希是否链接到数据库中的图像<img src="">
标记的php显示元数据到您网站公共路径上的实际图片旁注:不确定你是否理解&#34; //:&#34; URL
的一部分是,但它意味着&#34;使用与此网站使用相同的协议&#34;。这意味着如果有人使用HTTPS
在您的网页上嵌入您的图片/ iframe,它会将您的网站请求HTTPS
,因此请确保您的服务器可以处理它。
仅使用HTTP://
或没有有效HTTPS
服务器,意味着任何将您的图片嵌入安全网页的人现在都被标记为不安全。显然这将是一个不明智的选择。
答案 1 :(得分:0)
编辑备注:此代码高度不安全,因为它暴露了每一个 文件PHP可以访问公众。
我会使用这样的域名:
src="//embed.mydomain.com/embed/embed-image.php?path=path/to-the-photo"
注意域中的额外路径kexword
现在只需要使用域中的路径并从路径返回图像。
<?php
$path = $_GET["path"]; // takes the path from the domain
header("Content-Type: image/png"); // change this when it is a gif or jpeg (Note: jpeg = jpg here)
header("Content-Length: " . filesize($path)); // sets the size of the returned object
readfile($path); // returns the file from the path
?>