🤵♂️ 个人主页: @计算机魔术师
👨💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。
该文章收录专栏
✨[---【Django | 项目开发】从入门到上线 专栏---](https://blog.csdn.net/weixin_66526635/category_11905572.html)✨
@toc
创建一个 XXS
脚本漏洞作为演示
我们创建视图函数返回模型对象的字段
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
进行发送信息,删除用户等操作
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('"', """)
s = s.replace('\'', "'")
return s
我们将之前的视图函数添加该方法
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
渲染模板,或者使用我们的通用类视图。
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。