django开发的safe过滤器适用

django_safe

在自己开发的博客系统当中,如果使用django框架,那么在发布博客内容的时候,希望可以发布一些被渲染过的样式文本,比如说图片等。

下面是发布文章用到的代码

# views.py
def article_detail(request,username,article_id):
    user = UserInfo.objects.filter(username=username).first()
    blog = user.blog
    article_obj = Article.objects.filter(pk = article_id).first()
    # print(blogs.title)
    # content = getClassificationData(username)
    # return render(request,"article_detail.html",locals())
    # 在Django的视图函数中,locals()函数被用来将当前作用域的局部变量以字典形式传递给模板。它是Python内置函数,返回的是包含当前作用域所有局部变量的字典。
    return render(request, "article_detail.html",{"username":username,"blog":blog, "article_obj":article_obj})

#article_detail.html
{% extends 'base.html' %}

{% block content %}
    <h3 class="text-center">{{ article_obj.title }}</h3>
    <div class="cont">
        {{ article_obj.content }}
{#     加入safe可以拿掉对标签的转义#}
    </div>

{% endblock %}

例如我现在用最简单的<h3>regina</h3>

image-20230804215245026

image-20230804215307126

得到的数据并不是一个我们期待的三级标题的样式,而是原封不动的字符串。这是因为django在我们存入数据库的时候进行的转义,将标签进行了转换存入了数据库。

image-20230804215512439

所以如果我们想得到一个html样式的文本,就要前端的过滤器safe.

image-20230804215632351

image-20230804220043452

再次运行的时候我们就能获得相应的标签了。

image-20230804220121983

但是问题就在于如果我们添加了safe过滤器,拿掉了转义功能,就有可能造成xss存储型攻击,因为我们的数据是保存到数据库里的,例如下图:

image-20230804220401426

image-20230804220413993

这样就会造成永久性的对客户端发起的xss攻击,如果进行payload构造就会泄漏更多的信息。所以在后期我们不能依赖django的转义,我们还是需要在文本处理时就进行转义,保证我们的标签样式可以构造出来的同时,也可以防止这种攻击。

posted @ 2023-08-04 22:08  ivanlee717  阅读(114)  评论(0编辑  收藏  举报