背景:
博客项目中用户后台添加文章时,若通过富文本编辑器输入 标签内容或者 js 指令会导致文章排版错乱,甚至进行XSS攻击
攻击现象:
文本内容输入 js 指令
文章描述时正确显示其文本内容
但在打开页面的时候标签内容被浏览器读取从而执行js 指令,然后才正确进行其他操作
防范方式
将文本内容在保存数据库之前就要进行一次筛选,
去除 script 标签. 当然可以去除很多其他标签比如 link 标签之类的
为了操纵简便, 这其中需要用到 bs 模块
1 def add_article(request): 2 if request.method == "POST": 3 title = request.POST.get("title") 4 article_content = request.POST.get("article_content") 5 # 先拿到当前的 user 6 user_obj = request.user 7 # 截取文章的描述信息 8 # article_desc = article_content[0:150] 9 # 如果这么截取就会把标签也截取了,不闭合会导致页面错乱.我们只需要截取文本内容 10 # 目前只能用正则来处理,太麻烦了. 用 BeautifulSoup 处理会方便很多 11 from bs4 import BeautifulSoup 12 bs = BeautifulSoup(article_content,"html.parser") 13 article_desc = bs.text[0:150]+"..."
14 # 为了防止 xss 攻击 需要对内容进行过滤 并 删除 15 for tag in bs.find_all(): 16 if tag.name in ["script","link"]: 17 # decompose 方法可以将被选中的标签移除并彻底删除 18 tag.decompose()
19 # 弄一个文章对象出来 20 article_obj = models.Article.objects.create(user=user_obj,title=title,desc=article_desc) 21 # 弄一个文章描述对象出来 22 models.ArticleDetail.objects.create(content=str(bs),article=article_obj) 23 return HttpResponse("添加成功") 24 return render(request, "add_article.html")