Php 嵌入式iframe-验证GET请求的源/来源

Php 嵌入式iframe-验证GET请求的源/来源,php,iframe,get,embed,restful-authentication,Php,Iframe,Get,Embed,Restful Authentication,我正在寻求利用iframe在客户网站中嵌入一些html,这些网站将使用简单的GET请求从我的数据库中列出一些信息,如下所示: // customer would copy/paste this code onto their site // value of key would be unique key for that customer <iframe src='http://mydomain.php/api?key=1234j1lj1hj124kh' ></iframe

我正在寻求利用iframe在客户网站中嵌入一些html,这些网站将使用简单的
GET
请求从我的数据库中列出一些信息,如下所示:

// customer would copy/paste this code onto their site
// value of key would be unique key for that customer

<iframe src='http://mydomain.php/api?key=1234j1lj1hj124kh' ></iframe>
//客户会将此代码复制/粘贴到他们的网站上
//密钥的值将是该客户的唯一密钥

现在,我希望能够验证请求是否来自拥有密钥的客户,而不仅仅是将代码复制/粘贴到页面上的任何人。

我做了一些研究,发现
$\u SERVER['HTTP\u referer']
可以给我提供这些信息,但大多数评论认为这并不总是可靠的(我遇到的大多数问题都是几年前提出的)

问题

1。)这种使用iframe/GET请求的方法是实现此功能的标准方法吗


2。)是否有一种标准、安全和可靠的方法来验证GET请求的来源?

就个人而言,我永远不会将iFrame用于此功能。我假设这必须是合理安全的,这就是为什么只有您指定的客户才能查看它?如果出于任何原因,您不能使用PHP来嵌入需要显示的内容(例如,通过使用“包含”文件),我将使用AJAX,它仍然使用您现有的任何PHP用户验证将内容动态加载到安全网页中

这是因为您的PHP用户验证将(应该!)使用cookie/会话信息来确定哪个客户正在查看页面,从而决定是否应交付内容,因为
session
变量由存储在客户端的唯一代码决定,这与您想要收集的关于用户服务器端的信息(可能包括他们访问的最后一个页面,如果他们来自您网站上的另一个页面,“HTTP_referer”变量将提供给您)匹配


“$\u服务器”变量不可靠,因为它们依赖于发出请求时web浏览器提供给它们的信息,而且大多数人对头的发送方式有基本了解,很容易伪造这些信息

不幸的是,这不可能以安全的方式实现

回答您的问题:事实上,这本身并不是一个标准功能。我的意思是,没有一种标准的安全方式允许内容只能通过iFrame从允许的网站加载

本函件中有三方:

1) 你的网站

2) 在iframe中加载网站数据的客户网站

3) 最终用户访问客户网站

当最终用户访问客户网站时,他将通过iframe对您的网站执行GET请求。在这方面,上述第二方(客户网站)不参与。在这种情况下,您的网站无法可靠地知道此请求是否通过iframe发出。第二方在这里所做的唯一优势是将HTTP_REFERER头添加到最终用户的请求中。但此标头不可信

例如,如果我想滥用它并在我的网站上显示该内容,我可以在我的应用程序上创建一个代理页面,在那里我对你的应用程序执行后端调用(添加一个有效的HTTP\U REFERER头)并显示返回结果。

总之,使用NONCE(cookied),验证IP和用户代理

步骤:

  • 交付外部框架时,生成唯一标识符 (完全随机的长字符串)并在cookie中使用 HTML内容

  • 同时,请注意您拥有的IP和用户代理字符串 将该唯一标识符发送到,并随时间存储在数据库中

  • 当请求内部帧时,假设相同的域 饼干也会来的。(如果是其他域,则需要附加 唯一标识符是一个可见的字符串,但这并不真正重要 担心,只是更丑陋)

  • 如果用户代理或IP与存储的用户代理或IP不匹配 唯一字符串,或请求太长(即一小时后,或 无论对您的应用程序是否合理)或唯一字符串被多次使用 (或您对其施加的任何其他限制)然后拒绝 请求并使唯一标识符无效(删除)


  • 不是100%万无一失,但只要结合更多选项,它就越来越不可能被滥用。

    谢谢你的答案!。。。然而,这不是供客户“查看”,而是供客户放在他们自己的网页上,这样任何人都可以看到谁在那里查看页面。我有一个充满作业的数据库,我希望客户能够在他们的网站上列出我数据库中的作业……最简单/最安全的方法是@Adi Bradfield的答案,客户必须将某种服务器端脚本(原始php代码)粘贴到他们的页面中,而不是iframe/GET?我认为Adi的回答是假设您试图仅限制您的客户(而不是最终用户)的内容。他在第二句话中说:“这就是为什么只有您指定的客户才能查看它”我希望它只能从该客户的网站上查看。使用iframe,任何人都可以检查源代码,并将代码复制到他们的站点中,并伪造HTTP\U引用程序