如何为您的 Django 网站添加安全功能?
通过 Web 进行通信是通过 HTTP 连接进行的,而且大多数情况下,您永远不知道另一端是谁。它可能是您的用户之一,但也可能是一个恶意黑客,正在寻找可乘之机。来自浏览器的任何数据,无论其来源如何,都应谨慎处理并检查是否存在威胁。这包括来自 Web 表单的数据以及来自 HTTP 标头、cookie 和其他请求元数据的信息。
作为 Web 开发人员,我们有责任尽我们所能来对抗这些黑暗势力。每个 Web 开发人员都需要将安全视为 Web 编程的基本方面。不幸的是,事实证明实施安全措施非常困难。
攻击者只需要找到一个漏洞,但防御者必须防御每一个漏洞。Django 试图减轻这种困难。它旨在自动保护您免受许多新手和经验丰富的 Web 开发人员常犯的安全错误的影响。
尽管如此,了解这些问题是什么、Django 如何保护您以及最重要的是您可以采取哪些措施来使您的代码更安全仍然很重要。
一些对安全构成威胁的攻击包括 SQL 注入、跨站脚本 (XSS)、跨站请求伪造 (CSRF) 和点击劫持保护。
SQL 注入
SQL 注入是一种常见的漏洞,攻击者可以通过修改 Web 页面参数(如 GET/POST 数据或 URL)来将任意 SQL 代码片段注入到一个简单的 Web 应用程序的数据库中。这可能导致记录被删除或数据泄露。毫无疑问,这是最致命且不幸的是最常见的漏洞之一。
示例
假设,您有一个博客,其中有一个电子邮件列表,您每周都会向该列表发送时事通讯。随着时间的推移,您的电子邮件列表增长了很多,包含了许多电子邮件。如果您想阻止访问整个联系人列表,则会提示用户输入他们的用户名和电子邮件地址。
使用提供的用户名,您将访问电子邮件地址,这样做会使您的数据面临风险,因为攻击者可以使用用户名注入 SQL 查询来收集、更新或删除您的电子邮件地址列表。
解决方案
解决此问题的方法是永远不要信任并直接使用用户输入的数据。在将其直接传递到 SQL 时始终对其进行转义。开发人员无需担心硬编码,Django 数据库 API 提供了保护您的网站免受此攻击的方法。它会根据您正在使用的数据库服务器(如 PostgreSQL 或 MySQL)的引用约定自动转义所有特殊的 SQL 参数。
跨站脚本
在将用户提交的文本呈现到 HTML 中之前未能适当地对其进行转义的 Web 应用程序容易受到跨站脚本 (XSS) 的攻击。攻击者可以使用此方法将任意 HTML 注入到您的 Web 页面中,通常以 <script> 元素的形式。
为了防止跨站脚本,开发人员必须转义用户输入的数据,而不是直接使用它。
点击劫持
点击劫持是一种攻击,其中恶意网站使用框架包含另一个网站。由于这种攻击,不知情的用户可能会被诱骗在目标网站上执行不希望的操作。
Django 以 X-Frame-Options 中间件的形式提供了点击劫持预防功能,该中间件可以防止网站在兼容浏览器中的框架内呈现。