搜尋
首頁web前端js教程有關對同源策略和csrf安全策略的知識點講解

雖然做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\pos​​t方式無法請求到a的資料。觀察a的log日誌,發現b的request請求在a上能夠收到,但是b的request附帶的數據均加載不成功,b的ajax(get\pos​​t)請求均能得到a的response,在下發到打開b的瀏覽器時報出了同源策略的警告。
 2.a開啟csrf安全策略的情況下,打開b的首頁,b的頁面可以透過get方式正常的向a提交表單並得到回應頁面,但是並不能透過post方式提交;b頁透過ajax的get\pos​​t方式皆無法請求到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>19     
20 21     {% csrf_token %}22 23     姓名:
24     密码:
25     性别:男26     
27     爱好:胸口碎大石28     脚踩电灯炮29     口吐火
30     31     
32 33     
34     

GET属性

35     一键传一值36     
37     一键传多值38 39     
40     

JsonResponse

41     ajax42 43     
44     

Cookie

45     设置Cookie46     
47     获取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 = $(&#39;input[name="csrfmiddlewaretoken"]&#39;).prop(&#39;value&#39;);13             $(&#39;#btnjson&#39;).click(function () {14                 $.post(&#39;/json/&#39;, {&#39;csrfmiddlewaretoken&#39;:data1,&#39;data&#39;:&#39;Hi Hellow&#39;}, function (data) {15                     ul = $(&#39;#jsonlist&#39;);16                     ul.append(&#39;<li>&#39; + data[&#39;h1&#39;] + &#39;&#39;);17                     ul.append(&#39;<li>&#39; + data[&#39;h2&#39;] + &#39;&#39;);18                     ul.append(&#39;<li>&#39; + data[&#39;method&#39;] + &#39;&#39;);19                     ul.append(&#39;<li>&#39; + data[&#39;csrf&#39;] + &#39;&#39;);20                     ul.append(&#39;<li>&#39; + data[&#39;data&#39;] + &#39;&#39;);21                 })22             });23         })24     </script>25 26 27     <div>hello world!</div>28     {% csrf_token %}29     <input>30     
    31 32 
     1  2  3 nbsp;html> 4  5  6     <meta> 7     <title>index</title> 8      9     10     <script></script>11     <script>12         $(function () {13             data1 = $(&#39;input[name="csrfmiddlewaretoken"]&#39;).prop(&#39;value&#39;);14             $(&#39;#btnjson&#39;).click(function () {15                 $.get(&#39;http://192.168.27.128:8000/json/&#39;, {&#39;csrfmiddlewaretoken&#39;:data1,&#39;data&#39;:&#39;HiHellow&#39;}, function (data) {16                     ul = $(&#39;#jsonlist&#39;);17                     ul.append(&#39;<li>&#39; + data[&#39;h1&#39;] + &#39;&#39;);18                     ul.append(&#39;<li>&#39; + data[&#39;h2&#39;] + &#39;&#39;);19                     ul.append(&#39;<li>&#39; + data[&#39;method&#39;] + &#39;&#39;);20                     ul.append(&#39;<li>&#39; + data[&#39;csrf&#39;] + &#39;&#39;);21                     ul.append(&#39;<li>&#39; + data[&#39;data&#39;] + &#39;&#39;);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>39     
    40 41     {% csrf_token %}42 43     姓名:
    44     密码:
    45     性别:男46     
    47     爱好:胸口碎大石48     脚踩电灯炮49     口吐火
    50     51     
    52 53     
    54     

    GET属性

    55     一键传一值56     
    57     一键传多值58 59     
    60     

    JsonResponse

    61     ajax62 63     
    64     

    Cookie

    65     设置Cookie66     
    67     获取Cookie68     69     
    70     
    hello world!
    71     {% csrf_token %}72     73     
      74 75 

      以上是有關對同源策略和csrf安全策略的知識點講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

      陳述
      本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
      node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

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

      Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

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

      JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

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

      幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

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

      Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

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

      Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

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

      JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

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

      JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

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

      See all articles

      熱AI工具

      Undresser.AI Undress

      Undresser.AI Undress

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

      AI Clothes Remover

      AI Clothes Remover

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

      Undress AI Tool

      Undress AI Tool

      免費脫衣圖片

      Clothoff.io

      Clothoff.io

      AI脫衣器

      Video Face Swap

      Video Face Swap

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

      熱工具

      ZendStudio 13.5.1 Mac

      ZendStudio 13.5.1 Mac

      強大的PHP整合開發環境

      mPDF

      mPDF

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

      SecLists

      SecLists

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

      SAP NetWeaver Server Adapter for Eclipse

      SAP NetWeaver Server Adapter for Eclipse

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

      MinGW - Minimalist GNU for Windows

      MinGW - Minimalist GNU for Windows

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