1、CSRF攻击
CSRF 又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点。
举个例子
用户通过表单发送请求到银行网站,银行网站获取请求参 数后对用户账户做出更改。在用户没有退出银行网站情况 下,访问了攻击网站,攻击网站中有一段跨域访问的代码, 可能自动触发也可能点击提交按钮,访问的url正是银行网 站接受表单的url。因为都来自于用户的浏览器端,银行将 请求看作是用户发起的,所以对请求进行了处理,造成的 结果就是用户的银行账户被攻击网站修改。
常见解决方法
基本上都是增加攻击网站无法获取到的一些表单信息,比如 增加图片验证码,可以杜绝csrf攻击,但是除了登陆注册之外, 其他的地方都不适合放验证码,因为降低了网站易用性.。
spring security 的应对之策
a、在web应用中增加前置过滤器【CsrfFilter】对需要验证请求验证是否包含csrf的token信息,如果不包含,则包相应的错误。这样攻击网站无法获取到token信息,则跨域提交的信息都无法通过过滤器的校验。
b、CsrfFilter 默认只校验POST 请求,其它类型放过如果想要在表单中有csrf必须经过一次过滤器(非post)
c、request中设置csrf相关属性,如果没有,就生成一个
d、获取csrftoken两种方式
HttpSessionCsrfTokenRepository 将token信息保存的session中,通过模版或者表达式获取,默认采用这种方式
CookieCsrfTokenRepository.withHttpOnlyFalse() 采用cooke方式存储,设置httponly 为false 这样可以通过jquery获取设置参数。
2、X-Content-Type-Options:nosniff 未指定文件类型,禁止浏览器猜测文件类型
spring security 应对之策
http.headers().addHeaderWriter(new XContentTypeOptionsHeaderWriter())
3、X-Frame-Options 是否允许网页被iFrame
public XFrameOptionsHeaderWriter(XFrameOptionsMode frameOptionsMode) {
Assert.notNull(frameOptionsMode, "frameOptionsMode cannot be null");
/*如果设置为允许,spring抛出异常,要使用FrameOptionsHeaderWriter*/
if (XFrameOptionsMode.ALLOW_FROM.equals(frameOptionsMode)) {
throw new IllegalArgumentException(
"ALLOW_FROM requires an AllowFromStrategy. Please use FrameOptionsHeaderWriter(AllowFromStrategy allowFromStrategy) instead");
}
this.frameOptionsMode = frameOptionsMode;
this.allowFromStrategy = null;
}
DENY 不允许网页被iframe
http.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN));
http.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsMode.DENY));