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

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

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

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

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

@[toc]

一、XSS攻击过程原理

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

创建一个&#x200B;<strong>XXS</strong>&#x200B;脚本漏洞作为演示

我们创建一个view函数来返回模型对象的字段

[En]

We create a view function to return the fields of the model object

  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')
]

这个视图函数只返回了两个字段,但已经足够用来演示​ &#x200B;XXS&#x653B;&#x51FB;&#x200B;​原理了

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

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

原理

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

  1. 创建一名攻击者用户,在 个人信息填上攻击的代码
  2. 跳转到该页面( 可以看到直接显示&#x200B;<strong>cookie&#x4FE1;&#x606F;</strong>&#x200B;😱😱)
  3. 可以看到,攻击者可以通过此方法得到cookie ,还可以对得到用户的更多信息,以及增删改查操作, 这是很危险的!🤯

三、修复漏洞🔨

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

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

&#x200B;html.escape()&#x200B;​源码

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('"', """)
s = s.replace('\'', "'")
return s

我们将此方法添加到前面的视图函数中

[En]

We add this method to the previous view function

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"))

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

[En]

You can see that changing the script at this time will not run 🎉

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

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

🤞在这里,如果你有任何问题,🤞🎩欢迎博客作者的私信。哦,博主们会尽力为你答疑解惑的!如果🎩🥳对你有帮助,那么你的赞扬就是对博客作者最大的支持!🥳<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>🤞 is here, if you have any questions, 🤞 🎩 welcome private messages from bloggers. Oh, bloggers will try their best to answer questions for you! If 🎩 🥳 is helpful to you, your praise is the greatest support for bloggers! 🥳</font>*</details>

Original: https://blog.51cto.com/u_15691039/5637348
Author: 计算机魔术师
Title: 【Django | 安全防护】防止XSS跨站脚本攻击

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500226/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球