为什么在 REST 上下文中进行 CSRF 保护没有意义?
Why Having a CSRF protection in a REST context doesn't make sense?
有人来解释一下(希望对新手来说简单些)为什么基于 RESTful API 构建的 Web 应用程序可以豁免 CSRF?
我在询问后收到了这样的断言:Serializing FormView data in JSON,但老实说我不明白为什么?
提前致谢
根据owasp.org:
Cross-Site Request Forgery (CSRF) is a type of attack that occurs when a malicious Web site, email, blog, instant message, or program causes a user's Web browser to perform an unwanted action on a trusted site for which the user is currently authenticated.
这不是 REST Web 服务的问题,因为:
1) 您通常希望可以从多个应用程序(移动应用程序、浏览器等)访问您的服务
2) 您必须为每个请求提供直接身份验证,因此这种攻击不适用于 REST 服务。身份验证是由您的应用程序完成的(假设 javascript),而不是由您的浏览器直接完成(发送会话 ID),因此即使恶意应用程序将用户重定向到您的网页,它也无法自动触发您的 javascript 函数来执行请求(和身份验证)。
CSRF 或跨站请求伪造,通俗地说,意味着只允许选定的来源(您自己的网站)向特定的 url 提交数据。它可以防止其他网站或机器人滥用您的功能。
说,我有一个 url 用于注册,/registration/
,但我不想允许外部向 /registration/
提交 POST 数据。因此,当为 /registration/
发出 GET 请求时,我会提供一个 crsf cookie(取决于主机和其他内容),并确保为 POST 请求提供相同的 cookie。这将确保请求注册表格的用户(即真正的网络用户,而不是机器人)能够注册。它不是完全防伪的,但确保了一定程度的安全性。
现在,我们不在 API 中使用 CSRF,原因如下:-
从技术上讲,CSRF 存储为 cookie,因为浏览器不是 API 的预期客户端,所以没有用。
其次,API应该使用专门的客户端和用户身份验证,从而无需使用任何 CSRF 保护。
第三,Restful api 应该是无状态的,因此 API 调用的顺序无关紧要,这对于CSRF.
注:-
如果你有像Angular这样的前端框架,或者也打算在浏览器上使用api,那么使用CSRF是完全可以的。在那种情况下,您应该为 api 编写两种类型的身份验证。
- 基于令牌的身份验证 - 适用于非浏览器客户端
- 会话身份验证 - 用于基于浏览器的客户端(使用 csrf)
在这种情况下,对 api 的任何请求都必须通过至少一种身份验证进行身份验证。
有人来解释一下(希望对新手来说简单些)为什么基于 RESTful API 构建的 Web 应用程序可以豁免 CSRF?
我在询问后收到了这样的断言:Serializing FormView data in JSON,但老实说我不明白为什么?
提前致谢
根据owasp.org:
Cross-Site Request Forgery (CSRF) is a type of attack that occurs when a malicious Web site, email, blog, instant message, or program causes a user's Web browser to perform an unwanted action on a trusted site for which the user is currently authenticated.
这不是 REST Web 服务的问题,因为:
1) 您通常希望可以从多个应用程序(移动应用程序、浏览器等)访问您的服务
2) 您必须为每个请求提供直接身份验证,因此这种攻击不适用于 REST 服务。身份验证是由您的应用程序完成的(假设 javascript),而不是由您的浏览器直接完成(发送会话 ID),因此即使恶意应用程序将用户重定向到您的网页,它也无法自动触发您的 javascript 函数来执行请求(和身份验证)。
CSRF 或跨站请求伪造,通俗地说,意味着只允许选定的来源(您自己的网站)向特定的 url 提交数据。它可以防止其他网站或机器人滥用您的功能。
说,我有一个 url 用于注册,/registration/
,但我不想允许外部向 /registration/
提交 POST 数据。因此,当为 /registration/
发出 GET 请求时,我会提供一个 crsf cookie(取决于主机和其他内容),并确保为 POST 请求提供相同的 cookie。这将确保请求注册表格的用户(即真正的网络用户,而不是机器人)能够注册。它不是完全防伪的,但确保了一定程度的安全性。
现在,我们不在 API 中使用 CSRF,原因如下:-
从技术上讲,CSRF 存储为 cookie,因为浏览器不是 API 的预期客户端,所以没有用。
其次,API应该使用专门的客户端和用户身份验证,从而无需使用任何 CSRF 保护。
第三,Restful api 应该是无状态的,因此 API 调用的顺序无关紧要,这对于CSRF.
注:-
如果你有像Angular这样的前端框架,或者也打算在浏览器上使用api,那么使用CSRF是完全可以的。在那种情况下,您应该为 api 编写两种类型的身份验证。
- 基于令牌的身份验证 - 适用于非浏览器客户端
- 会话身份验证 - 用于基于浏览器的客户端(使用 csrf)
在这种情况下,对 api 的任何请求都必须通过至少一种身份验证进行身份验证。