前言

  CSRF,Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。他的产生由来是因为浏览器引起的。 比如用户访问A网站,A网站的html代码中有个提交数据,是发往B网站的,B网站受到浏览器发来的请求,实际上已经处理完毕,并且将返回数据发回了。但是这段数据在到达用户浏览器的时候,被浏览器拦截抛弃,这种现象是CSRF的由来。

  也有部分人利用CSRF进行相关攻击,攻击原理如下:

   

Django中的CSRF

  在Django中,有个中间件叫做django.middleware.csrf.CsrfViewMiddleware,如果加载后,在什么都不配置的情况下,跨站请求就会被阻挡,报错CSRF的错误。

  解决上述问题,有两种方法,一种是在html中书写: {% csrf_token %}。另外一种是为每次ajax请求设置cookie

方法一:HTML中书写

<form action="/csrf/" method="post">
{% csrf_token %}
<input type="text" name="v">
<input type="submit" value="提交">
</form>

  上述的{% csrf_token %}在页面中,会转换成input标签,标签中的内容类似如下:

<input type="hidden" name="csrfmiddlewaretoken" value="FS187YU8N8ixAOskUHTAEtkq0xJ3dirS2yJrCnN5IpAY9B9qpVHAQOhxoC4iV614">

  这样的话,这次访问过去的请求的header中,就会带有csrftoken=QRzJCWrjRzJxHnG3phk1Nx60f96jfie7bILMEOi9gNEXTs6Mf9N6JyWzqJUMRogn的cookie,这样就不会受到浏览器的阻碍。

  

  但是这么做是有弊端的。因为这段value字符串,在机器A可以用,如果在机器B上用,Django也会认为是合法的。

  在书写的时候,路由函数也要注意使用render!!!

def csrf(request):

    return render(request,'csrf.html')

方法二:为每次ajax请求设置cookie

  通常我们的请求都是以ajax方式来提交的。因此这种方法更加需要明白。不多废话,直接贴代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/csrf/" method="post">
{% csrf_token %}
<input type="text" name="v" />
<input type="submit" value="提交" />
</form> <input type="button" value="Ajax提交" onclick="DoAjax();" />
<script src="/static/jquery-2.1.4.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
// 去cookie中获取值
var csrftoken = $.cookie('csrftoken'); function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({ //当所有的ajax请求发送之前,进行这样的配置
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function DoAjax(){
$.ajax({
url: '/csrf/',
type: 'POST',
data: {'k1': 'v1'},
success: function (data) {
console.log(data);
}
})
}
</script> </body>
</html>

  上述的本质,就是去浏览器的cookie中获取csrftoken,在发送ajax请求的header的cookie中,加入csrftoken。

CSRF的单独使用

  通常情况下,在settings的文件中,载入csrf的配置后,CSRF会对全局的url产生效果。那么,如果在settings中没有加载CSRF,CSRF还能使用么?答案是肯定的。

  from django.views.decorators.csrf import csrf_exempt,csrf_protect

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

Python菜鸟之路:Django CSRF跨站请求伪造的更多相关文章

  1. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  2. python CSRF跨站请求伪造

    python CSRF跨站请求伪造 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  3. [Django高级之中间件、csrf跨站请求伪造]

    [Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...

  4. ajax向Django前后端提交请求和CSRF跨站请求伪造

    1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...

  5. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  6. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  7. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  8. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  9. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

随机推荐

  1. mysql的innodb数据库引擎详解

    http://www.jb51.net/softjc/158474.html   这篇文章主要介绍了mysql的innodb数据库引擎,需要的朋友可以参考下   一.mysql体系结构和存储引擎 1. ...

  2. lucene 搜索优化,个人实战经验总结

    1.IndexSearch.IndexReader等都是线程安全的类,多线程并发使用是没有问题的.不到忘不得以,尽量避免重新实例化,他们实例化是很花费时间的,看一下他们的构造原理你就知道了.   2. ...

  3. spring boot和thrift、zookeeper建立微服务

    原文地址:http://www.cnblogs.com/skyblog/p/5535418.html Spring cloud适应于云端服务,也适用于企业信息化SOA建设.spring boot也是r ...

  4. 基于Linux的智能家居的设计(5)

    4  软件设计 软件设计部分主要包含uboot移植.内核编译.系统移植.设备驱动编程.应用程序编程(QT编程.mysql数据库编程.控制系统编程).各个模块的功能函数(部分是在windows以下的IA ...

  5. vue 过滤与全文索引

    过滤 与 全文索引 <template> <div> <input type="text" v-model="query"> ...

  6. 一些移动端的ui框架

    一些移动端的ui框架 https://jqweui.cn/resource

  7. 142. Linked List Cycle II【easy】

    142. Linked List Cycle II[easy] Given a linked list, return the node where the cycle begins. If ther ...

  8. 2017-5-14 湘潭市赛 Longest Common Subsequence 想法题

    Longest Common Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Longest Common Subs ...

  9. HTML— 弹出遮盖层

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. ThinkPHP自动填充实现无限级分类的方法

    这篇文章主要介绍了ThinkPHP自动填充实现无限级分类的方法,是ThinkPHP项目开发中非常实用的一个技巧,需要的朋友可以参考下   本文实例展示了ThinkPHP自动填充实现无限级分类的方法,是 ...