【问题标题】:Embedded iframe - Verify source/origin of GET request嵌入式 iframe - 验证 GET 请求的来源/来源
【发布时间】:2014-03-28 13:46:49
【问题描述】:

我正在寻求利用 iframe 在客户网站中嵌入一些 html,这些 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>


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

我做了一些研究,发现$_SERVER['HTTP_REFERRER'] 可以 给我这个信息,但是大多数评论都说它并不总是可靠的(而且我遇到的大多数问题都是几年前的)旧)。

问题

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

2.) 是否有标准、安全和可靠的方式来验证 GET 请求的来源?

【问题讨论】:

    标签: php iframe get embed restful-authentication


    【解决方案1】:

    不幸的是,这是不可能的。

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

    本次交流涉及三方:

    1) 您的网站

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

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

    当最终用户访问客户网站时,他会通过 iframe 向您的网站执行 GET 请求。在此连接中,不涉及上述第 2 方(客户网站)。在这种情况下,您的网站没有可靠的方法可以知道此请求是否来自 iframe。唯一支持第 2 方的做法是将 HTTP_REFERER 标头添加到最终用户的请求中。但是这个标头是不可信的。

    例如,如果我想滥用它并在我的网站上显示该内容,我可以在我的应用程序上创建一个代理页面,在其中我对您的应用程序执行后端调用(添加有效的 HTTP_REFERER 标头)并显示结果回来了。

    【讨论】:

    • 最简单/最安全的方法类似于@Adi Bradfield 的回答,客户必须将某种服务器端脚本(原始 php 代码)粘贴到他们的页面中,而不是iframe/GET?
    • 我认为 Adi 的回答是假设您试图仅限制您的客户(而不是最终用户)的内容。他在第二句话中陈述了这一点:“这就是为什么只有您指定的客户才能查看它”
    • 我希望只能从该客户网站查看。使用 iframe,任何人都可以检查源代码,并将代码复制到他们的站点并伪造 HTTP_REFERER
    【解决方案2】:

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

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

    '$_SERVER' 变量不可靠,因为它们依赖于发出请求时 Web 浏览器提供给它们的信息,并且这些信息很容易被大多数对标头如何具有基本了解的人伪造被发送。

    【讨论】:

    • 感谢您的回答!...但是这不是让客户“查看”,而是让客户放在他们自己的网页上,这样任何查看该页面的人都可以看到它。我有一个充满工作的数据库,我希望客户能够在他们的网站上列出我的数据库中的工作......
    【解决方案3】:

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

    步骤:

    1. 交付外框时,生成唯一标识符 (完全随机的长字符串)并在 cookie 中返回 HTML 内容。

    2. 同时,记下你拥有的 IP 和用户代理字符串 将该唯一标识符发送到数据库,并随时间一起存储在数据库中。

    3. 在请求内框时,假设域相同, 饼干也会来。 (如果是不同的域,您需要附加 唯一标识符作为可见字符串,但这并不是真正的 担心,只是更丑)

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

    并非 100% 万无一失,但只是结合更多选项以使其被滥用的可能性越来越小。

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多