我正在尝试寻找是否有一种好的方法来防止嵌入在客户网站上的 javascript 小部件上的 CSRF。
该小部件将使最终用户能够通过 JSONP 向 PHP 服务器发出针对我们客户帐户的请求,该服务器将这些请求代理到我们的(非公共(public))API。
到目前为止,我还没有想出一个万无一失的方法来确保所有请求都只来 self 们客户的网站。我的一些想法:
- token 在服务器端生成并与每个后续 JSONP 请求一起传回(但不确定如何验证初始请求,因为第一个 token 在 JS 中是可读的,任何人都可以请求“下一个” token )<
- 检查 Referer header (不可靠,可能被欺骗或浏览器根本不传递)
- 使用SSL(当然有帮助但不能解决CSRF问题)
这有可能吗?我遇到过Fotomoto's widget这似乎允许我们正在寻找的相同类型的功能,但我不确定他们是如何做到的。
最佳答案
您永远找不到一种解决方案来确保来自随机第三方(用户)的请求实际上是通过访问您客户的网站发起的。如果您的安全依赖于此,那么您必须删除该假设。 (如果您的意思是“确保请求仅来 self 们客户的网站”服务器,那么这是微不足道的:带有客户端证书的 SSL。但我假设您的意思是“来自具有客户端证书的随机用户机器”使用我们客户网站的意图。”)
您应该了解如何防止用户被欺骗 (CSRF)。因此,例如,Referer 可以被欺骗这一事实与这个问题无关。唯一的问题是是否有浏览器存在允许第三方诱骗用户创建欺骗性 Referer 的缺陷。因此,您应该根据需要检查 Referer,但还不够。也就是说,如果Referer错误,就挂断调用者。但 Referer 是正确的事实并不意味着您实际上收到了合法请求。我认为大多数 CSRF 是由于未能检查 Referer 而不是浏览器错误。
Wikipedia article on CSRF对明显的预防技术有一个体面的总结。仅检查 Referer 是重要的第一步。
关于security - 如何可靠地保护公共(public) JSONP 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232985/