ホームページ  >  記事  >  ウェブフロントエンド  >  同一生成元ポリシーとCSRFセキュリティポリシーに関する知識ポイントの説明

同一生成元ポリシーとCSRFセキュリティポリシーに関する知識ポイントの説明

巴扎黑
巴扎黑オリジナル
2017-07-23 14:27:371527ブラウズ

私はしばらく Web 開発をしていましたが、同一生成元ポリシーと CSRF セキュリティ ポリシーについて深く理解したことがなかったので、それを理解するために簡単な実験をしてみました。実験の手順は以下の通りですので、皆さんにも共有してください。

実験の目的: 同一オリジンポリシーとcsrfセキュリティポリシーの関係と違いを検証するため

実験計画: 1. LinuxはdjangoフレームワークのPythonサーバーを構築します(a)。簡単な js サーバーを構築します ( b) の 2.B のホームページは次のように作成されます。 (1) フォーム A に送信します。 (2) Postget メソッドを使用します。 (2) Ajax メソッド (postget) からデータを要求します。 CSRF セキュリティ ポリシーを有効にしない場合、b のホームページを開きます。b のページは通常、postget を通じて a にフォームを送信し、返信ページを取得できますが、ajax の getpost メソッドを通じて a のデータを要求することはできません。 aのログを観察すると、aではbのリクエストは受信できるが、bのリクエストに添付されたデータは正常にロードできず、bのajax(getpost)リクエストはaのレスポンスを取得できていることがわかります。 b. ブラウザに同一生成元ポリシーの警告が表示されます。
2. a が CSRF セキュリティ ポリシーを開くと、b のホームページが開きます。b のページは通常、get メソッドを通じて a にフォームを送信し、返信ページを取得できますが、post メソッドを通じて送信することはできません。 b のページは ajax 経由で送信できます。 getpost メソッドは a のデータを要求できません。
結論: 1. 同一オリジンポリシー: js 言語はセキュリティを考慮して設計されており、同一オリジンのアクセスのみを許可します。オリジナル以外のアクセスでも、対応するサーバーにリクエストを送信できますが、ブラウザーのリクエストに添付されたデータはすべて失われ、サーバーはリクエストの応答を返す可能性があります。ただし、サーバーが発行した応答をブラウザーが解析する応答フェーズ中に、同一生成元ポリシーの警告が表示されます。 (jsベースのajax技術の説明)

2. csrfセキュリティポリシー: サーバーを構築する際のセキュリティの考慮事項は、一般の開発者が関連する設計を行う必要があります(通常、フレームワークにはcsrfセキュリティポリシーの設計が付属します)。 csrf ポリシーのプロセスは次のとおりです。サーバー ページをリクエストすると、サーバーの応答によってブラウザに Cookie が設定されます。投稿フォームがサーバーに送信されると、サーバーによって設定された Cookie がブラウザのリクエストに追加され、一緒に送信されます。リクエストを受信すると、添付された Cookie が正しいかどうかが検証されます (各ユーザーはサーバーとの通信接続に対して一意の Cookie を 1 つだけ持ちます。接続が中断されると、サーバーは次回ブラウザに新しい Cookie を設定します)接続が確立され、Cookie の検証が成功した場合にのみ正しい応答が発行されます。検証が失敗した場合は、「403」エラー コードが発行されます。

rreee
rreee

  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>

以上が同一生成元ポリシーとCSRFセキュリティポリシーに関する知識ポイントの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。