XSS と CSRF の詳細な紹介

零下一度
零下一度オリジナル
2017-06-29 10:40:252735ブラウズ

1. XSS

クロスサイトスクリプティング (クロスサイトスクリプティング) は、Cascading Style Sheets (CSS) の略語と混同しないようにしてください。そのため、クロスサイトスクリプティング攻撃は XSS と略されます。悪意のある攻撃者は、Web ページに悪意のあるスクリプト コードを挿入し、ユーザーがそのページを閲覧すると、Web ページに埋め込まれたスクリプト コードが実行され、ユーザーに対する悪意のある攻撃の目的が達成されます。

1. ワークフロー

a. 悪意のあるユーザーが一部の公開領域 (提案送信フォームやメッセージ公開掲示板の入力フォームなど) にテキストを入力しますが、これらのテキストは他のユーザーには表示されません。入力するテキストだけでなく、クライアント側で実行できるいくつかのスクリプトも含まれます。例:

<script>'Not Safe'</script>

b. このフォームを悪意を持って送信します

c. 他のユーザーが悪意のあるスクリプトを含むこのページを見て、それらを実行してユーザーの Cookie やその他の機密情報を取得します。

2. 例 - XSS 攻撃を防止しない

 1 pinglu = []     # 评论列表 2  3 #提交表单 4 def commit(request): 5     if request.method == 'GET': 6         return render(request, 'commit.html') 7     else: 8         com = request.POST.get('commit') 9         pinglu.append(com)10         return redirect('/index.html/')11 12 13 #查看评论页面14 def index(request):15     return render(request, 'index.html', {'commit': pinglu})
view.py
 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>Title</title> 6 </head> 7 <body> 8 <h1>评论</h1> 9 <form action="/commit.html/" method="post">10     <input type="text" name="commit">11     <input type="submit" value="sumbit"> {{ error }}12 </form>13 </body>14 </html>
commit.html
 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>Title</title> 6 </head> 7 <body> 8 <h1>评论</h1> 9 {% for item in commit %}10     <div>{{ item|safe }}</div>11 {#    item后加safe,默认数据安全,django不会做特殊处理#}12 {% endfor %}13 </body>14 </html>
Index.html
上記の例では、commit.html ページに次の内容を入力して送信すると、

<script> alert('恶意脚本') </script>
、このコード行がインデックス ページで実行され、警告ボックスがポップアップ表示されます。 (悪意のあるコードが含まれている場合は実行されます)

3. XSS 攻撃を防ぐ最も直接的な方法

  • は、制御できない入力に対して HTML ページでセーフを使用しないことです

{#    <div>{{ item|safe }}</div>#}<div>{{ item }}</div>
  • ビューでフィルタリングして、特殊文字がデータベースや Web ページに送信されないようにすることもできます

def commit(request):if request.method == 'GET':return render(request, 'commit.html')else:
        com = request.POST.get('commit')if '<script>' in com:    # 过滤“<script>”关键字,防止恶意代码的提交return render(request, 'commit.html', {'error': '此条评论有毒,已被和谐'})else:
            pinglu.append(com)return redirect('/index.html/')

2. CSRF

CSRF (クロスサイト リクエスト フォージェリ)クロスサイト リクエスト フォージェリ (「ワン クリック攻撃」またはセッション ライディング (CSRF または XSRF と略されることも多い) とも呼ばれる) は、Web サイトの悪意のある悪用です。クロスサイト スクリプティング (XSS) のように聞こえますが、サイト内の信頼できるユーザーを悪用する XSS とは大きく異なります。一方、CSRF は信頼できるユーザーからのリクエストを偽装することで信頼できる Web サイトを悪用します。 XSS 攻撃と比較すると、CSRF 攻撃はあまり普及していない傾向があり (したがって、CSRF 攻撃を防ぐためのリソースも非常に不足しています)、防ぐのが難しいため、XSS よりも危険であると考えられています。

1. ワークフロー

攻撃は、許可されたユーザーがアクセスするページにリンクまたはスクリプトを含めることによって機能します:

2. ユーザーのクロスサイトリクエストフォージェリを防ぐために django で

django を防ぐ方法 機能はミドルウェア django.middleware.csrf.CsrfViewMiddleware を通じて完了します。 Django のクロスサイト リクエスト フォージェリ対策機能は、グローバルとローカルに分かれています。

グローバル:

  • ミドルウェアを有効にする django.middleware.csrf.CsrfViewMiddleware

部分:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件

  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

 3. django中的具体应用方法

  • form表单中添加{csrf_token %}

若form表单中未添加{csrf_token %},则会报403错误。

#settings.py中打开MIDDLEWARE设置'django.middleware.csrf.CsrfViewMiddleware',
1 from django.shortcuts import render, HttpResponse, redirect2 3 def csrf_test(request):4     if request.method == 'GET':5         return render(request, 'csrf_test.html')6     else:7         return HttpResponse('ok')
views.py
 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>csef_test</title> 6 </head> 7 <body> 8 <form action="/csrf_test.html/" method="post"> 9     <input type="text" name="user" id="user">10     <input type="submit" value="submit">11 </form>12 13 </body>14 </html>
csef_test.html

修改csef_test.html:

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>csef_test</title> 6 </head> 7 <body> 8 <form action="/csrf_test.html/" method="post"> 9     {% csrf_token %}10     <input type="text" name="user" id="user">11     <input type="submit" value="submit">12 </form>13 14 </body>15 </html>
form表单中添加{% csrf_token %}

  • 全站禁用,即将settings.py中的 'django.middleware.csrf.CsrfViewMiddleware' 注释掉即可

  • 基于FBV视图的局部禁用和使用

 1 #settings.py 2 #启用 'django.middleware.csrf.CsrfViewMiddleware', 3  4  5 from django.views.decorators.csrf import csrf_exempt 6  7  8 @csrf_exempt 9 def csrf_test(request):10     if request.method == 'GET':11         return render(request, 'csrf_test.html')12     else:13         return HttpResponse('ok')
局部禁用
 1 #settings.py 2 #禁用 #'django.middleware.csrf.CsrfViewMiddleware', 3  4  5 from django.views.decorators.csrf import csrf_protect 6  7  8 @csrf_protect 9 def csrf_test(request):10     if request.method == 'GET':11         return render(request, 'csrf_test.html')12     else:13         return HttpResponse('ok')
局部使用
  •  基于CBV视图的(只能局部使用或禁用类,不能在类方法里局部使用或禁用

 1 #settings.py 2 #禁用    'django.middleware.csrf.CsrfViewMiddleware', 3  4  5 from django.views import View 6 from django.views.decorators.csrf import csrf_protect 7 from django.utils.decorators import method_decorator 8  9 10 @method_decorator(csrf_protect, name='dispatch')11 class Foo(View):12     def get(self, request):13         pass14 15     def post(self, request):16         pass
局部使用
 1 #settings.py 2 #启用    'django.middleware.csrf.CsrfViewMiddleware', 3  4  5 from django.views import View 6 from django.views.decorators.csrf import csrf_exempt 7 from django.utils.decorators import method_decorator 8  9 10 @method_decorator(csrf_exempt, name='dispatch')11 class Foo(View):12     def get(self, request):13         pass14 15     def post(self, request):16         pass
局部禁用
  • Ajax提交数据时,携带CSRF

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>csef_test</title> 6 </head> 7 <body> 8 <form action="/csrf_test.html/" method="post"> 9     {% csrf_token %}10     <input type="text" name="user" id="user">11 {#    <input type="submit" value="submit">#}12     <a onclick="submitForm();">Ajax提交表单</a>13 </form>14 15 <script src="/static/jquery-3.2.1.js"></script>16 <script>17     function submitForm() {18             var csrf = $("input[name='csrfmiddlewaretoken']").val()19             var user = $("#user").val()20             $.ajax({21                 url: '/csrf_test.html/',22                     type: 'POST',23                     data: {"user": user, "csrfmiddlewaretoken": csrf},24                     success: function (arg) {25                             console.log(arg);26           }27             })28   }29 </script>30 </body>31 </html>
Ajax重写csrf_test,html,csrf数据存放于data中
 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>csef_test</title> 6 </head> 7 <body> 8 <form action="/csrf_test.html/" method="post"> 9     {% csrf_token %}10     <input type="text" name="user" id="user">11 {#    <input type="submit" value="submit">#}12     <a onclick="submitForm();">Ajax提交表单</a>13 </form>14 15 <script src="/static/jquery-3.2.1.js"></script>16 {#专门处理cookie的插件,提取cookie字符串#}17 <script src="/static/jquery.cookie.js"></script>18 19 {#csrf数据放于data中#}20 {#<script>#}21 {#    function submitForm() {#}22 {#            var csrf = $("input[name='csrfmiddlewaretoken']").val();#}23 {#            var user = $("#user").val();#}24 {#            $.ajax({#}25 {#                url: '/csrf_test.html/',#}26 {#                    type: 'POST',#}27 {#                    data: {"user": user, "csrfmiddlewaretoken": csrf},#}28 {#                    success: function (arg) {#}29 {#                            console.log(arg);#}30 {#          }#}31 {#            })#}32 {#  }#}33 {#</script>#}34 35 {#csrf数据放于请求头中#}36 <script>37     function submitForm() {38             var csrf = $.cookie('csrftoken');39             var user = $("#user").val();40             $.ajax({41                 url: '/csrf_test.html/',42                     type: 'POST',43                     headers: {'X-CSRFToken': csrf},44                     data: {"user": user},45                     success: function (arg) {46                             console.log(arg);47           }48             })49   }50 </script>51 52 53 54 </body>55 </html>
Ajax重写csrf_test.html,csrf数据存放于headers中

注意:{csrf_token %}和cookie中的csrftoken值不一样。

form表单中的隐藏csrf_token

 cookie中

 

以上がXSS と CSRF の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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