Django_博客_XSS 攻击防范

时间:2023-03-10 02:43:12
Django_博客_XSS 攻击防范

背景:

  博客项目中用户后台添加文章时,若通过富文本编辑器输入 标签内容或者 js 指令会导致文章排版错乱,甚至进行XSS攻击

攻击现象:

  文本内容输入 js 指令

Django_博客_XSS 攻击防范

  文章描述时正确显示其文本内容

Django_博客_XSS 攻击防范

  但在打开页面的时候标签内容被浏览器读取从而执行js 指令,然后才正确进行其他操作

Django_博客_XSS 攻击防范

Django_博客_XSS 攻击防范

 防范方式

  将文本内容在保存数据库之前就要进行一次筛选,

  去除 script 标签. 当然可以去除很多其他标签比如 link 标签之类的

  为了操纵简便, 这其中需要用到 bs 模块

 def add_article(request):
if request.method == "POST":
title = request.POST.get("title")
article_content = request.POST.get("article_content")
# 先拿到当前的 user
user_obj = request.user
# 截取文章的描述信息
# article_desc = article_content[0:150]
# 如果这么截取就会把标签也截取了,不闭合会导致页面错乱.我们只需要截取文本内容
# 目前只能用正则来处理,太麻烦了. 用 BeautifulSoup 处理会方便很多
from bs4 import BeautifulSoup
bs = BeautifulSoup(article_content,"html.parser")
article_desc = bs.text[0:150]+"..." # 为了防止 xss 攻击 需要对内容进行过滤 并 删除
for tag in bs.find_all():
if tag.name in ["script","link"]:
# decompose 方法可以将被选中的标签移除并彻底删除
tag.decompose()
# 弄一个文章对象出来
article_obj = models.Article.objects.create(user=user_obj,title=title,desc=article_desc)
# 弄一个文章描述对象出来
models.ArticleDetail.objects.create(content=str(bs),article=article_obj)
return HttpResponse("添加成功")
return render(request, "add_article.html")