2011-08-29 44 views
3

我试图找出是否有防止CSRF嵌入式客户的网站一个JavaScript控件的好方法。如何可靠地保护公共JSONP请求?

这个小部件将使最终用户能够通过JSONP向我们客户的账户发送一个请求给我们(非公共)API的PHP服务器。

到目前为止,我还没有想出一个绝对的方法来确保所有请求都来自我们客户的网站。有些想法我有:在服务器端生成并与每个后续JSONP请求一起(不知道如何验证,虽然初始请求,因为第一个令牌将在JS和任何人是可读的回传

  • 令牌可要求“下一个”令牌)
  • 检查Referer标头(不可靠的,是可以被欺骗或者根本就没有通过浏览器传递)
  • 使用SSL(当然会帮助,但没有解决CSRF的问题)

这是在所有可能的?我已经遇到Fotomoto's widget这似乎让同一类型的,我们正在寻找的功能,但我不知道他们是如何做的。

回答

1

您永远不会找到一种解决方案,确保来自随机第三方(用户)的请求实际上是通过访问您客户的网站发起的。如果您的安全依赖于此,那么您必须删除该假设。 (如果你真的是“确保请求只从客户的网站来了” 服务器那么这是微不足道的。SSL使用客户端证书,但我相信你的意思是“从随机用户的机器来,意图用我们的客户的网站“。)

你应该寻找如何防止用户被欺骗(CSRF)。举例来说,Referer可能被欺骗的事实与这个问题无关。唯一的问题是,是否有一个浏览器有一个缺陷,可以让第三方诱骗用户创建欺骗引用者。所以你应该检查Referer是必要的,但不够。也就是说,如果Referer错误,挂断呼叫者。但Referer正确的事实并不意味着你实际上收到了合法的请求。我认为大多数CSRF是由于未能检查Referer而不是浏览器错误。

Wikipedia article on CSRF有一个体面的总结显而易见的预防技术。只需检查Referer是第一步。

1

根据定义,这是一个“跨站点请求”。请注意,CSRF请求是否是漏洞很大程度上取决于请求的功能。例如,如果攻击者可以强制客户端发出搜索请求,那么这可能对攻击者没有任何用处。如果攻击者可以更改管理员的密码,那么你有一个非常严重的问题。

所以不知道这些请求是做什么的,不可能说它应该如何保护。话虽这么说,我认为reCapthca是如何非对称加密技术可以用来保证服务器授权客户的翻译与第三方一个很好的例子。但没有更多的信息,我不知道这可以如何帮助你。