Som*_*ion 2 javascript security spring spring-mvc spring-security
我计划构建一个前端和后端分离的应用程序(仅使用 ajax 请求)。我不允许跨站点 ajax 请求。我可以通过 ajax 调用生成 csrf 令牌,通过添加像 /csrf 这样的 API 返回如下内容:{csrf: 'token'} 以下网站说我绝对不能这样做:https : //github.com/pillarjs/理解-csrf
确保无法使用 AJAX 访问 CSRF 令牌!不要仅仅为了获取令牌而创建 /csrf 路由,尤其不要在该路由上支持 CORS!
有什么具体原因吗?我理解 CORS 背后的原因 - 这是禁用的,但是通过 ajax 提供 csrf 令牌是否存在任何固有的安全风险?
这不是安全风险,原因如下:
为什么你甚至想要通过 AJAX 公开 CSRF 令牌?
从可用性的角度来看,如果您不提供通过 AJAX 获取 CSRF 令牌的方法,并且不使用像 Double Submit Cookie 方法(完全解决此问题的一方)之类的方法,那么您的网站使用起来可能会很糟糕因为打开多个选项卡的任何人都会遇到有关 CSRF 令牌不匹配的错误。
在使用 CSRF 令牌的网站上,如果您在提交 POST 请求之前在表单上有一个钩子来获取最新的 CSRF 令牌,那么用户体验会更好。
现代单页应用程序网站(例如使用 React 或 Angular 构建的通用网站)也需要一种轻松获取 CSRF 令牌的方法,它们受益于 CSRF 令牌提供的投影,就像传统的基于服务器渲染的网站一样。
CSRF 令牌与会话相关联
CSRF 令牌绑定到会话?-?即使您没有明确登录,它仍然需要绑定到客户端和服务器之间跟踪的会话。如果你的会话令牌有一个 HTTP Only cookie(这是最佳实践,可以防止 XSS 攻击窃取它并帮助保护你免受 CSRF 攻击)没有人可以从远程域的请求中读取你的 CSRF 令牌(即使浏览器不强制执行 CORS!)。
跨域资源共享
CORS 位在这样的讨论中出现了很多,但它实际上是一个红鲱鱼。
安全性真的归结为对您的 sesison cookie 使用 HTTP Only cookie 并为带有会话令牌的 cookie 使用相同的域策略?—?所有浏览器从一开始就支持(带有 MSIE 暴露的边缘情况警告) cookie 到其他浏览器没有的子域)。
如果远程站点上的某些 JavaScript 无法读取您的会话令牌?-?如果它位于您域上的 HTTP Only cookie 中,则不能?-?那么它就无法读取您的 CSRF 令牌!
如果仅使用 HTTP cookie 和 CSRF 令牌,我是否可以抵御 CSRF 和 XSS 攻击?
您应该可以免受 CSRF 攻击,并且您对某些类型的 XSS 攻击的保护有限,但 XSS 仍然存在风险。
如果有人找到了一种使用 XSS 在您的网站上执行任意 JavaScript 并创建来自您的域的请求的方法,那么此时 CSRF、仅 HTTP cookie 或会话指纹都不会保护您?—?任何执行的操作都可以看起来就像它是由用户触发的一样。
请求上的 CAPTCHA 将提供一些额外的保护,但对于不可逆转的破坏性或潜在昂贵的操作,操作的外部确认(例如,通过电子邮件、SMS 等)是一个好主意。
但是,安全不是比抱歉更好吗?
如果您仍然担心 CSRF 的 AJAX 端点可能会以某种您不理解的方式成为向量,请考虑能够执行来自您的域的请求并解析响应的远程脚本同样可以触发请求与上一个表单的页面,并从一个令牌的CSRF<input>
上的值<form>
。
同样,如果有人能够在您的站点上执行任意 JavaScript 并以他们所针对的当前用户身份发出和读取请求,那么从您的 DOM 中读取 CSRF 令牌并从已经存在的表单中提取它会容易得多页面比用 AJAX 乱七八糟。
概括
使用仅 HTTP cookie 和 CSRF 令牌来帮助防止 CSRF 和 XSS 攻击。
当使用 HTTP Only cookie 时,提供通过 AJAX 获取 CSRF 令牌的方法是不可利用的。
提供一种通过 AJAX 获取 CSRF 令牌的方法是一件好事,它可以在不影响安全性的情况下带来更好的用户体验。
考虑添加 CAPTCHA 和/或外部验证以确认适当的操作,以防止 XSS。
双重提交 Cookie 方法实际上消除了遇到陈旧的 CSRF 令牌的机会,并避免了通过 Ajax 获取令牌的任何需要,但要注意陷阱(例如,向 cookie 添加签名,检查签名对提交的哈希是否有效,使用 cookie前缀)。
或者,您无法在给定会话中轮换用户 CSRF 令牌(某些中间件实际上这样做是为了避免完全处理问题),但值得注意的是,对于大多数 CSRF 令牌库来说,这不是典型的默认行为。
来自 Open Web Application Security Project的OWASP CSRF Cheat Sheet是一个很好的资源,并且有更详细的介绍。
归档时间: |
|
查看次数: |
1834 次 |
最近记录: |