Django之防止xss和csrf

1、防止 xss(跨站脚本语言)

  慎用safe和make_safe

# safe和make_safe 的用法

后端传值:value="<a href="">点击</a>"
前端使用:{{ value|safe}}
结果直接再前端显示一个a标签


# 后端也可以告诉django不要转义
from django.utils.safestring import mark_safe
    s1 = mark_safe("<h1>我是h1</h1>")
    s2 = mark_safe("<script>alert(123)</script>")

  使用BeautifulSoup4对输入后端得html文本经行校验。BeautifulSoup4中文文档

2、防止CSRF 跨站请求伪造 

  2.1 form 表单中应用

<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="password"></p>
    <p><input type="submit"></p>
</form>

  2.2 ajax提交中应用

    1. 直接放在data里

<script>
    $(".btn").click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
                'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val() // {{ csrf_token }}
            },
            success: function (data) {
                console.log(data)
            }


        })
    })
</script>

    2. 放在cookie里

<script>
    $(".btn").click(function () {
        var token=$.cookie('csrftoken')
        //var token='{{ csrf_token }}'
        $.ajax({
            url: '',
            headers:{'X-CSRFToken':token},
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
            },
            success: function (data) {
                console.log(data)
            }
        })
    })
</script>

  2.3 后端设置是否禁用

    1. 在FBV中使用

from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 不再检测,局部禁用(前提是全站使用)
# @csrf_exempt
# 检测,局部使用(前提是全站禁用)
# @csrf_protect
def csrf_token(request):
    if request.method=='POST':
        print(request.POST)
        return HttpResponse('ok')
    return render(request,'csrf_token.html')

    2. 在CBV中使用

# CBV中使用
# 说明:由于在执行post之前先执行dispatch,所以在类名上给dispatch设置或直接对post方法设置

from django.views import View
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt,name='dispatch')
class Foo(View):

    def dispatch(self, request, *args, **kwargs):
        return super(TestCSRF, self).dispatch(request, *args, **kwargs)

    def get(self,request):
        pass

    def post(self,request):
        pass

 

posted @ 2019-05-01 11:30  yw_sun  阅读(605)  评论(0)    收藏  举报