通过对服务器的初步CORS调用,保证跨域window.opener调用的原点(父URL)

时间:2014-04-03 03:28:43

标签: javascript cookies cross-domain jsonp cors

我的第一个问题。

这是任务。我有一个按钮,我想放在第三方网站上。当用户单击该按钮时 - 通过javascript window.open方法打开一个新窗口。在该窗口中,用户被重定向到我的Web应用程序并且必须登录。现在,我如何确定用户来自何处(例如,他点击按钮的网站)。基本上我想要两件事 - 确保我可以在弹出窗口打开时跟踪按钮被点击的网站,并确保只有订阅者可以使用该按钮(第一个条件将使其成为可能,因为我将能够过滤掉基于URL的未经授权的请求。)

显然window.opener不起作用,因为它是跨域的,浏览器不会允许它。

我的一个想法是在页面加载时使用我的脚本中的CORS请求,这会调用我的服务器,服务器会产生一些秘密并用它设置cookie,然后返回另一个包含window.open调用的javascript代码将该秘密作为参数和另一个将从document.location分配值的参数(这将基本上将当前URL设置为参数)。理论上应该确保从我的服务器合法地接收调用弹出窗口的脚本 - 因此它提供的URL是正确的。否则,如果有人创建自己的脚本来调用我的弹出窗口 - 他们当然可以设置他们想要的任何URL作为参数,但他们不会知道正确的cookie秘密。

如果我的方法是正确的,不能被黑客攻击或是垃圾,请告诉我? 还有更好的方法吗?

我几天来一直在研究和思考它 - 它伤害了我的大脑。

感谢所有人提前 - 感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

如果您想知道您的用户来自哪个(哪个网站),请使用

document.referrer;

您可以将其保存在变量中并重定向。

就cookie而言,如果第三方指的是不同的域名,则无法跨域访问Cookie。

答案 1 :(得分:0)

我自己找到了解决方案。

因为window.open调用另一个域 - window.opener和document.referrer将不起作用。

这里唯一的方法是使用这里描述的windows(web消息)之间的消息发送机制: http://en.wikipedia.org/wiki/Web_Messaging

现在所有主流浏览器都支持此功能。

它允许将消息发送到具有不同域的另一个窗口并设置预期的域,因此在接收窗口中,您还可以设置可以接收消息的预期域 - 这样您就可以确定此特定域发送了消息并且可以保证开启者的URL。