我应该如何创建嵌入代码以在其他人的网站上显示我的照片?

时间:2014-05-08 12:32:12

标签: php security iframe embed jpeg

我的网站上已经存有很多照片,我希望其他人可以在自己的网站上发布这些照片。我要做的是为每张照片创建嵌入代码,以允许第三方在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模板然后显示正确的图像和任何适当的图像元数据。我确信这会带来很多安全隐患 - 有更好的方法吗?

2 个答案:

答案 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的实现,但由于这与任何请求一样,您应该应用相同的警告和混乱。有些事情要记住,但不限于:

  • 检查ID / hash是否符合您的预期(数字/ aplhanumeric / etc)
  • 如果您在查询中使用它来获取元数据。始终确保它不用于mysql注入
  • 如果您担心盗窃图片的人,请不要使用序号

即使您想使用自己的解决方案,将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
?>