csrf

古城微笑少年丶 2021-11-09 18:42 484阅读 0赞
  1. CSRF跨站请求伪造
  2. 如何通过csrf校验
  3. <form action="" method="post">
  4. {% csrf_token %}
  5. <p>username:<input type="text" name="username"></p>
  6. <p>money:<input type="text" name="money"></p>
  7. <p>对方账户:<input type="text" name="others"></p>
  8. <input type="submit">
  9. </form>
  10. <input type="hidden" name="csrfmiddlewaretoken" value="HHxKItr7Z17sZxCAtybnOeV5ne5K3xnvkymENCupB5ylL8h8kWBIiklm9K10paxE">
  11. ajax如何通过csrf校验
  12. # 通过jQuery标签查找获取csrfinput框的键值对,手动加到data参数里面
  13. $('button').click(function () {
  14. $.ajax({
  15. url:'',
  16. type:'post',
  17. data:{'name':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
  18. success:function (data) {
  19. console.log(data)
  20. }
  21. })
  22. })
  23. 局部使用与局部禁用csrf
  24. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  25. @csrf_exempt
  26. def home(request):
  27. return HttpResponse('home')
  28. @csrf_protect
  29. def login(request):
  30. return HttpResponse('login')
  31. #csrf是给用户返回的form表单页面,用户需要提交数据的页面,给他偷偷的筛了一个键值对
  32. #给form表单页面,筛了一个input框,input框中name = csrf...等等,value是动态生成值
  33. #也就是说,每次提交的时候,我先获取我给你筛的这个input框里的name和值到底给我的相不相等
  34. #如果不相等,就把你forbidden掉,意味着你不是我网站出来的页面,相当于你这个页面是你自己写的页面
  35. #写好视图函数之后,还要再起一个django,两个服务器,别人的页面跟你写的页面肯定是两个不同的服务器
  36. #要写把scrf注掉
  37. #将新起的django的端口号该一下,然后将我这个diango的路径复制过去
  38. # 'django.middleware.csrf.CsrfViewMiddleware',
  39. # {% scrf_token %} form表单加上这个就算在settings里面加上
  40. # 'django.middleware.csrf.CsrfViewMiddleware',就不会报错了

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 #scrif
  2. 2 def index(request):
  3. 3 print(123)
  4. 4 username = request.POST.get('username')
  5. 5 money = request.POST.get('money')
  6. 6 others = request.POST.get('others')
  7. 7 print(request.POST.get('name'))
  8. 8 print('%s 给 %s 转了%s 钱' %(username,money,others))
  9. 9 return render(request, 'index.html',locals())
  10. 10
  11. 11
  12. 12 #这个网站,并不是整体都是要校验csrf的,有几个视图函数也能接受这个post请求,但是不需要
  13. 13 #接受这个csrf_token,就有一个装饰器就不需要校验到csrf_token了
  14. 14
  15. 15 from django.views.decorators.csrf import csrf_exempt,csrf_protect
  16. 16 @csrf_exempt
  17. 17 def home(request):
  18. 18 return HttpResponse('home') #一定要return一个HttpResponse对象
  19. 19
  20. 20
  21. 21 #需要csrf校验的函数
  22. 22 @csrf_protect
  23. 23 def login(request):
  24. 24 return HttpResponse('login')
  25. 25
  26. 26
  27. 27 #CBV
  28. 28 from django.utils.decorators import method_decorator
  29. 29
  30. 30 #装饰csrf装饰器的时候,只有这两种写法
  31. 31 @method_decorator(csrf_exempt,name='dispatch') #第一种
  32. 32 class Reg(View):
  33. 33 @method_decorator(csrf_exempt) #第二种
  34. 34 def dispatch(self, request, *args, **kwargs):
  35. 35 res = super().dispatch(request,*args,**kwargs)
  36. 36 return res
  37. 37 def get(self,request):
  38. 38 return HttpResponse('get')
  39. 39
  40. 40 def post(self,request):
  41. 41 return HttpResponse('post')

views.py

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 <!DOCTYPE html>
  2. 2 <html lang="en">
  3. 3 <head>
  4. 4 <meta charset="UTF-8">
  5. 5 <title>Title</title>
  6. 6 <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
  7. 7
  8. 8 <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  9. 9 <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  10. 10
  11. 11 <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
  12. 12 <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>
  13. 13
  14. 14 <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
  15. 15 <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
  16. 16 </head>
  17. 17 <body>
  18. 18 {
  19. #<h1>hello</h1>#}
  20. 19 <h1>正经网站</h1>
  21. 20 <!--csrif-->
  22. 21 {
  23. #<form action="" method="post">#}
  24. 22 {
  25. # {% csrf_token %}#}
  26. 23 {
  27. # <!--hidden隐藏 name取的名字csrf.. value是随机字符串,#}
  28. 24 {
  29. # 这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,#}
  30. 25 {
  31. # input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,#}
  32. 26 {
  33. # 然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->#}
  34. 27 {
  35. # <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">#}
  36. 28 {
  37. # <p>username:<input type="text" name="username"></p>#}
  38. 29 {
  39. # <p>password:<input type="text" name="money"></p>#}
  40. 30 {
  41. # <p>对方账号:<input type="text" name="others"></p>#}
  42. 31 {
  43. # <input type="submit">#}
  44. 32 {
  45. #</form>#}
  46. 33 {
  47. #<button id="1">ajaz请求</button>#}
  48. 34 {
  49. #<script>#}
  50. 35 {
  51. # $('#1').click(function(){#}
  52. 36 {
  53. # $.ajax({#}
  54. 37 {
  55. # url:'',#}
  56. 38 {
  57. # type:'post',#}
  58. 39 {
  59. # data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},#}
  60. 40 {
  61. # success:function(data){#}
  62. 41 {
  63. # console.log(data) }#}
  64. 42 {
  65. # })#}
  66. 43 {
  67. # })#}
  68. 44 {
  69. #</script>#}
  70. 45
  71. 46
  72. 47
  73. 48 {
  74. #<!--没写 {% csrf_token %} 加装饰器的视图函数前端页面-->#}
  75. 49 {
  76. #<form action="/home/" method="post">#}
  77. 50 {
  78. # <!--hidden隐藏 name取的名字csrf.. value是随机字符串,#}
  79. 51 {
  80. # 这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,#}
  81. 52 {
  82. # input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,#}
  83. 53 {
  84. # 然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->#}
  85. 54 {
  86. # <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">#}
  87. 55 {
  88. # <p>username:<input type="text" name="username"></p>#}
  89. 56 {
  90. # <p>password:<input type="text" name="money"></p>#}
  91. 57 {
  92. # <p>对方账号:<input type="text" name="others"></p>#}
  93. 58 {
  94. # <input type="submit">#}
  95. 59 {
  96. #</form>#}
  97. 60 {
  98. #<button id="1">ajaz请求</button>#}
  99. 61 {
  100. #<script>#}
  101. 62 {
  102. # $('#1').click(function(){#}
  103. 63 {
  104. # $.ajax({#}
  105. 64 {
  106. # url:'',#}
  107. 65 {
  108. # type:'post',#}
  109. 66 {
  110. # data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},#}
  111. 67 {
  112. # success:function(data){#}
  113. 68 {
  114. # console.log(data) }#}
  115. 69 {
  116. # })#}
  117. 70 {
  118. # })#}
  119. 71 {
  120. #</script>#}
  121. 72
  122. 73
  123. 74 {
  124. #<!--没写 {% csrf_token %} 加装饰器的视图函数前端页面(scrf_protect)-->#}
  125. 75 <form action="/login/" method="post">
  126. 76 <!--hidden隐藏 name取的名字csrf.. value是随机字符串,
  127. 77 这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,
  128. 78 input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,
  129. 79 然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->
  130. 80 <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">
  131. 81 <p>username:<input type="text" name="username"></p>
  132. 82 <p>password:<input type="text" name="money"></p>
  133. 83 <p>对方账号:<input type="text" name="others"></p>
  134. 84 <input type="submit">
  135. 85 </form>
  136. 86 <button id="1">ajaz请求</button>
  137. 87 <script>
  138. 88 $('#1').click(function(){
  139. 89 $.ajax({
  140. 90 url:'',
  141. 91 type:'post',
  142. 92 data:{
  143. 'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},
  144. 93 success:function(data){
  145. 94 console.log(data) }
  146. 95 })
  147. 96 })
  148. 97 </script>
  149. 98
  150. 99
  151. 100 </body>
  152. 101 </html>

html

打开第二个服务器,将端口号进行修改

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 from django.shortcuts import render
  2. 2
  3. 3 # Create your views here.
  4. 4
  5. 5 def index(request):
  6. 6 return render(request ,'index.html')

Views.py

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 <!DOCTYPE html>
  2. 2 <html lang="en">
  3. 3 <head>
  4. 4 <meta charset="UTF-8">
  5. 5 <title>Title</title>
  6. 6 <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
  7. 7
  8. 8 <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  9. 9 <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  10. 10
  11. 11 <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
  12. 12 <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>
  13. 13
  14. 14 <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
  15. 15 <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
  16. 16 </head>
  17. 17 <body>
  18. 18 <h1>钓鱼网站</h1>
  19. 19 <form action="http://127.0.0.1:8000/index" method="post">
  20. 20 <p>username:<input type="text" name="username"></p>
  21. 21
  22. 22 <p>money:<input type="text" name="money"></p>
  23. 23 <p>对方账号:<input type="text"></p>
  24. 24 <input type="text" name="others" value="jason" style="display: none">
  25. 25 <input type="submit">
  26. 26 </form>
  27. 27
  28. 28 </body>
  29. 29 </html>

index.html

转载于:https://www.cnblogs.com/huangxuanya/p/11074854.html

发表评论

表情:
评论列表 (有 0 条评论,484人围观)

还没有评论,来说两句吧...

相关阅读

    相关 csrf

    CSRF:(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF

    相关 csrf

    CSRF全程 Cross Site Request Forgery, 跨站域请求伪造.这种攻击方式相对于XSS,SQL注入等攻击方式比较晚被发现,今天就来讲解下这种攻击方式以及

    相关 CSRF

    3、CSRF攻击原理          那么,上面那段话到底是什么意思呢?我们先来看session的工作机制。         session我想大家都不陌生,

    相关 CSRF攻击

    CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安