我正在为我的应用程序(基于 Django)的一部分使用第三方(X 公司)服务,该服务位于安全登录后面。 X 的内容通过 iframe 传递,该 iframe 简单地嵌入到我的一个页面中。
我花了很多时间在 X 的应用程序中构建自定义内容(它是一个自定义的交互式地质工具),而且我对 X 的订阅也很昂贵。我想防止我的一位用户与其他同事甚至其他公司的用户共享 iframe 链接,并且无需登录我的应用程序即可使用我的 X 内容。
不幸的是,X 无法通过 IP 或任何其他类型的链接安全来限制 iframe 内容。我知道,听起来很疯狂,但现在就是这样。
构建自己的安全解决方案的最佳方法是什么?有没有办法使用另一台服务器作为中介,以便当客户端打开页面时,我的实时服务器会访问从 X 获取内容的中间服务器? 然后,我是唯一一个在我的实时服务器上接受中间服务器请求的人。
如果 X 公司在没有身份验证的情况下提供服务(任何人都可以在框架中下载它),那么这就是他们最终无法在代码中解决的问题。即使您隐藏实际的 iframe url,它仍然适用于任何拥有该链接的人。但你是对的,至少不是所有的访客都会拥有它,这可能已经足够好了,如果你愿意的话,这是可以接受的风险。
您在中间放置一台服务器并且您的应用程序仅访问临时服务器的想法实际上是可行的。这称为反向代理,任何 Web 服务器软件(Apache、nginx、IIS 等)都可以做到,无需太多设置。因此不需要开发,因此设置它不是一个编程问题。
什么是编程问题是该解决方案的安全性。您需要注意,虽然这会对您的用户隐藏 iframe url,但该 url 仍然有效并且对任何人都有效,这是 X 公司服务的问题。另外,您还需要在反向代理服务器上进行身份验证,否则新的 iframe url 可以像原始 iframe url 一样被复制。
还要注意,反向代理具有大量嵌入式资源和 JavaScript 的复杂网站会有其陷阱。根据实际内容,真实来源有时可能会泄露给您的用户。
const isIframe = window.self !== window.top;
const url = isIframe ? document.referrer : document.location.href;
if (url != "https://yourwebsite") {
document.write("<b>This domain is not authorized to display this content. For licenses, contact...</b>")
}
这并不能阻止某人直接访问 iframe URL 并查看 HTML 和 JavaScript 代码 - 他们仍然能够访问内容,但他们无法在自己的网站上托管该 iframe URL。如果其他网站正在使用该内容,您甚至可以发送一些无声警报:
if (url != "https://yourwebsite") {
// ajax request to your own application, to log the URL and create an alert.
// do NOT send an email each time or you might get a lot of email.
}