保护用户数据是任何网站设计的重要部分。我们之前在文章web安全中解释了一些更常见的安全威胁--本文提供了Django的内置保护如何处理这些威胁的实际演示。
概述节web安全 主題提供一个概述,说明了网站安全对于服务器端设计的意义,以及以及一些需要应对的常见威胁。本文中包含一个关键的概念:如果网站信任任何来自浏览器的数据,几乎所有的攻击方法都会成功。 重要提示: 切记,对于网站安全来说最重要一点就是“永远不要相信浏览器端提交的数据”。 这些数据包括使用 对Django用户来说,好消息是Django框架已经处理了大量的常见威胁。请阅读Django官方文档中的"Security in Django"部分来了解Django的安全细节,以及如何确保基于Django的网站的安全。 常见威胁及保护节在本文中,我们将使用前面章节中的“本地图书馆”项目作为示范来演示一些Django的安全特性。 跨站脚本 (XSS)节XSS(英语:Cross site scripting,通常简称:XSS)是指一类恶意攻击者将代码通过网站注入到其他用户浏览器中的攻击方式。一般攻击者会把恶意代码作为普通数据放入到网站数据库中,这样其他用户在获取和展示数据的过程中就会受到攻击。此外,攻击者还可以通过引诱用户点击某些链接来执行恶意的JavaScript代码。 Django的模板系统可以帮您抵挡大部分的XSS攻击,实现的方式在于转义对于HTML来说比较“危险”的特殊字符(可参考官方文档:escaping specific characters)。现在,我们用Django Tutorial Part 9: Working with forms 这一章中的“创建作者”表单来做个演示,尝试向我们的本地图书馆网站注入一些JavaScript脚本。
如果你有兴趣阅读下页面的HTML源码,则会发现危险的字符已被转义成了无害的字符(例如:
Django的模板系统可以帮助抵御大部分的XSS攻击。当然,XSS保护功能也可以被关闭,而且XSS保护一般对非用户输入的内容不会自动进行防护(例如表单中字段的 XSS攻击也可能来自于其他不可信的数据来源,例如cookies,Web服务或上传的文件(实际上只要是未经清洗的数据直接展示出来都会有被攻击的可能)。如果你要显示这些不可信来源的数据,切记一定要自己做好数据清洗的工作。 防护跨站请求伪造 (CSRF) 节CSRF(英语:Cross-site request forgery,通常简称:CSRF或XSRF)攻击可以让恶意攻击者在用户不知情的情况下,使用用户的身份来进行系统操作。举个例子,现在有一名黑客想要在我们的本地图书馆中添加一些作者信息。 注意:这个示例里面的黑客没有考虑对钱下手。而现实生活中的黑客则极有可能会产生更加危险的操作(例如,把钱转入他们自己的账户中等等)。 为了实现这个目的,黑客可以创建一个类似于下面示例的HTML文件,这个文件包含了一个创建作者的表单(类似我们在之前章节中用过的),并且一旦加载完毕就会立即进行提交。随后黑客可以将这个文件发送至所有的图书管理员,并且引诱他们打开这个文件(文件中真的没有啥有害的信息)。如果任何一个已登录的图书管理员不慎打开了这个文件,那么文件中的表单就会利用图书管理员的身份来提交,随后就会创建出一个新的作者来。
运行Django开发服务器,然后使用超级管理员账号进行登录。将上面的代码贴到一个文件中,并在浏览器中打开这个文件,随后你就会看到一个CSRF错误,这是因为Django的安全机制防护了此类的攻击。 在表单定义的时候加入
Django生成这个用户/浏览器关联key的目的在于可以据此来拒绝那些不包含这个key的表单请求,也可以拒绝那些包含了错误了用户/浏览器关联key的表单请求。 有了这种保护机制后,攻击者要发起攻击就需要找到目标用户的CSRF key。通过广撒网给所有的图书管理员发送恶意代码文件的方式也很难奏效,因为CSRF key是和浏览器相关联的。 Django的CSRF防御默认是开启的。一定要在表单的位置使用 其他防护措施节Django还提供了很多其他形式的防护措施 (大部分不是很容易进行演示):
还有很多其他的安全措施及使用这些安全措施的注意事项我们没有提到。我们这里仅仅提供了Django安全措施的一个概览,更多的信息请参阅Django官方安全文档。 总结节Django具备有效的防护措施,以对抗一些常見的威胁,包括 XSS 和 CSRF 攻击。本文中,我们已经使用本地图书馆网站来了演示Django如何处理一些特定的攻击。我们也提供了关于其它保护措施的简单概述。 但这仅仅是对网站安全的一个入门。我们强烈建议您阅读 Django中的安全 以获得更加深入的理解。 本Django教程的下一步,也是最后一步,是完成 评估任务。 参阅节
In this module节
|
|
来自: 宁静致远oj1kn5 > 《locallibrary》