简记跨站请求伪造攻击防范

1 CSRF简单描述

用户在已经登录了我们自己的网站后,又被钓鱼点击了包含对本站有跨站请求伪造意图的网站,该网站返回的页面中包含对我们网站的恶意表单提交请求,由于用户在我们网站已经是登录状态,恶意表单提交的时候会带上我们的cookie,如果我们的后端不做防范的话,该恶意表达提交会被我们的服务误认为是正常的表单提交,进而导致危险的后果。

2 CSRF能成功的本质原因

本质原因是

# 对任何指定域的请求,浏览器不区分请求的来源域,浏览器都会把该域的cookie带给目标域的服务器。

# 我们的服务器只对表单请求的cookie做身份校验,不对表单本身的内容和表单的来源做身份校验,导致了该攻击的可行性。

3 如何从原理上攻克CSRF

根据上面的描述,要禁止CSRF,只需要让服务不仅仅根据cookie识别用户身份,而且还要识别表单发出者是否合法就可以了。

即:只要保证cookie和表单双令牌验证就可以防止csrf攻击

4 具体方案 两种

# 对于jsp等动态页面的情况,由后台生成随机令牌存放在session中,然后把令牌输出到前端表单的隐藏域中,表单提交的时候把隐藏表单域中的令牌带到后端,后端拿到隐藏表单域中的令牌和session中的令牌比对来识别表单来源。这种方式可行的原因是:伪造表单的第三方攻击站获取不了我们表单隐藏域中的令牌,这样恶意表单提交到我们后台也不会被我们服务端认可。

# 对于非jsp的场景,和上面的方案大体一致,只是后端生成的随机令牌存放到客户端cookie中,然后客户端提交表单的时候需要由js把本域cookie中的令牌组装到表单中提交到后台,后台服务获取表单中的令牌和cookie中的令牌进比对来识别表单提交者身份。这种方式可行的原因是:我们域下的cookie只能由我们域下的js脚本访问,第三方攻击站不能读取和修改我们域中的cookie。

5 cookie令牌方案的注意点:服务端分配令牌并写入到cookie的时候必须指定cookie的路径,即cookie.setPath("/'),防止客户端js不能正确的读取指定域下的令牌导致后端令牌比对不通过。

发布了63 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/103720047