我正在寻求利用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>
现在,我希望能够验证请求来自拥有密钥的客户,而不仅仅是将该代码复制/粘贴到其页面上的任何人。
我做了一些研究,发现$_SERVER['HTTP_REFERRER']
可以向我提供这些信息,但大多数混合评论说它并不总是可靠的(我遇到的大多数问题都是几岁)。
问题
1。)这种使用iframe / GET请求的方法是实现此功能的标准方法吗?
2。)是否有标准的,安全可靠的方式来验证GET请求的来源?
答案 0 :(得分:1)
就个人而言,我绝不会将iFrame用于此功能。我假设这必须是相当安全的,这就是为什么只有您指定的客户才能查看它?如果由于某种原因你不能使用PHP来嵌入你需要显示的内容(例如通过使用“包含”文件),我会使用AJAX,它仍然会使用你已经拥有的任何PHP用户验证将内容动态加载到安全的网页中。
这是因为您的PHP用户验证将(应该!)使用cookie /会话信息来确定哪个客户正在查看该页面,从而决定是否应该传递内容,因为Session
变量由单个确定存储在客户端的唯一代码,它与您希望收集的关于用户服务器端的信息相匹配(可能包括他们访问的最后一页,这是“HTTP_REFERRER”变量会给您的信息,如果他们来的话从您网站上的另一页)。
'$ _ SERVER'变量不可靠,因为它们依赖于Web浏览器在发出请求时提供给他们的信息,并且这些信息可以很容易地被伪造,大多数人对基本了解标题发送。
答案 1 :(得分:1)
不幸的是,这不可能以安全的方式进行。
回答您的问题:事实上,这不是标准功能本身。我的意思是,没有标准的安全方式允许仅通过来自允许网站的iframe加载内容。
此沟通中有三方:
1)您的网站
2)在iframe中加载您网站数据的客户网站
3)最终用户访问客户网站
当最终用户访问客户网站时,他将通过iframe向您的网站发送GET请求。在此连接中,不涉及上述第二方(客户网站)。在这种情况下,您的网站没有可靠的方法来了解此请求是否来自iframe。只支持第2方在这里做的是向最终用户的请求添加HTTP_REFERER标头。但是这个标题不可信任。
例如,如果我想滥用此内容并在我的网站上显示该内容,我可以在我的应用程序上创建一个代理页面,在那里我对您的应用程序执行后端调用(添加有效的HTTP_REFERER标头)并显示结果回来了。
答案 2 :(得分:1)
总之,使用NONCE(烹饪),验证IP和用户代理。
步骤:
传递外框时,生成唯一标识符 (完全随机,长串)并将其与cookie一起返回 HTML内容。
同时,请记下您拥有的IP和用户代理字符串 将该唯一标识符发送给DB,并将其存储在DB中。
在请求内框时,假设相同的域, 饼干也会来的。 (如果是其他域名,则需要附加 唯一标识符作为可见字符串,但实际上并非如此 关注,只是丑陋)
如果用户代理或IP与您存储的用户代理或IP不匹配 唯一字符串,或请求太长(即一小时后,或 对您的应用程序而言是合理的)或者多次使用唯一字符串 (或者你对它施加的任何其他限制)然后拒绝 请求并使唯一标识符无效(删除)。
不是100%万无一失,但只是结合更多选项,以减少滥用的可能性。