Obwohl ich mich schon seit einiger Zeit mit der Webentwicklung beschäftige, hatte ich noch nie ein tiefes Verständnis für die Same-Origin-Richtlinie und die CSRF-Sicherheitsrichtlinie, daher habe ich mir die Zeit genommen, ein einfaches Experiment durchzuführen, um sie zu verstehen. Der experimentelle Prozess ist wie folgt. Teilen Sie ihn mit allen.
Experimenteller Zweck: Überprüfung der Beziehung und des Unterschieds zwischen der Same-Origin-Richtlinie und der CSRF-Sicherheitsrichtlinie
Experimenteller Plan: 1. Linux erstellt einen Python-Server des Django-Frameworks (a); Windows erstellt einen einfachen JS-Server (b)
2. Die Homepage von b hat Folgendes Inhalt: (1) Bestandene Postget-Methode sendet ein Formular
(2) Siehe Daten
Experimentelle Ergebnisse durch die AJAX-Modus-Methode (Postget). : 1.a öffnet die CSRF-Sicherheit nicht. Öffnen Sie im Fall der Richtlinie die Homepage von b, und die Seite von b kann das Formular normalerweise über die Postget-Methode an a senden und die Antwortseite abrufen, die Daten von a jedoch nicht über die getpost-Methode von Ajax angefordert werden. Beim Betrachten des Protokolls von a wird festgestellt, dass die Anfrage von b auf a empfangen werden kann, die an die Anfrage von b angehängten Daten jedoch nicht erfolgreich geladen werden können. Die Ajax-Anfrage (getpost) von b kann die Antwort von a erhalten dann wird es an open gesendet. b Der Browser zeigt eine Warnung zur Same-Origin-Richtlinie an.
2. Wenn a die CSRF-Sicherheitsrichtlinie öffnet, öffnen Sie die Homepage von b. Die Seite von b kann das Formular normalerweise über die Get-Methode an a senden und die Antwortseite abrufen, aber nicht senden Über die Post-Methode kann die Seite B die Daten von a nicht über die Getpost-Methode von Ajax anfordern.
Fazit: 1. Same-Origin-Richtlinie: Die js-Sprache wurde aus Sicherheitsgründen entwickelt und erlaubt nur den Zugriff auf Same-Origin. Nicht-originaler Zugriff kann auch Anfragen an den entsprechenden Server senden, aber alle an die Browser-Anfrage angehängten Daten gehen verloren und der Server kann die Antwort auf die Anfrage zurückgeben. Während der Antwortphase des Browsers, der die vom Server ausgegebene Antwort analysiert, wird jedoch eine Warnung zur Same-Origin-Richtlinie angezeigt. (Erklärung der auf js basierenden Ajax-Technologie)
2. CSRF-Sicherheitsrichtlinie: Sicherheitsüberlegungen beim Aufbau eines Servers erfordern, dass normale Entwickler relevante Designs erstellen (das Framework wird im Allgemeinen mit dem Design einer CSRF-Sicherheitsrichtlinie geliefert). ). Der CSRF-Richtlinienprozess ist: Beim Anfordern einer Serverseite setzt die Antwort des Servers ein Cookie an den Browser. Wenn ein Postformular an den Server gesendet wird, wird das vom Server gesetzte Cookie an die Anfrage des Browsers angehängt und zusammen gesendet. Beim Empfang der Anfrage wird überprüft, ob das angehängte Cookie korrekt ist (die Kommunikationsverbindung jedes Benutzers mit dem Server verfügt nur über ein eindeutiges Cookie. Nachdem die Verbindung unterbrochen wurde, setzt der Server beim nächsten Verbindungsaufbau ein neues Cookie im Browser Nur dann kann die korrekte Antwort ausgegeben werden. Wenn die Überprüfung fehlschlägt, wird ein Fehlercode „403“ ausgegeben.
1 # --------------Django服务器部分代码-------------- 2 # -*- coding:utf-8 -*- 3 from django.shortcuts import render 4 from django.http import HttpResponse, HttpResponseRedirect, JsonResponse 5 6 # Create your views here. 7 8 9 def index(request): 10 11 context = {'contents': 'hello world'} 12 # return HttpResponse("ok") 13 response= render(request, 'booktest/index.html', context) 14 return response 15 16 17 def args(request, id1, id2): 18 19 string = '%s--%s' % (id1, id2) 20 return HttpResponse(string) 21 22 23 def get1(request): 24 25 mode = request.encoding 26 dict = request.GET 27 a = dict.get('a') 28 b = dict.get('b') 29 c = dict.get('c') 30 string = 'method:%s--%s--%s--%s' % (mode, a, b, c) 31 return HttpResponse(string) 32 33 34 def get2(request): 35 36 dict = request.GET 37 a = dict.getlist('a') 38 b = dict.get('b') 39 c = dict.get('c') 40 d = dict.get('d', 'have no') 41 string = '%s--%s--%s--%s' % (a, b, c, d) 42 return HttpResponse(string) 43 44 45 def post(requst): 46 47 str_data = '---%s---%s' % (requst.method, requst.POST.get('uname')) 48 49 return HttpResponse(str_data) 50 51 52 def get3(request): 53 54 dict = request.GET 55 a = dict.get('a') 56 b = dict.get('b') 57 c = dict.get('c') 58 context = {'1': a, '2': b, '3': c} 59 # return HttpResponse("ok") 60 return HttpResponse(context) 61 # return render(request, 'booktest/get1.html', context) 62 63 64 def get4(request): 65 66 return HttpResponseRedirect('/admin/') 67 68 69 def ajax(request): 70 71 # return HttpResponse('ok') 72 return render(request, 'booktest/ajax.html/') 73 74 75 def json(request): 76 77 data1 = request.POST.get('csrfmiddlewaretoken') 78 data2 = request.POST.get('data') 79 print('------------%s------------%s---' % (data1, data2)) 80 a = {'h1': 'hello', 'h2': 'world', 'method': request.method, 'csrf': data1, 'data': data2} 81 82 return JsonResponse(a) 83 84 85 def cookie_set(request): 86 print('123') 87 cookie_value = 'hello' 88 89 response = HttpResponse("<h1>设置Cookie,请查看响应报文头</h1>") 90 # response = HttpResponse("hello") 91 # Cookie中设置汉字键值对失败 92 response.set_cookie('h1', cookie_value) 93 # return HttpResponse('ok') 94 return response 95 96 97 def cookie_get(request): 98 99 response = HttpResponse('<h1>读取Cookie,数据如下:<br>')100 cookies = request.COOKIES101 if cookies.get('h1'):102 response.write('<h1>'+cookies['h1']+'</h1>')103 104 return response
1 <--Django服务器template部分的index.html代码--> 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="utf-8"> 7 <title>index</title> 8 </head> 9 <body>10 {# <input type="button" value="返回">#}11 <a href="/">返回主页</a>12 13 <hr>14 <h1>参数</h1>15 <a href="/get1/?a=1&b=2&c=3">get一键传一值</a>16 <br>17 <a href="/get2/?a=1&b=2&c=3&a=5">get一键传多值</a>18 <br><br>19 <form method="post" action="/post/">20 21 {% csrf_token %}22 23 姓名:<input type="text" name="uname"/><br>24 密码:<input type="password" name="upwd"/><br>25 性别:<input type="radio" name="ugender" value="1"/>男26 <input type="radio" name="ugender" value="0"/>女<br>27 爱好:<input type="checkbox" name="uhobby" value="胸口碎大石"/>胸口碎大石28 <input type="checkbox" name="uhobby" value="脚踩电灯炮"/>脚踩电灯炮29 <input type="checkbox" name="uhobby" value="口吐火"/>口吐火<br>30 <input type="submit" value="提交"/>31 </form>32 33 <hr>34 <h1>GET属性</h1>35 <a href="/get3/?a=1&b=2&c=3">一键传一值</a>36 <br>37 <a href="/get4/?a=1&b=2&c=3&a=5">一键传多值</a>38 39 <hr>40 <h1>JsonResponse</h1>41 <a href="/ajax/">ajax</a>42 43 <hr>44 <h1>Cookie</h1>45 <a href="/cookie_set/">设置Cookie</a>46 <br>47 <a href="/get_Cookie/">获取Cookie</a>48 </body>49 </html>
1 <--Django服务器ajax.html代码--> 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="UTF-8"> 7 <title>ajax</title> 8 9 <script src="/static/js/jquery-1.12.4.min.js?1.1.11"></script>10 <script>11 $(function () {12 data1 = $('input[name="csrfmiddlewaretoken"]').prop('value');13 $('#btnjson').click(function () {14 $.post('/json/', {'csrfmiddlewaretoken':data1,'data':'Hi Hellow'}, function (data) {15 ul = $('#jsonlist');16 ul.append('<li>' + data['h1'] + '</li>');17 ul.append('<li>' + data['h2'] + '</li>');18 ul.append('<li>' + data['method'] + '</li>');19 ul.append('<li>' + data['csrf'] + '</li>');20 ul.append('<li>' + data['data'] + '</li>');21 })22 });23 })24 </script>25 </head>26 <body>27 <div>hello world!</div>28 {% csrf_token %}29 <input type="button" id="btnjson" value="获取json数据">30 <ul id="jsonlist"></ul>31 </body>32 </html>
1 <--JS搭建的服务器首页代码--> 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="utf-8"> 7 <title>index</title> 8 9 10 <script src="/js/jquery-1.12.4.min.js?1.1.11"></script>11 <script>12 $(function () {13 data1 = $('input[name="csrfmiddlewaretoken"]').prop('value');14 $('#btnjson').click(function () {15 $.get('http://192.168.27.128:8000/json/', {'csrfmiddlewaretoken':data1,'data':'HiHellow'}, function (data) {16 ul = $('#jsonlist');17 ul.append('<li>' + data['h1'] + '</li>');18 ul.append('<li>' + data['h2'] + '</li>');19 ul.append('<li>' + data['method'] + '</li>');20 ul.append('<li>' + data['csrf'] + '</li>');21 ul.append('<li>' + data['data'] + '</li>');22 })23 });24 })25 </script>26 27 28 </head>29 <body>30 {# <input type="button" value="返回">#}31 <a href="/">返回主页</a>32 33 <hr>34 <h1>参数</h1>35 <a href="/get1/?a=1&b=2&c=3">get一键传一值</a>36 <br>37 <a href="/get2/?a=1&b=2&c=3&a=5">get一键传多值</a>38 <br><br>39 <form method="post" action="http://192.168.27.128:8000/post/">40 41 {% csrf_token %}42 43 姓名:<input type="text" name="uname"/><br>44 密码:<input type="password" name="upwd"/><br>45 性别:<input type="radio" name="ugender" value="1"/>男46 <input type="radio" name="ugender" value="0"/>女<br>47 爱好:<input type="checkbox" name="uhobby" value="胸口碎大石"/>胸口碎大石48 <input type="checkbox" name="uhobby" value="脚踩电灯炮"/>脚踩电灯炮49 <input type="checkbox" name="uhobby" value="口吐火"/>口吐火<br>50 <input type="submit" value="提交"/>51 </form>52 53 <hr>54 <h1>GET属性</h1>55 <a href="/get3/?a=1&b=2&c=3">一键传一值</a>56 <br>57 <a href="/get4/?a=1&b=2&c=3&a=5">一键传多值</a>58 59 <hr>60 <h1>JsonResponse</h1>61 <a href="/ajax/">ajax</a>62 63 <hr>64 <h1>Cookie</h1>65 <a href="/cookie_set/">设置Cookie</a>66 <br>67 <a href="/get_Cookie/">获取Cookie</a>68 69 <hr>70 <div>hello world!</div>71 {% csrf_token %}72 <input type="button" id="btnjson" value="获取json数据">73 <ul id="jsonlist"></ul>74 </body>75 </html>
Das obige ist der detaillierte Inhalt vonErläuterung der Wissenspunkte zur gleichen Ursprungsrichtlinie und CSRF-Sicherheitsrichtlinie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!