Django 的安全性


本文整理自网络,侵删。

跨站点脚本(XSS)保护

XSS攻击使用户可以将客户端脚本注入其他用户的浏览器中。通常,这是通过将恶意脚本存储在数据库中进行检索并将其显示给其他用户,或者通过使用户单击链接而导致攻击者的JavaScript由用户的浏览器执行来实现的。但是,只要未在包含在页面中之前对数据进行足够的清理,XSS攻击就可能源自任何不受信任的数据源,例如cookie或Web服务。

使用Django模板可以保护您免受大多数XSS攻击。但是,重要的是要了解其提供的保护及其限制。

Django模板会转义特定字符 ,这对于HTML来说尤其危险。尽管这可以保护用户免受大多数恶意输入的侵害,但这并不是绝对安全的。例如,它将不会保护以下内容:

<style class={{ var }}>...</style>

如果var将设置为,则可能导致未经授权的JavaScript执行,具体取决于浏览器如何呈现不完美的HTML。(引用属性值将解决这种情况。)'class1 onmouseover=javascript:func()'

is_safe与自定义模板标签,safe模板标签一起使用mark_safe以及关闭自动转义功能时,请务必特别小心。

此外,如果您使用模板系统输出HTML以外的内容,则可能会有完全分开的字符和单词需要转义。

在数据库中存储HTML时,也应特别小心,尤其是在检索和显示HTML时。

跨站点请求伪造(CSRF)保护

CSRF攻击允许恶意用户使用另一用户的凭据执行操作,而无需该用户的知识或同意。

Django具有针对大多数CSRF攻击的内置保护,只要您在适当的地方启用和使用它即可。但是,与任何缓解技术一样,存在局限性。例如,可以全局禁用或针对特定视图禁用CSRF模块。仅当您知道自己在做什么时,才应该这样做。如果您的站点具有您无法控制的子域,则还有其他限制。

CSRF保护通过检查每个POST请求中的秘密来起作用。这样可以确保恶意用户无法将表单POST“重播”到您的网站,而让另一个登录用户无意间提交该表单。恶意用户必须知道特定于用户的秘密(使用cookie)。

与HTTPS一起部署时, CsrfViewMiddleware将检查HTTP引用标头是否设置为同一来源(包括子域和端口)上的URL。因为HTTPS提供了额外的安全性,所以必须通过转发不安全的连接请求并对支持的浏览器使用HSTS来确保连接使用HTTPS可用的连接。

csrf_exempt除非绝对必要,否则请小心用装饰器标记视图。

SQL注入防护

SQL注入是一种攻击,恶意用户能够在数据库上执行任意SQL代码。这可能导致记录被删除或数据泄漏。

由于Django的查询集是使用查询参数化构造的,因此可以防止SQL注入。查询的SQL代码是与查询的参数分开定义的。由于参数可能是用户提供的,因此是不安全的,因此底层数据库驱动程序会对其进行转义。

Django还使开发人员可以编写原始查询或执行自定义sql。这些功能应谨慎使用,并且您应始终小心谨慎地转义用户可以控制的任何参数。此外,使用extra() 和时应格外小心RawSQL。

点击劫持保护

点击劫持是一种攻击,其中恶意站点将另一个站点包装在框架中。这种攻击可能导致毫无戒心的用户被诱骗在目标站点上执行意外的操作。

Django包含clickjacking保护,其形式为 在支持的浏览器中可以防止网站在框架内呈现。可以基于每个视图禁用保护或配置发送的确切报头值。X-Frame-Options middleware

强烈建议将中间件用于任何不需要第三方站点将其页面包装在框架中的站点,或者只需要允许站点的一小部分使用该中间件。

SSL / HTTPS

在HTTPS后面部署站点对于安全性而言总是更好的选择。否则,恶意网络用户可能会嗅探身份验证凭据或客户端与服务器之间传输的任何其他信息,并且在某些情况下(活动的网络攻击者)可能会更改沿任一方向发送的数据。

如果您想要HTTPS提供的保护并已在服务器上启用了该保护,则可能需要执行一些其他步骤:

  • 如有必要,请设置SECURE_PROXY_SSL_HEADER,以确保您已充分了解其中的警告。否则可能会导致CSRF漏洞,而如果不正确做则也很危险!
  • 设置SECURE_SSL_REDIRECT为True,以便将通过HTTP的请求重定向到HTTPS。请注意下的警告SECURE_PROXY_SSL_HEADER。对于反向代理,配置主Web服务器以重定向到HTTPS可能更容易或更安全。
  • 使用“安全” cookie。如果浏览器最初是通过HTTP连接(这是大多数浏览器的默认设置),则可能会泄漏现有的Cookie。因此,您应将SESSION_COOKIE_SECURE和 CSRF_COOKIE_SECURE设置设置为True。这指示浏览器仅通过HTTPS连接发送这些cookie。请注意,这将意味着会话将无法通过HTTP进行工作,并且CSRF保护将阻止通过HTTP接受任何POST数据(如果您将所有HTTP流量都重定向到HTTPS,这将很好)。
  • 使用HTTP严格传输安全性(HSTS)HSTS是一个HTTP标头,它通知浏览器将来与特定站点的所有连接都应始终使用HTTPS。结合通过HTTP将请求重定向到HTTPS,这将确保只要发生一次成功的连接,连接就始终可以享受SSL的额外安全性。HSTS既可以与配置SECURE_HSTS_SECONDS, SECURE_HSTS_INCLUDE_SUBDOMAINS以及SECURE_HSTS_PRELOAD,或在Web服务器上。

主机头验证

Host在某些情况下,Django使用客户端提供的标头构造URL。尽管清除了这些值以防止跨站点脚本攻击,但伪造的Host值可用于跨站点请求伪造,缓存中毒攻击和电子邮件中的中毒链接。

阅读剩余部分

相关阅读 >>

Django 简介

Django 安装

使用wsgi进行部署

基于类的视图简介

使用基于类的视图进行表单处理

Django 的性能与优化

基于类的视图

Django 创建第一个项目

Django的缓存框架

部署清单

更多相关阅读请进入《Django》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...