• 【Django | 安全防护】防止XSS跨站脚本攻击


    在这里插入图片描述

    🤵‍♂️ 个人主页: @计算机魔术师
    👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

    该文章收录专栏
    —【Django | 项目开发】从入门到上线 专栏—

    一、XSS攻击过程原理

    在这里插入图片描述
    创建一个 XXS脚本漏洞作为演示

    我们创建视图函数返回模型对象的字段

    1. 创建视图函数
    """
    直接返回 HTML内容的视图,(存在XXS cross site scripting 漏洞,能被攻击者使用)
    """
    
    
    def resume_datail(request, pk):
        try:
            resume = Resume.objects.get(pk=pk)
            content = f"name: {resume.username} 
    introduction: {resume.candidate_introduction}
    "
    return HttpResponse(content) except Resume.DoesNotExist: raise Http404(_("resume does not exist"))
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 添加路由环境(只能开发环境使用,由于演示漏洞环境,我们放在添加最后面路由)
    from django.conf import settings
    
    # 测试是否为开发环境
    if settings.DEBUG:
    
        urlpatterns += [
            re_path(r'^resume/detail/(?P\d+)/$', jobs.views.resume_datail, name='resume_datail')
        ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这个视图函数只返回了两个字段,但已经足够用来演示XXS攻击原理了
    在这里插入图片描述

    二、假设我是一名攻击者🐱‍👤

    原理

    攻击者将自己的个人信息填写上javascript脚本,那么我们作为用户去查看字段时,会直接渲染 信息内容,此时就会运行攻击脚本script进行发送信息,删除用户等操作

    1. 创建一名攻击者用户,在个人信息填上攻击的代码
      在这里插入图片描述
    2. 跳转到该页面(可以看到直接显示cookie信息😱😱)
      在这里插入图片描述
      可以看到,攻击者可以通过此方法得到cookie ,还可以对得到用户的更多信息,以及增删改查操作,这是很危险的! 🤯

    三、修复漏洞🔨

    我们可以用函数html.escape()对其做一个转义最建议的方法是使用系统的render方法django自带模板机制渲染页面

    • html.escape()方法很简单,就是将"&", "<" 和 ">" 符号变成 HTML-safe sequences,这样就可以将字符串单纯表示出来

    html.escape()源码

    def escape(s, quote=True):
        """
        Replace special characters "&", "<" and ">" to HTML-safe sequences.
        If the optional flag quote is true (the default), the quotation mark
        characters, both double quote (") and single quote (') characters are also
        translated.
        """
        s = s.replace("&", "&") # Must be done first!
        s = s.replace("<", "<")
        s = s.replace(">", ">")
        if quote:
            s = s.replace('"', "&quot;")
            s = s.replace('\'', "&#x27;")
        return s
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    我们将之前的视图函数添加该方法

    import html
    def resume_datail(request, pk):
        try:
            resume = Resume.objects.get(pk=pk)
            content = f"name: {resume.username} 
    introduction: {resume.candidate_introduction}
    "
    return HttpResponse(html.escape(content)) except Resume.DoesNotExist: raise Http404(_("resume does not exist"))
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以看到此时改脚本不会运行🎉

    在这里插入图片描述

    但是通常情况不用该方法,建议使用render渲染模板,或者使用我们的通用类视图。

    			        🤞到这里,如果还有什么疑问🤞
    		🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
    			🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
    
    • 1
    • 2
    • 3
  • 相关阅读:
    TENSEAL: A LIBRARY FOR ENCRYPTED TENSOR OP- ERATIONS USING HOMOMORPHIC ENCRYPTION 解读
    数据资产管理与数据安全国内外最新趋势
    推荐十道Python列表基础测试题
    亚马逊添加购物车和收藏有什么区别
    Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)
    Mybatis || Mybatis-Plus中configuration和configLocation无法同时使用记录
    Vue3系列文章 —(1)介绍
    mysql高手进阶优化篇
    Tomcat的下载安装与配置
    【初阶数据结构】带头双向循环链表(C语言实现)
  • 原文地址:https://blog.csdn.net/weixin_66526635/article/details/125944667