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>    

 

posted @ 2017-07-02 23:33  白木潇潇夕  阅读(1224)  评论(0编辑  收藏  举报