csrf
CSRF跨站请求伪造
如何通过csrf校验
<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>money:<input type="text" name="money"></p>
<p>对方账户:<input type="text" name="others"></p>
<input type="submit">
</form>
<input type="hidden" name="csrfmiddlewaretoken" value="HHxKItr7Z17sZxCAtybnOeV5ne5K3xnvkymENCupB5ylL8h8kWBIiklm9K10paxE">
ajax如何通过csrf校验
# 通过jQuery标签查找获取csrfinput框的键值对,手动加到data参数里面
$('button').click(function () {
$.ajax({
url:'',
type:'post',
data:{'name':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
success:function (data) {
console.log(data)
}
})
})
局部使用与局部禁用csrf
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def home(request):
return HttpResponse('home')
@csrf_protect
def login(request):
return HttpResponse('login')
#csrf是给用户返回的form表单页面,用户需要提交数据的页面,给他偷偷的筛了一个键值对
#给form表单页面,筛了一个input框,input框中name = csrf...等等,value是动态生成值
#也就是说,每次提交的时候,我先获取我给你筛的这个input框里的name和值到底给我的相不相等
#如果不相等,就把你forbidden掉,意味着你不是我网站出来的页面,相当于你这个页面是你自己写的页面
#写好视图函数之后,还要再起一个django,两个服务器,别人的页面跟你写的页面肯定是两个不同的服务器
#要写把scrf注掉
#将新起的django的端口号该一下,然后将我这个diango的路径复制过去
# 'django.middleware.csrf.CsrfViewMiddleware',
# {% scrf_token %} form表单加上这个就算在settings里面加上
# 'django.middleware.csrf.CsrfViewMiddleware',就不会报错了
1 #scrif
2 def index(request):
3 print(123)
4 username = request.POST.get('username')
5 money = request.POST.get('money')
6 others = request.POST.get('others')
7 print(request.POST.get('name'))
8 print('%s 给 %s 转了%s 钱' %(username,money,others))
9 return render(request, 'index.html',locals())
10
11
12 #这个网站,并不是整体都是要校验csrf的,有几个视图函数也能接受这个post请求,但是不需要
13 #接受这个csrf_token,就有一个装饰器就不需要校验到csrf_token了
14
15 from django.views.decorators.csrf import csrf_exempt,csrf_protect
16 @csrf_exempt
17 def home(request):
18 return HttpResponse('home') #一定要return一个HttpResponse对象
19
20
21 #需要csrf校验的函数
22 @csrf_protect
23 def login(request):
24 return HttpResponse('login')
25
26
27 #CBV
28 from django.utils.decorators import method_decorator
29
30 #装饰csrf装饰器的时候,只有这两种写法
31 @method_decorator(csrf_exempt,name='dispatch') #第一种
32 class Reg(View):
33 @method_decorator(csrf_exempt) #第二种
34 def dispatch(self, request, *args, **kwargs):
35 res = super().dispatch(request,*args,**kwargs)
36 return res
37 def get(self,request):
38 return HttpResponse('get')
39
40 def post(self,request):
41 return HttpResponse('post')
views.py
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Title</title>
6 <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
7
8 <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
9 <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
10
11 <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
12 <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>
13
14 <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
15 <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
16 </head>
17 <body>
18 {
#<h1>hello</h1>#}
19 <h1>正经网站</h1>
20 <!--csrif-->
21 {
#<form action="" method="post">#}
22 {
# {% csrf_token %}#}
23 {
# <!--hidden隐藏 name取的名字csrf.. value是随机字符串,#}
24 {
# 这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,#}
25 {
# input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,#}
26 {
# 然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->#}
27 {
# <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">#}
28 {
# <p>username:<input type="text" name="username"></p>#}
29 {
# <p>password:<input type="text" name="money"></p>#}
30 {
# <p>对方账号:<input type="text" name="others"></p>#}
31 {
# <input type="submit">#}
32 {
#</form>#}
33 {
#<button id="1">ajaz请求</button>#}
34 {
#<script>#}
35 {
# $('#1').click(function(){#}
36 {
# $.ajax({#}
37 {
# url:'',#}
38 {
# type:'post',#}
39 {
# data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},#}
40 {
# success:function(data){#}
41 {
# console.log(data) }#}
42 {
# })#}
43 {
# })#}
44 {
#</script>#}
45
46
47
48 {
#<!--没写 {% csrf_token %} 加装饰器的视图函数前端页面-->#}
49 {
#<form action="/home/" method="post">#}
50 {
# <!--hidden隐藏 name取的名字csrf.. value是随机字符串,#}
51 {
# 这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,#}
52 {
# input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,#}
53 {
# 然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->#}
54 {
# <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">#}
55 {
# <p>username:<input type="text" name="username"></p>#}
56 {
# <p>password:<input type="text" name="money"></p>#}
57 {
# <p>对方账号:<input type="text" name="others"></p>#}
58 {
# <input type="submit">#}
59 {
#</form>#}
60 {
#<button id="1">ajaz请求</button>#}
61 {
#<script>#}
62 {
# $('#1').click(function(){#}
63 {
# $.ajax({#}
64 {
# url:'',#}
65 {
# type:'post',#}
66 {
# data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},#}
67 {
# success:function(data){#}
68 {
# console.log(data) }#}
69 {
# })#}
70 {
# })#}
71 {
#</script>#}
72
73
74 {
#<!--没写 {% csrf_token %} 加装饰器的视图函数前端页面(scrf_protect)-->#}
75 <form action="/login/" method="post">
76 <!--hidden隐藏 name取的名字csrf.. value是随机字符串,
77 这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,
78 input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,
79 然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->
80 <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">
81 <p>username:<input type="text" name="username"></p>
82 <p>password:<input type="text" name="money"></p>
83 <p>对方账号:<input type="text" name="others"></p>
84 <input type="submit">
85 </form>
86 <button id="1">ajaz请求</button>
87 <script>
88 $('#1').click(function(){
89 $.ajax({
90 url:'',
91 type:'post',
92 data:{
'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},
93 success:function(data){
94 console.log(data) }
95 })
96 })
97 </script>
98
99
100 </body>
101 </html>
html
打开第二个服务器,将端口号进行修改
1 from django.shortcuts import render
2
3 # Create your views here.
4
5 def index(request):
6 return render(request ,'index.html')
Views.py
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Title</title>
6 <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
7
8 <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
9 <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
10
11 <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
12 <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>
13
14 <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
15 <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
16 </head>
17 <body>
18 <h1>钓鱼网站</h1>
19 <form action="http://127.0.0.1:8000/index" method="post">
20 <p>username:<input type="text" name="username"></p>
21
22 <p>money:<input type="text" name="money"></p>
23 <p>对方账号:<input type="text"></p>
24 <input type="text" name="others" value="jason" style="display: none">
25 <input type="submit">
26 </form>
27
28 </body>
29 </html>
index.html
转载于//www.cnblogs.com/huangxuanya/p/11074854.html
还没有评论,来说两句吧...