Javascript 如何保护浏览器使用的RESTful API免受CSRF攻击?
我正在为一组网站设计API。这些站点非常相似(有点像StackOverflow、SuperUser和ServerFault),它们有一个共享的后端是有意义的。因此,我们决定尝试使用一个好的RESTAPI作为后端,并使用一组非常相似但不同的前端来使用该API。前端最好都是静态的,但如果结果是几乎不可能的话,这不是一个硬性要求 我现在正在设计那个API,我担心安全问题,特别是CSRF。根据我对CSRF攻击的基本理解,它们由两个重要组成部分组成:Javascript 如何保护浏览器使用的RESTful API免受CSRF攻击?,javascript,security,rest,Javascript,Security,Rest,我正在为一组网站设计API。这些站点非常相似(有点像StackOverflow、SuperUser和ServerFault),它们有一个共享的后端是有意义的。因此,我们决定尝试使用一个好的RESTAPI作为后端,并使用一组非常相似但不同的前端来使用该API。前端最好都是静态的,但如果结果是几乎不可能的话,这不是一个硬性要求 我现在正在设计那个API,我担心安全问题,特别是CSRF。根据我对CSRF攻击的基本理解,它们由两个重要组成部分组成: 能够命名资源和请求主体 诱使用户/浏览器使用环境身份验
我意识到,我在这里基本上试图做的是允许来自一个域的跨站点请求,而不允许来自另一个域的跨站点请求,这并不容易。肯定有一些合理的解决方案吗?答案取决于您需要支持什么。如果我们假设您希望支持一个使用REST服务的web应用程序,并对一个API使用相同的REST服务,而该API与碰巧是RESTFUL的web应用程序不同(您可能会决定“会话”是为您准备的!)
目前(/me相当累)我认为您建议的将javascript与HTTP Basic Auth结合使用的方式是一个良好的开端 根据定义,CSRF令牌是“每用户状态”,因此不是RESTful的。为了安全起见,大多数API都打破了“每个用户状态”的要求,并要求将CSRF令牌作为HTTP头参数传递 还有其他的方法。检查referer不如CSRF令牌强大,但它是RESTful的,非常不可能被破坏。请记住,缺少推荐人应被视为失败的请求
XSS可用于绕过基于令牌的CSRF预防和基于referer的CSRF预防 我有另一个可能的解决方案,所以我将它列为一个答案。请随意拆开:)
auth.platform.com
接受身份验证并设置cookie。如果auth.site.com
是auth.platform.com
的CNAME,那么对auth.site.com
的请求(解析后在auth.platform.com
结束)是否能够为site.com
设置cookie?这样我就可以加倍提交会话cookies
当然,auth.platform.com
只会为一些白名单域设置cookie
编辑:当然,这一点也不起作用,因为您必须使用HTTPS安全地进行身份验证,HTTPS会识破您的诡计。将您的API设计为真正的RESTful API,可以防止最常见的CSRF向量:
- 避免cookies会防止它们被“偷走”
- 使用GET进行“安全”操作可以防止
和img
在没有用户交互的情况下触发不安全的操作iframes
然后,您应该实现让用户的浏览器阻止来自您不信任的来源的请求。正如您所说,问题是您既要防止也要允许跨站点请求。问问薛定谔,你知道吗