• 流行的 Web 框架安全性比较


    不乏 Web 开发语言和框架。开发人员在选择使用哪个框架时需要考虑许多因素。

    安全性是这些因素之一,尤其是在为业务开发关键应用程序时。在这篇文章中,我们将讨论五个流行的框架如何解决常见的安全问题。

    我们将讨论这些框架如何达到 2017 年 OWASP 前 10 名 (PDF)。OWASP 长期以来一直是安全 Web 开发的标准。因此,这是衡量所有这些选择的良好基准。

    我们将重点介绍如何在每个框架中轻松缓解前 10 大风险。还将讨论减轻风险方面的任何困难。这不是对每个 Top 10 风险的详尽调查,而是对每个框架如何解决常见安全漏洞的总体概述。

    最后,将对每个框架与前 10 名的对比情况进行总体评级。

    五个框架

    选择的五个框架是 Python 的 Django、Node.js、Ruby on Rails、ASP.NET Core 和 Java Spring。之所以选择这些框架,是因为它们在开发社区中很受欢迎,因此它们很可能成为新建 Web 开发项目的候选者。

    首先,我们有 Django。

    Django

    Django 是大多数 Python 用户选择的 Web 框架。Django 的网站将速度、可扩展性和安全性列为其主要特性。

    让我们看看它关于安全性的说法有多真实。

    Django 亮点

    Django 似乎非常重视安全性。让我们看一些例子。

    SQL 注入 由 Django 的 Queryset API 处理。它不仅从开发人员那里抽象出 SQL 查询,而且自动参数化查询以防止注入。

    跨站脚本 (XSS) 是 Django 默认处理的另一种常见攻击,只要您使用 Django 的模板来构建用户界面。 模板 并非完全万无一失(我们将在稍后讨论),但它们确实会自动转义 XSS 攻击中使用的大多数字符。

    Django 在用户身份验证和授权方面做得很好 。Django 身份验证系统为开发人员提供了管理系统用户和为每个用户定义权限的方法。

    Django 提供了创建用户组并将权限应用到组以便于管理的能力。默认情况下,密码使用基于密码的密钥派生函数 (PBKDF2)进行哈希处理  ,因此您的密码将得到很好的保护。密码散列也是可配置的,允许开发人员在必要时增加迭代次数。

    Django 默认也提供 CSRF 保护。您所要做的就是在任何对内部 URL 执行 POST 的页面的表单元素中添加“csrf_token”标签。

    Django 低光

    就安全性而言,Django 是一个可靠的框架。但是,有几个小问题。

    首先,即使查询集默认阻止 SQL 注入,仍然存在允许开发人员创建原始 SQL 查询的函数。extra() 函数 和 RawSQL  可用于创建 SQL 查询并且容易受到注入攻击。在使用它之前,您可以使用 params 参数来转义用户输入。然而,这仍然是在 Django 中构建查询的一种危险方式。

    如前所述,模板提供的 XSS 防护并非 100%。使用 safe() 和 mark_safe() 函数可以告诉 Django 一个字符串已经被转义并且可以安全渲染。这个命名有点混乱,因为开发人员可能认为这个函数使字符串安全。如果关闭自动转义并使用 safe() 或 mark_safe(),则可能导致代码库中存在 XSS 漏洞。

    即使有一些问题,这些都是极端情况,当然不应该出现在大多数应用程序中。

    Django 的一个令人担忧的问题当然是子域的会话管理。站点内的子域能够在客户端上为整个域设置 cookie。这可能导致会话固定攻击。 

    Django 日志记录默认值 在它们的工作方式上可能会令人困惑。确保您没有使用 DEBUG 级别的日志记录将应用程序投入生产。这将导致向客户端返回详细的错误消息,坏人可以使用该信息来协助攻击。

    Django 最终评分:4.5/5

    Django 已明确将安全性作为其实施的重点。Django 处理了许多常见的安全问题,开发人员使用它应该会感觉很好。

    Node.js

    Node.js 是一个非常流行的 JavaScript 应用程序服务器端框架。它允许开发人员快速启动和运行应用程序,并提供出色的扩展能力。

    NodeJS 亮点

    Node 的开发理念与其他框架不同。Node 是极简主义的,这意味着它只附带运行 Web 服务器所需的最低限度的东西。

    Node 的大多数功能都以模块的形式出现,根据需要添加到系统中。这些模块由节点包管理器 (NPM) 托管和管理。这种开发模式具有有趣的安全后果。

    默认情况下,Node 确实附带了一些安全部件。例如,它 具有 使用 HTTPS 启动 Web 应用程序的能力,以保护您的数据不被暴露。还有一个强大的 加密库 ,因此您可以保护您的静态数据。

    极简模型的结果是依赖于强大的贡献者社区来提供良好的安全功能。

    例如,许多在 Node 上工作的 Web 开发框架必须处理会话管理和注入漏洞。 ExpressJS 是一个流行的 Node 网络框架,但它并不能处理所有事情。您将需要像 cookie-session、  helmet和 mongoose这样的库 来防止几个 OWASP Top 10 风险,例如敏感数据暴露、身份验证损坏和 NoSQL 注入。

    从好的方面来说,Node 社区很强大。有许多编写良好的模块可供安全功能开发人员明智地使用。

    NodeJS 弱点

    Node 的开发方法可以被视为优势和劣势。

    由于有这么多不同的开发人员编写模块并将它们托管在 NPM 上,因此存在将恶意模块引入您的代码的风险。

    例如,查看 演示此问题的节点安全演示文稿 (PDF 链接)中的这张幻灯片

    攻击者使用类似名称的 NPM 模块对开发人员进行网络钓鱼攻击。这些模块看起来像真实的东西,但里面有恶意代码。

    使用 Node 时,请务必做好功课并使用经过整个社区审查的模块。

    Node.js 最终评分:3/5

    Node 有很多很棒的功能。但是,它依赖于开发人员社区来创建关键安全功能可能导致不安全的代码或彻底的攻击。

    Node 的安全性有很多强大的选择,但请确保在依赖任何其他人的代码之前做好功课。

    Rails

    Ruby on Rails 是 Ruby 开发人员首选的 Web 框架。它有一个强大的社区,旨在使 Web 开发快速而简单。

    Rails 亮点

    Rails 提供了一些开箱即用的可靠保护。默认的 Rails 对象关系映射器 (ORM)  Active Record可以很好地处理 SQL 注入。

    从 Rails 3.0 版开始,XSS 也被默认阻止。所有字符串文本在发送到浏览器之前都会被转义。

    默认情况下, Rails 包含适当的安全标头 。这可以保护应用程序免受点击劫持,这是一个很好的默认设置,因为点击劫持很容易被忽略。

    Ruby 使用“gems”来提供附加功能。一个名为 Devise 的 gem 为开发人员提供了强大的身份验证功能。Devise 允许您定义应用程序中的哪些路由需要身份验证。

    另一个 gem  Pundit定义了 REST 资源的资源级访问控制。这可以防止不安全的直接对象引用,这是破坏访问控制的一个组成部分。

    Rails 低光

    Rails 对 gem 的某些安全功能的依赖可以被视为一个缺点。我提到的宝石是众所周知的,并且经过 OWASP 之类的审查,因此您不必太担心。

    所以同样的建议也适用于 Node.js。确保你做好功课。

    实际 Rails 框架的一个明确的安全问题是它对用户会话的默认处理。默认情况下,Rails 使用基于 cookie 的会话。会话不会在服务器上过期,从而使您的应用程序对重放攻击保持开放。

    为了解决这个问题,您需要更改 Rails 配置以使用数据库来存储会话。您可以通过更改以下配置来做到这一点:

    1
    Project::Application.config.session_store :active_record_store

    可以在 此处找到 有关如何正确保护 Rails 的更多信息。

    Rails 最终评分:4/5

    Rails 有一些缺陷,但在安全默认设置方面仍然是一个可靠的框架。如果框架没有,有几个著名的 gem 可以为您提供所需的东西。

    ASP.Net Core

    ASP.NET Core 是最新的孩子。Microsoft 最近发布的 ASP.NET Core 旨在通过提供用于构建云优先 Web 应用程序的跨平台、高性能、开源框架将 .NET 开发带入未来。

    ASP.NET Core 亮点

    ASP.NET Core MVC 使用强大的 Razor 视图引擎将视图呈现给浏览器。Razor 视图引擎默认对 HTML 进行编码,从而防止 XSS 攻击。

    实体框架(ORM 或 .NET 开发人员的选择)开箱即用地处理 SQL 注入。开发人员用代码编写他们的查询,并且默认情况下将生成的 SQL 参数化。

    身份验证和授权以ASP.NET Identity的形式内置于 ASP.NET Core 中 。Identity 提供了一个强大的身份验证系统,可以将用户名和密码用于数据库或 Facebook、Google 等外部提供商。

    内置授权库提供了基于用户角色和属性限制访问的能力。可以对单个数据以及控制器操作进行限制。开发人员甚至可以 使用注释 轻松定义哪些角色可以访问哪些方法和操作。

    ASP.NET Core 的一个特别令人印象深刻的特性是 数据保护 API。该 API 为开发人员提供了一个用于加密静态数据的出色抽象。您只需实例化一个数据保护提供程序的实例并要求它保护您的数据。它默认使用 AES-256,框架为您处理密钥轮换和存储。它做正确的事情并使其变得容易。

    ASP.NET Core 弱点

    老实说,这里没有多少低光可供选择。ASP.NET Core 的构建从一开始就考虑到了安全性。它为开发人员提供了出色的默认设置和强大的工具,以帮助防止最常见的漏洞。

    OWASP 的A8: Insecure Deserialization是在 .NET 世界中可能让您陷入困境的一个漏洞 。大多数 JSON 解析库都是由第三方编写的。许多人容易受到不安全的 JSON 反序列化攻击。观看此视频,了解如何在 JSON 库中使用不安全的反序列化来执行代码。

    ASP.NET Core 最终评分:4.5/5

    合理的默认设置以及对开发人员有用的工具使 ASP.NET Core 成为您的 Web 应用程序的最佳选择。

    Java Spring

    Spring 是一个用于构建应用程序的 Java 框架。它为构建 Web 应用程序提供了强大的工具,是企业中的热门选择。

    它有几种不同的风格,例如用于微服务的 Spring Boot 和用于更传统 Web 开发的 Spring MVC。

    Java 春季亮点

    Spring 的一个主要亮点是 Spring Security,这是一个用于 Java Spring 应用程序的身份验证和授权框架。Spring Security 是高度可定制的,是许多企业应用程序的支柱。

    Spring Vault 是另一个 Spring 框架,可为您的机密提供强大的存储和管理。机密可以包括用于访问其他应用程序或服务的加密密钥或用户名和密码。

    XSS 由 Spring 的原生 HtmlUtils.htmlEscape 方法处理。此方法将转义返回到 UI 的字符串。您必须确保调用此方法,但它是由框架为您编写的,供您使用。

    Java Spring 弱点

    与其他框架相比,Spring 非常成熟。与 ASP.NET Core 类似,Spring 在 OWASP Top 10 指出的常见安全问题方面几乎没有缺陷。

    SQL 注入是 Spring 最大的问题,因为您必须 使用自定义代码参数化查询 或使用单独的 ORM,例如 Hibernate。Hibernate 在很大程度上保护了您,但仍然容易 通过其 HQL 语言进行注入

    Java Spring 最终评分:4/5

    Java Spring 是一个成熟的框架,具有许多针对常见安全问题的内置防御措施。有些保护不是自动的,所以会停靠一个点。但是,对于 Java 开发项目,您不会后悔使用 Spring 作为您的框架。

    框架是否有所作为?

    您可能已经注意到所有这些框架的评级趋势。回去快速浏览一下……

    尽管存在差异,但大多数收视率非常接近或相同。

    事实上,大多数成熟的开发框架都有必要的部分来保护应用程序免受最常见的漏洞的影响。那么,为什么我们经常看到这些问题足以保证在 OWASP 前 10 名中占有一席之地?

    开发人员可能会陷入“框架会保护我”的心态。当开发人员偶然或故意绕过框架的默认安全功能时,这会导致问题。当这种情况发生时,开发人员将负责他们可能认为理所当然的安全功能。这说明了一个重要的事实。

    不是使用的 Web 框架,而是使用它的开发人员在安全性方面有所不同。 

    开发人员应接受有关如何正确使用框架的适当培训。本文中的大多数链接都指向产品文档。信息可用。

    一旦开发人员了解什么是可用的,实践将帮助开发人员每天思考安全问题。  如果您想要切实可行的实践安全培训,请联系我们。

    大多数开发人员和公司对构建应用程序有一种偏好的语言。无论您使用哪种语言,都要指导开发人员如何使用他们可用的工具来确保安全。

    只有这样你才会知道你已经进入了前 10 名。

  • 相关阅读:
    centos下安装elasticsearch-head
    Ubuntu 的Linux内核更换操作流程
    Java Map转换工具类
    cgroup driver: cgroupfs还是systemd
    服务器基础知识:raid卡有什么优势?
    数据结构之链表
    故障治理:如何进行故障复盘
    linux基本指令(二)
    SpringData jpa 详解
    淘女郎买家秀API接口
  • 原文地址:https://blog.csdn.net/allway2/article/details/126177810