新澳门萄京娱乐场官网

当前位置:新萄京娱乐场手机版 > 新澳门萄京娱乐场官网 > 如果想要关闭默认打开的crsf protection,即便sett

如果想要关闭默认打开的crsf protection,即便sett

来源:http://www.chrisproduction.com 作者:新萄京娱乐场手机版 时间:2019-10-05 16:46
  • 大部分翻译自spring security文档。
  • 涉及到spring security的配置,只讲代码的配置方式,忽略xml配置方式。

Django中CSRF防护原理及使用

要使用spring security的csrf protection,必须要以下三个步骤:

分类:

  1. 使用合适的http方法
  2. 配置csrf protection
  3. 携带csrf token

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

需要确保使用的是PATCH, POST, PUT, 或者DELETE方法。使用POST替代GET传递敏感信息,防止隐私信息泄漏。

全局:

一些框架通过验证用户的session处理无效的csrf token,这回导致一些问题。通过配置AccessDeniedHandler使用不同方式处理不合法的CsrfTokenException,我们可以替换spring security crsf protection默认的http 403 access denied处理方式。

中间件 django.middleware.csrf.CsrfViewMiddleware

如果想要关闭默认打开的crsf protection,可以使用如下的java代码关闭:

局部:

@EnableWebSecuritypublic class WebSecurityConfig extendsWebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception { http//关闭打开的csrf保护 .csrf().disable();}}

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

spring security官方文档中介绍了三种方式:

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

  1. 表单提交中,使用jsp的标签可以访问后端服务器参数的方式,在表单提交中,可以轻易地将后端的csrf token,以参数名"_csrf"添加到表单参数中
  2. 对于Ajax提交的JSON请求,是无法在请求参数中添加crsf token。面对这种情况,可以将crsf token添加到请求头之中 ,当然这还是需要jsp标签访问后端服务器参数
  3. 而对于使用html+AngularJS 的同学,angularJs提供了一种机制处理XSRF。当提交XHR requests时,$http 从cookie中读取参数名为XSRF-TOKEN的token,然后将它以X-XSRF-TOKEN为参数名设置到HTTP header。 由于只有域名内的js能够读取相应网站的cookie,服务器可以来自js的请求是在域名内的。而对于服务器端的spring security来说,CookieCsrfTokenRepository默认会将csrf token以名XSRF-TOKEN写入cookie,然后接收请求时从名为X-XSRF-TOKEN的header或者名为_csrf的http请求参数读取csrf token。但是CookieCsrfTokenRepository写如的cookie默认具有cookieHttpOnly属性,前端js是不能操作它的,这就需要在spring security的配置中将 cookieHttpOnly属性设为false:

Django中CSRF防护原理:

在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值。当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性。当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御,这样就能避免被 CSRF 攻击。

.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse

在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token

除此之外,使用angularJs的同学就不用添加任何代码到前端或者后端了。可以参考笔者写的代码。

在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)

在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

Django中使用 CSRF 防护

GET 请求不要用有副作用。任何处理 GET 请求的代码对资源的访问都一定要是“只读“的。

启用 django.middleware.csrf.CsrfViewMiddleware 中间件

使用POST 表单元素时,加上{% csrf_token %}

渲染模块使用 RequestContext。RequestContext 会处理 csrf_token , 从而自动为表单添加一个名为 csrfmiddlewaretoken 的 input

Django中CSRF防护解析:

csrftoken的生成方式如下:

md5_constructor("%s%s"% (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest()

1

设置csrftoken:

response.set_cookie(settings.CSRF_COOKIE_NAME,request.META["CSRF_COOKIE"], max_age =60*60*24*7*52, domain=settings.CSRF_COOKIE_DOMAIN)

1

csrftoken与cookie中的token比较:

ifnotconstant_time_compare(request_csrf_token, csrf_token):对于前后端分离的 ajax 去调用的话  需要在传递的参数里带上    csrfmiddlewaretoken: "{{ csrf_token }}"

本文由新萄京娱乐场手机版发布于新澳门萄京娱乐场官网,转载请注明出处:如果想要关闭默认打开的crsf protection,即便sett

关键词:

上一篇:没有了

下一篇:没有了