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

Php 我应该如何创建嵌入代码以在其他人身上显示我的照片';s的网站?,php,security,iframe,embed,jpeg,Php,Security,Iframe,Embed,Jpeg,我的网站上已经存储了很多照片,我想允许其他人在自己的网站上发布这些照片。我试图做的是为每张照片创建嵌入代码,以允许第三方在iframe中发布照片(我使用PHP)。这就像什么-允许其他人嵌入他们的照片 src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs=" Getty的嵌入代码使用iframe,图

我的网站上已经存储了很多照片,我想允许其他人在自己的网站上发布这些照片。我试图做的是为每张照片创建嵌入代码,以允许第三方在iframe中发布照片(我使用PHP)。这就像什么-允许其他人嵌入他们的照片

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
Getty的嵌入代码使用iframe,图像/网页的源代码如下:

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
我的问题是,我不知道创建/引用图像/页面的最佳方法。Getty已经创建了一个新页面来承载每个单独的图像,这允许他们添加标题等。我的图像不在数据库中,它们只是包含在特定的文件夹中,我用foreach/glob脚本将它们显示在My网站上

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
为了显示iframe的目标源页面,我可以使用一个PHP模板,该模板由嵌入代码提供唯一的图像文件名

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
src="//embed.mydomain.com/embed/embed-image.php?path/to-the-photo"

PHP模板然后显示正确的图像和任何适当的图像元数据。我敢肯定这会带来很多安全隐患——有没有更好的方法呢?

我敢肯定Getty不会为每个图像创建一个新页面。他们可能只是使用
htaccess
将图像请求重定向到处理请求的脚本。也许是这样的:

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
//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
文件来显示正确的图像

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
这是否安全完全取决于您对
embed.php
的实现,但由于这与任何请求一样有效,您应该采取同样的谨慎和措施。要记住的一些事情,但不限于:

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
  • 检查ID/散列是否与您期望的相同(数字/aplhanumeric/etc)
  • 如果您在查询中使用它来获取元数据。始终确保它不用于mysql注入
  • 如果你担心有人偷图像,不要使用序列号
即使您希望使用自己的解决方案,也可以将路径作为参数提供给脚本。只需确保您没有使用服务器上位置的完整路径(例如:不要在windows上使用
c:\inetpub\wwwroot\images\image.jpg
,而是使用
\images\image.jpg

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
此外,如果您确实收到完整路径,请确保它是您期望的路径。人们可以使用
\images\..\index.php
移动到您的根文件夹。甚至是最糟糕的,一直到系统文件夹。第一个也是最重要的检查是,这只是他们要求的图像。如果他们确实使用了一些奇特的方式来绕过你的文件夹检查,如果他们只能访问图像,你仍然相对安全

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
无论您采取何种方式,如果您使用
PHP
来实际显示图像,那么您将使用比所需更多的资源。因此,如果您希望有很多访问者或关心性能,请不要使用
PHP
读取文件并使用正确的标题输出

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
我个人的投票将使用以下程序

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
  • 为文件夹中的所有图像编制索引,并保存到数据库的路径
  • 为数据库中的每个图像以及希望用户看到的元数据存储一个唯一的键
  • 使用
    htaccess
    将唯一密钥链接到PHP文件
  • PHP
    文件中,检查哈希是否链接到数据库中的图像
  • 用带有
    标记的php将元数据显示在网站公共路径上的实际图像上
附带说明:不确定您是否理解
URL
的“/:”部分,但它的意思是“使用与此网站使用的相同协议”。这意味着,如果有人使用
HTTPS
将您的图像/iframe嵌入到网页上,它也会以
HTTPS
的形式请求您的站点,因此请确保您的服务器能够处理它

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
仅使用
HTTP://
或没有有效的
HTTPS
服务器,意味着任何将您的图像嵌入到安全网页的人现在都被标记为不安全。显然,这是一个不明智的选择

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
编辑器注释:此代码高度不安全,因为它公开了所有 PHP文件可以访问公众

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
我会使用这样的域:

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
src=“//embed.mydomain.com/embed/embed image.php?path=path/到照片”

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
注意域中的额外路径kexword

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
现在只需要使用域中的路径并从路径返回图像

src="//embed.gettyimages.com/embed/488344275?et=-AesBiwMQb5LLh6krfjSJw&sig=nxsiL6uBhQNOeWxMs0-04_TmimSD3-PcKaqmf-Y_xTs="    
<?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
?>


由于您在网上和编程时所做的任何事情都会带来很多安全隐患,我想知道您如何真正地问“有更好的方法来做到这一点吗?”因为总是有更好的方法来做到这一点,但问题是,如果您真的想要的话。所以回答你的问题:是的。更多细节:您拥有的数据库是文件系统。您应该保留一个白名单,列出哪些文件应该显示,哪些文件不应该显示。我很想访问
embed.mydomain.com/embed/embed image.php?path=../../../../../../../../../../../../../../../../../../../../../etc/passwd
在提供由用户输入指定的文件时要小心,因为它们可能会请求一些您不想显示的文件(比如数据库密码)。永远不要相信用户的输入!正如Swardofpain所说,使用此代码将产生严重的安全问题。您可以请求服务器上几乎所有的文件。您唯一的希望是webserver用户被限制为wwwroot,但您仍然可以获得所有
PHP
文件。