zoukankan      html  css  js  c++  java
  • Django之cfrs跨站请求伪造和xfs攻击

    跨站请求伪造

    一、简介

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

    全局:

      中间件 django.middleware.csrf.CsrfViewMiddleware

    局部:

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

    注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

    csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
    csrf:post时,需要用户携带随机字符串

    二、应用

    1、普通表单

    veiw中设置返回值:
      return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
         或者
         return render(request, 'xxx.html', data)
      
    html中设置Token:
      {% csrf_token %}
    

      

    2、Ajax

    对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

    示例:

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        # 关于csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
        url(r'^csrf1.html$',views.csrf1),
    
    ]
    

    views.py

    from django.shortcuts import render,HttpResponse
    from django.views import View
    from app01 import models
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # =============关于csrf的:
    # csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
    # 1.将setting里面的csrf的注释去掉
    @csrf_protect#这个指的是局部使用,全站禁用,(仅仅在下面的这个被装饰的函数使用csrf)需要注释setting里的csrf
    @csrf_exempt#这个指的是局部禁用,全站使用,(仅仅在下面的这个被装饰的函数禁用csrf)不能注释setting里的csrf
    def csrf1(request):
        if request.method=="GET":
            return render(request,"csrf1.html")
        else:
            return HttpResponse("good")

    csrf1.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form method="post" action="/csrf1.html">
        {% csrf_token %}
    {#    {{ csrf_token }}#}
        <input id="user" type="text" name="username">
        <input type="submit" value="提交">
        <a onclick="submitForm();">Ajax提交</a>
    </form>
    
    <script src="/static/jquery-1.12.4.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    
    <script>
        function submitForm() {
            var token=$.cookie("csrftoken");
    {#        var token=$.cookie("csrftoken");这个根据cookie的key来取的随机生成的cookie的value值#}
            var user=$("#user").val();
            $.ajax({
                url:"/csrf.html",
                type:"POST",
                headers:{"X-CSEFToken":token},
                data:{"user":user},
                success:function (arg) {
                    console.log(arg);
                }
            })
    
        }
    </script>
    
    </body>
    </html>
    

    三、csrf基于FBV和CBV的应用

    示例:

    from django.shortcuts import render,HttpResponse
    from django.views import View
    from app01 import models
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # =======csrf里面的CBV(基于类的方式)应用装饰器
    from django.views import View
    from django.utils.decorators import method_decorator
    # 1、先自定义一个闭包函数做装饰器
    def wrapper(func):
        def inner(*args,**kwargs):
            return func(*args,**kwargs)
        return inner
    # 关于cbv的应用装饰器,方法一:在指定的方法上添加装饰器
    class Foo(View):
        @method_decorator(wrapper)#仅仅在下面的函数内有效
        def get(self,request):
            # return HttpResponse("login_get")
            return render(request,"login.html")
    
        def post(self,request):
            print(request.POST.get("username"))
            return HttpResponse("login_post")
    
    # 方法二:在类上面添加
    # @method_decorator(wrapper,name="get")#仅仅给类里面的get函数使用
    @method_decorator(wrapper,name="dispatch")#给下面所有的函数使用
    class Foo(View):
        def dispatch(self, request, *args, **kwargs):
            pass
        def get(self,request):
            # return HttpResponse("login_get")
            return render(request,"login.html")
    
        def post(self,request):
            print(request.POST.get("username"))
            return HttpResponse("login_post")
    

      

    xss攻击

    - 慎用 safe和mark_safe
    - 非要用,一定要过滤关键字

    示例:

    xss攻击
        跨站脚本攻击:
        防止:
            -其他人输入的内容  不用safe
            -自己输入的内容    可用safe
     
     
        <scripts>
            for(var i=0;i<9999;i++){
                alert(i)
            }
        </scripts>   
                 
        <scripts>
            获取本地cookie,发送到别外一个网站
        </scripts>    
    
  • 相关阅读:
    Asp.net core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库
    外业数据采集平台(GPS+Android Studio+Arcgis for android 100.2.1)
    Android Studio 单元测试
    1.泛型(Generic)
    营销推广软件,抢沙发功能,滑动解锁,自动提交文章评论,使用Puppeteer(一)
    C# 使用Tesseract-OCR-v5.0,实现验证码,中文,身份证识别
    Tesseract-OCR-v5.0中文识别,训练自定义字库,提高图片的识别效果
    C# 实现验证码识别,使用AspriseOCR.dll
    C# 自动批量搜索指定关键字,没有注册的域名
    C#图片采集软件 自动翻页 自动分类(收集美图必备工具)(一)
  • 原文地址:https://www.cnblogs.com/xuyuanyuan123/p/7107640.html
Copyright © 2011-2022 走看看