雖然做web開發有一段時間了,但是對於同源策略和csrf安全策略理解一直不深刻,特抽出時間做了簡單的實驗進行理解。實驗過程如下,與大家分享。
實驗目的:驗證同源策略和csrf安全策略的關係和區別
實驗方案:1.Linux搭建django框架的python伺服器(a);Windows搭建簡單的js伺服器(b)
2.b的首頁中做瞭如下:(1)透過以下內容透過post\get方式提交給a表單
向a請求資料
實驗結果:1.a沒有開啟csrf安全策略的情況下,開啟b的首頁,b的頁面可以透過post\get方式正常的向a提交表單並得到回覆頁面;但是透過ajax的get\post方式無法請求到a的資料。觀察a的log日誌,發現b的request請求在a上能夠收到,但是b的request附帶的數據均加載不成功,b的ajax(get\post)請求均能得到a的response,在下發到打開b的瀏覽器時報出了同源策略的警告。
2.a開啟csrf安全策略的情況下,打開b的首頁,b的頁面可以透過get方式正常的向a提交表單並得到回應頁面,但是並不能透過post方式提交;b頁透過ajax的get\post方式皆無法請求到a的資料。
結論:1.同源策略:js語言的設計安全考慮,只允許同源存取。非同源存取也能向對應伺服器發送請求,但瀏覽器request中附帶的資料全部遺失,伺服器能回傳request的response。但是在瀏覽器解析伺服器下發的response階段會有同源策略的警告。 (解釋基於js的ajax技術)
2.csrf安全策略:搭建伺服器時的安全考慮,需要一般開發者進行相關的設計(框架一般自備csrf安全策略的設計)。 csrf策略過程為:在請求伺服器的頁面時,伺服器的response會向瀏覽器設定一個cookie,當有post方式的表單向伺服器提交時,伺服器設定的cookie會附加在瀏覽器的request中一起提交,伺服器在接收request時,會驗證附加的cookie是否正確(每個使用者與伺服器的通訊連線只有一個唯一的cookie,連線中斷後,下次連線時伺服器會向瀏覽器設定新的cookie),只有cookie驗證通過才能下發正確的response,驗證失敗會有「403」錯誤碼下發。
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 id="设置Cookie-请查看响应报文头">设置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 id="读取Cookie-数据如下-br-cookies-request-COOKIES-if-cookies-get-h-response-write-h-cookies-h">读取Cookie,数据如下:<br>')100 cookies = request.COOKIES101 if cookies.get('h1'):102 response.write('<h1>'+cookies['h1']+'</h1>')103 104 return response</h1>
1 2 3 nbsp;html> 4 5 6 <meta> 7 <title>index</title> 8 9 10 {# <input>#}11 <a>返回主页</a>12 13 <hr>14 <h1 id="参数">参数</h1>15 <a>get一键传一值</a>16 <br>17 <a>get一键传多值</a>18 <br><br>1932 33
34
GET属性
35 一键传一值3637 一键传多值38 39
40
JsonResponse
41 ajax42 4344
Cookie
45 设置Cookie4647 获取Cookie48 49
1 2 3 nbsp;html> 4 5 6 <meta> 7 <title>ajax</title> 8 9 <script></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'] + '');17 ul.append('<li>' + data['h2'] + '');18 ul.append('<li>' + data['method'] + '');19 ul.append('<li>' + data['csrf'] + '');20 ul.append('<li>' + data['data'] + '');21 })22 });23 })24 </script>25 26 27 <div>hello world!</div>28 {% csrf_token %}29 <input>30
1 2 3 nbsp;html> 4 5 6 <meta> 7 <title>index</title> 8 9 10 <script></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'] + '');18 ul.append('<li>' + data['h2'] + '');19 ul.append('<li>' + data['method'] + '');20 ul.append('<li>' + data['csrf'] + '');21 ul.append('<li>' + data['data'] + '');22 })23 });24 })25 </script>26 27 28 29 30 {# <input>#}31 <a>返回主页</a>32 33 <hr>34 <h1 id="参数">参数</h1>35 <a>get一键传一值</a>36 <br>37 <a>get一键传多值</a>38 <br><br>3952 53
54
GET属性
55 一键传一值5657 一键传多值58 59
60
JsonResponse
61 ajax62 6364
Cookie
65 设置Cookie6667 获取Cookie68 69
70
#
以上是有關對同源策略和csrf安全策略的知識點講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。