Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第十一章:django安全 > 11.1节:XSS防护

11.1节:XSS防护

薯条老师 2020-10-08 08:39:28 234915 0

编辑 收藏

系统地讲解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中包含了用户名等信息。

QU5IZ_@)~6_8}V@V${G}P3M.png 

 

登录成功以后,我们在评论页面输入恶意脚本代码:<script>alert(document.cookie)</script>

6DE3MJ62]W[4HVINFGGJ([S.png 

点击提交后,页面弹出了当前用户的cookie信息:

S2G5ED@(61MQLHKRD]QRWA1.png 

为便于演示,笔者有意将获取到的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 %} #}

然后继续在浏览器中进行测试:

C3B2$G]G7@(TG57V3YJ9M5W.png 

在页面中输入脚本代码:<script>alert(document.cookie)</script> 并提交以后,django对输入自动进行转义,不再执行用户输入中的恶意代码。

在django的模板中,还可以通过escape过滤器来对模板变量进行转义。在确定不需要对输入转义时,可使用safe过滤器来标识当前的输入是安全的。

关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。

小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。


欢迎 发表评论: