写点什么

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

  • 2022 年 8 月 31 日
    广东
  • 本文字数:1437 字

    阅读完需:约 5 分钟


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


🌐 推荐一款找工作神器网站: 牛客网🎉🎉|笔试题库|面试经验|实习招聘内推 还没账户的小伙伴 速速点击链接跳转牛客网登录注册 开始刷爆题库,速速通关面试吧🙋‍♂️


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


@[toc]

一、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} <br> introduction: {resume.candidate_introduction} <br>" return HttpResponse(content) except Resume.DoesNotExist: raise Http404(_("resume does not exist"))
复制代码


  1. 添加路由环境(只能开发环境使用,由于演示漏洞环境,我们放在添加最后面路由)


from django.conf import settings
# 测试是否为开发环境if settings.DEBUG:
urlpatterns += [ re_path(r'^resume/detail/(?P<pk>\d+)/$', jobs.views.resume_datail, name='resume_datail') ]
复制代码


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


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

原理


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


  1. 创建一名攻击者用户,在个人信息填上攻击的代码

  2. 跳转到该页面(可以看到直接显示cookie信息😱😱)

  3. 可以看到,攻击者可以通过此方法得到 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("&", "&amp;") # Must be done first!    s = s.replace("<", "&lt;")    s = s.replace(">", "&gt;")    if quote:        s = s.replace('"', "&quot;")        s = s.replace('\'', "&#x27;")    return s
复制代码


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


import htmldef resume_datail(request, pk):    try:        resume = Resume.objects.get(pk=pk)        content = f"name: {resume.username} <br> introduction: {resume.candidate_introduction} <br>"
return HttpResponse(html.escape(content)) except Resume.DoesNotExist: raise Http404(_("resume does not exist"))
复制代码


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



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


              🤞到这里,如果还有什么疑问🤞    🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩      🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
复制代码


用户头像

还未添加个人签名 2022.08.13 加入

还未添加个人简介

评论

发布
暂无评论
【Django | 安全防护】防止XSS跨站脚本攻击_8月月更_计算机魔术师_InfoQ写作社区