Djano 默认的安全机制会把后台直接发到前端的数据都当做字符串,这样可以有效避免XSS***。

比如说


views.py 片段里面我传递给前端了一个html格式的字符串和一个Javascript的字符串

def tpl4(request):
    name = "hello my name is ggggg"
    test="""
    
    
    
    """
    data=""
    return render(request, 'tpl4.html', {'name': name,'test':test,'data':data})

  

tpl4.html 里面直接输出

{% load calculation %}



    
    




    

        {% addnum  2  5  6 %}     

    

         {{ name }}     

    

        {{ name|upper }}     

    

        {{ name|truncatechars:"10" }}     

    {{ 30|mulnum:30 }}     

        {{ test }}          {{ data }}     

  


可以看见结果直接输出的是字符串


Djano XSS的转义_第1张图片


如何能够强制解析我们发送的内容呢?我们可以标记他为‘安全’,这样Django的模板语言就能正常识别了。比如我们加一个管道符号,然后表明safe


{% load calculation %}



    
    


    

        {% addnum  2  5  6 %}     

    

         {{ name }}     

    

        {{ name|upper }}     

    

        {{ name|truncatechars:"10" }}     

    {{ 30|mulnum:30 }}     

        {{ test }}          {{ data }}     

    

        {{ test|safe}}     

        {{ data|safe }}


这样我就能成功地执行Javascript和html代码了

Djano XSS的转义_第2张图片

不过这样每一行来写safe比较麻烦,另外一个简单的方式就是直接在Python文件上标明。

首先要导入一个类 from django.utils.safestring import mark_safe

然后把对应的字符串标记为安全 mark_safe(test)就行了


def tpl4(request):
    from django.utils.safestring import mark_safe
    name = "hello my name is ggggg"
    test="""
    
    
    
    """
    data=""
    test=mark_safe(test)
    data=mark_safe(data)
    return render(request, 'tpl4.html', {'name': name,'test':test,'data':data})


tpl4.html直接调用即可

{% load calculation %}



    
    


    

        {% addnum  2  5  6 %}     

    

         {{ name }}     

    

        {{ name|upper }}     

    

        {{ name|truncatechars:"10" }}     

    {{ 30|mulnum:30 }}     

        {{ test }}          {{ data }}     


效果如下

Djano XSS的转义_第3张图片