系统地讲解Django开发的基础知识, 高阶知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-django从入门到精通》。
11.1.1 XSS简介
XSS的全称是"Cross Site Scripting",翻译过来即为跨站脚本攻击。Cross Site Scripting的简写形式之所以不是CSS,是因为Cascading Style Sheets(层叠样式表)的简写也为CSS,为不引起混淆,才将Cross Site Scripting的简写形式改为XSS。XSS攻击,是指攻击者通过某种手段将脚本嵌入到站点页面中,当正常用户访问该页面时,页面会执行该恶意代码,从而达到攻击用户的目的。
11.1.2 模拟XSS攻击
实现XSS攻击的核心是将代码嵌入到网页中。现在读者通过以下步骤来进行XSS攻击的模拟:
(1) 在模板目录创建评论页面
在templates目录中创建comment.html,该页面用来提交用户的评论,comment.html中的代码:
<form action="{% url 'comment' %}" method = 'post'> {% csrf_token %} <div> <input type="text" name="comment" placeholder="请输入评论内容" style="width:250px" /> </div> <div> <input type="submit" value = "提交"/> </div> <div> <h3>用户的评论内容</h3> {% autoescape off %} <p>{{comment}}</p> {% endautoescape %} </div> </form>
(2) 定义评论视图及路由
在views.py中定义Comment视图,该视图用来将用户的评论内容与评论页进行渲染:
class Comment(View): def post(self, request): """ 通过查询form表单中的name,可以获取用户在表单中的输入值 """ comment = request.POST.get('comment', '') # 直接将用户的输入传递给模板comment.html return render(request, "comment.html",{"comment": comment}) def get(self, request): # 如果为get请求,则直接对注册页面进行渲染 return render(request, "comment.html")
打开urls.py,定义评论页面url与Comment视图的路由:
urlpatterns = [ # 定义评论页的url与视图的路由 path('comment/', blog.Comment.as_view(), name="comment"), ]
(3) 在浏览器中进行测试
我们先在登录页面中进行登录,Login视图在对用户的登录请求处理完毕以后,会创建一个会话cookie。cookie中包含了用户名等信息。
登录成功以后,我们在评论页面输入恶意脚本代码:<script>alert(document.cookie)</script>
点击提交后,页面弹出了当前用户的cookie信息:
为便于演示,笔者有意将获取到的cookie信息在页面中进行弹出。 实际情况中,攻击者的注入脚本会更加隐蔽和复杂,比如将脚本嵌入到url中,或在窃取到用户的登录cookie以后,脚本自动将cookie信息发送给服务器进行保存,以进行下一步的攻击。
11.1.3 防御XSS攻击
XSS攻击的核心是脚本注入,防范XSS攻击的方法无非是将用户的输入进行安全性处理。最常见的防御手法是将输入中的特殊脚本标签进行转义。打开模板文件comment.html,找到对评论内容进行渲染的下面几行代码:
{% autoescape off %} <p>{{comment}}</p> {% endautoescape %}
django中的模板会自动对内容中的特殊标签进行转义,在模板中加入{% authoescape off %}标签以后,django会关闭自动转义,将标签块内的内容原样输出,这样才导致页面加载时,执行了用户输入中的javascript代码。现在我们注释掉模板中的{% authoescape off %}标签,对用户输入进行自动转义:
{# {% autoescape off %} #} <p>{{comment}}</p> {# {% endautoescape %} #}
然后继续在浏览器中进行测试:
在页面中输入脚本代码:<script>alert(document.cookie)</script> 并提交以后,django对输入自动进行转义,不再执行用户输入中的恶意代码。
在django的模板中,还可以通过escape过滤器来对模板变量进行转义。在确定不需要对输入转义时,可使用safe过滤器来标识当前的输入是安全的。
关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。
小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。