CSRF原理

第一次获取页面的时候浏览器返回一个随机字符串,之后提交数据的时候需要把到这个字符串去提交,不然会报错
返回的时候还会把这个字符串放到cookie里面,
使用form提交时候:
{% csrf_token %}
b. 无CSRF时存在隐患

用户可以从其他网站提交表单到当前网站

c. Form提交(CSRF)

  1. <form action="/login/" method="POST">
  2. {% csrf_token %}
  3. {{ csrf_token }}
  4. <div><input type="text" name="username" placeholder="用户名"/> </div>
  5. <div><input type="password" name="pwd" placeholder="请输入密码"/> </div>
  6. <div><input type="checkbox" name="check" value=""/> 一周之内免登陆</div>
  7. <div><input type="submit" value="提交"/> </div>
  8. <div><input id="btn1" type="button" value="提交1"/> </div>
  9. </form>

d. Ajax提交(CSRF)

  1. <script src="/static/jquery.js"></script>
  2. <script src="/static/jquery.cookie.js"></script>
  3. <script>
  4. $(function(){
  5. $.ajaxSetup({
  6. beforeSend: function(xhr,settings){
  7. xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
  8. }
  9. });
  10.  
  11. $('#btn1').click(function () {
  12. console.log($.cookie('csrftoken'));
  13. $.ajax({
  14. url: '/login/',
  15. type:"GET",
  16. data: {'user': 'root', 'pwd': '123'},
  17. // headers: {'X-CSRFtoken': $.cookie('csrftoken')},
  18. success:function(arg){
  19.  
  20. }
  21. })
  22. });
  23. })
  24. </script>

CSRF请求头 X-CSRFToken
e.个别页面需要csrf验证的解决方法
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
  中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
ajax在setup里面加
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

完整代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div style="width: 300px; margin: 100px auto;background-color: dodgerblue">
  9. <form action="/login/" method="POST">
  10. {% csrf_token %}
  11. {{ csrf_token }}
  12. <div><input type="text" name="username" placeholder="用户名"/> </div>
  13. <div><input type="password" name="pwd" placeholder="请输入密码"/> </div>
  14. <div><input type="checkbox" name="check" value="1"/> 一周之内免登陆</div>
  15. <div><input type="submit" value="提交"/> </div>
  16. <div><input id="btn1" type="button" value="提交1"/> </div>
  17. </form>
  18. </div>
  19. <script src="/static/jquery.js"></script>
  20. <script src="/static/jquery.cookie.js"></script>
  21. <script>
  22. $(function(){
  23. $.ajaxSetup({
  24. beforeSend: function(xhr,settings){
  25. xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
  26. }
  27. });
  28.  
  29. $('#btn1').click(function () {
  30. console.log($.cookie('csrftoken'));
  31. $.ajax({
  32. url: '/login/',
  33. type:"GET",
  34. data: {'user': 'root', 'pwd': '123'},
  35. // headers: {'X-CSRFtoken': $.cookie('csrftoken')},
  36. success:function(arg){
  37.  
  38. }
  39. })
  40. });
  41. })
  42. </script>
  43. </body>
  44. </html>

  

CSRF相关的更多相关文章

  1. Django --- csrf相关,auth相关

    目录 1.csrf相关 1.跨站请求伪造 2.跨站请求伪造问题解决 3.crsf中间件 4.csrf装饰FBV的装饰器 5.csrf装饰CBV的装饰器 6.django settings源码刨析 2. ...

  2. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  3. Django中的csrf相关装饰器

    切记:  这俩个装饰器不能直接加在类中函数的上方 (CBV方式) csrf_exempt除了,csrf_protect受保护的   from django.views import Viewfrom ...

  4. csrf跨站请求、相关装饰器、auth模块使用

    昨日内容回顾 django操作cookie和session # 作用:就是保存用户信息,保存一系列数据,还可以做缓存 保留一段时间 # session是基于cookie工作的 1. 数据是保存在服务端 ...

  5. 初探CSRF在ASP.NET Core中的处理方式

    前言 前几天,有个朋友问我关于AntiForgeryToken问题,由于对这一块的理解也并不深入,所以就去研究了一番,梳理了一下. 在梳理之前,还需要简单了解一下背景知识. AntiForgeryTo ...

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

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

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

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

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

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  9. CSRF与auth模块

    目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...

随机推荐

  1. maven_上传到私服,以及从私服下载

    公司由于没有maven,自己又想用,于是乎,就自己搭了一个nexus 1.苦逼不多说,将本地jar文件上传到maven 需要在本机(客户端windows)中的maven中的setting.xml添加这 ...

  2. zabbix 4.2 安装教程

    1.我这里使用的是ali的yum源 #wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...

  3. xml转dict

    xml转dict 最开始的时候一直是按格式比较严谨的XML格式进行的转换,所以一般只需要考虑两种情况就可以了,即各个节点或者子节点全相同或者全不同,全相同按list处理,全不同按dict处理,这么一想 ...

  4. wireshare文件格式

    你用Wireshark打开这个pkt试试,如果可以打开,就说明Wireshark支持这种格式.然后你就可以去看Wireshark的源码.*.pkt是omnipeek/etherpeek的默认文件格式, ...

  5. springboot+thymeleaf 访问静态资源解决(static)

    ---------------------------------------2.1.3-------------------------------------------------------- ...

  6. 迁移数据时 timestamp类型字段报错: 1067 - Invalid default value for 'login_time'

    MySQL数据库升级 8.0.13,原版本5.5:执行导出来的SQL文件时报错 1067 - Invalid default value for 'login_time' 原因:MySQL 5.6以后 ...

  7. php中换行怎么写

    PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 unix系列用(推荐学习:PHP编程从入门到精通) 1 windows系列用 1 \r\n mac用 1 如: 1 2 3 4 5 6 ...

  8. select自定义箭头问题 。。。和一行内不同颜色的整体鼠标滑过变色

    1.select自定义箭头问题 用<select><option></option></select>的时候自带的三角箭头与需要的三角不同,这是还要求有 ...

  9. 【HDOJ6625】three arrays(Trie树,贪心)

    题意:给定两个长均为n的序列a和b,要求两两配对,a[i]和b[j]配对的值为a[i]^b[j],求字典序最小的配对后的值序列 n<=1e5,a[i],b[i]<2^30 思路: 做法一: ...

  10. C#:XML操作类

    写的一个XML操作类,包括读取/插入/修改/删除. using System; using System.Data; using System.Configuration; using System. ...