前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Django | 安全防护】防止XSS跨站脚本攻击

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

作者头像
计算机魔术师
发布2022-08-19 19:06:57
8860
发布2022-08-19 19:06:57
举报
文章被收录于专栏:计算机魔术师
在这里插入图片描述
在这里插入图片描述

🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 🌐 推荐一款找工作神器网站: 宝藏网站 |笔试题库|面试经验|实习招聘内推|

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

文章目录

一、XSS攻击过程原理

在这里插入图片描述
在这里插入图片描述

创建一个 XXS脚本漏洞作为演示

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

  1. 创建视图函数
代码语言:javascript
复制
"""
直接返回 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. 添加路由环境(只能开发环境使用,由于演示漏洞环境,我们放在添加最后面路由)
代码语言:javascript
复制
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. 创建一名攻击者用户,在个人信息填上攻击的代码
在这里插入图片描述
在这里插入图片描述
  1. 跳转到该页面(可以看到直接显示cookie信息😱😱)
在这里插入图片描述
在这里插入图片描述

可以看到,攻击者可以通过此方法得到cookie ,还可以对得到用户的更多信息,以及增删改查操作,这是很危险的! 🤯

三、修复漏洞🔨

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

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

html.escape()源码

代码语言:javascript
复制
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

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

代码语言:javascript
复制
import html
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(html.escape(content))
    except Resume.DoesNotExist:
        raise Http404(_("resume does not exist"))

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

在这里插入图片描述
在这里插入图片描述

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/08/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、XSS攻击过程原理
  • 二、假设我是一名攻击者🐱‍👤
  • 三、修复漏洞🔨
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档