【发布时间】:2015-11-01 21:32:43
【问题描述】:
请有人解释一下(希望对新手用简单的话)为什么基于 RESTful API 构建的 Web 应用程序可以免于 CSRF?
我在询问:Serializing FormView data in JSON 后收到了这样的断言,但老实说我不知道为什么?
提前致谢
【问题讨论】:
-
浏览器使用 REST api 是有意义的。如果浏览器不使用它(比如 curl),那么 CSRF 就不是问题。
请有人解释一下(希望对新手用简单的话)为什么基于 RESTful API 构建的 Web 应用程序可以免于 CSRF?
我在询问:Serializing FormView data in JSON 后收到了这样的断言,但老实说我不知道为什么?
提前致谢
【问题讨论】:
CSRF 或跨站点请求伪造,用外行的话来说,意味着只允许选定的来源(您自己的网站)向特定的 url 提交数据。它可以防止其他网站或机器人滥用您的功能。
说,我有一个注册 url,/registration/,但我不想让外部提交 POST 数据到/registration/。因此,当为/registration/ 发出 GET 请求时,我将提供一个 crsf cookie(取决于主机和其他内容),并确保为 POST 请求提供相同的 cookie。这将确保请求注册表的用户(即真正的网络用户,而不是机器人)能够注册。它不是完全可靠的,但可以确保一定程度的安全性。
现在,我们不在 API 中使用 CSRF,原因如下:-
从技术上讲,CSRF 是作为 cookie 存储的,因为浏览器不是 API 的预期客户端,所以没有用。
其次,API 应该使用专门的客户端和用户身份验证,从而无需使用任何 CSRF 保护。
第三,Restful api 应该是无状态的,因此 API 调用的顺序应该无关紧要,这对于 CSRF 的工作至关重要。
注意:-
如果你有 Angular 这样的前端框架或者打算在浏览器上使用 api,那么使用 CSRF 是完全可以的。在这种情况下,您应该为您的 api 编写两种类型的身份验证。
在这种情况下,对 api 的任何请求都必须通过至少一种身份验证进行身份验证。
【讨论】:
根据owasp.org:
跨站请求伪造 (CSRF) 是一种攻击类型,当恶意网站、电子邮件、博客、即时消息或程序导致用户的 Web 浏览器执行不需要的操作时发生在用户当前已通过身份验证的受信任站点上。
这对于 REST Web 服务来说不是问题,因为:
1) 您通常希望您的服务可以从多个应用程序(移动应用程序、浏览器等)访问
2) 您必须为每个请求提供直接身份验证,因此这种攻击不适用于 REST 服务。身份验证由您的应用程序(比如说 javascript)完成,而不是直接由您的浏览器完成(发送会话 id),因此即使恶意应用程序将用户重定向到您的网页,它也无法自动触发您的 javascript 函数来执行请求(和认证)。
【讨论】:
authentication is done by your application (let's say javascript) and no directly by your browser 让我觉得我是零。非常感谢任何链接或文档。非常感谢