如何制作不可伪造的跨域请求

时间:2011-04-14 07:56:34

标签: javascript security cross-domain csrf

我需要从Site B获取一些数据到Site A的服务器端。为了向Site B提出检索数据的请求,需要存在与Site B域相关联的Cookie。我想我需要在javascript中使用JSONP吗?

我的想法是使用JavaScript向B发出请求,然后捕获结果并在A域上添加一个cookie,以便随后对A的请求将带有带有返回数据的cookie(无需向A发送两个请求以获取A服务器端的信息。除了完全可以破解之外,这样可以正常工作。

数据本身并不是秘密,但我需要阻止请求伪造或Site A手动调用JSONP回调函数的人,或者使用被盗或伪造的数据手动设置A cookie。另外,黑客还有其他漏洞吗?这也需要防止!

我能想到这样做的唯一方法是:

Site A生成随机令牌并将其存储在会话中。然后,它将此标记附加到Site B的JSONP请求的查询字符串。 Site B然后响应,但使用数字签名加密常用数据和令牌。 Site A然后将此值粘贴到A上的Cookie中。在A的下一个请求中,A服务器端可以捕获cookie,获取值,解密,检查令牌以及它是否与会话中的值匹配,信任其余数据

这听起来合情合理吗?有没有更简单的方法?我的目标是降低A结束时的复杂性。

由于

2 个答案:

答案 0 :(得分:1)

避免被黑客攻击的方法是让网站直接相互通信,而不是使用客户端JavaScript。编写一个小型轻量级REST API,允许将数据传输到幕后,服务器到服务器。

链接到站点A时,在URL中包含一个身份验证令牌,然后可以使用对站点B的幕后调用来检查。此调用可以传输任何其他所需信息。令牌可能应该是IP绑定的,并在使用后过期。成功后,您可以在站点A中设置您的cookie信息,以避免需要进一步往返。

答案 1 :(得分:1)

您可以使用easyXDM在域之间进行通信。有了它,你有两个javascript程序,一个在消费者域,一个在提供者,它可以断言消费者的域。这两个程序都可以与用户交互,用户可以向双方进行身份验证。通过提供者程序知道用户是谁以及知道消费者是谁,提供者可以将他想要的任何数据传递给消费者。

这就是像Twitter,Disqus和LinkedIn这样的大公司使用它们的API。