Segurança Web
Arquitetura de Software
OWASP
Autenticação
LGPD

Web 应用程序安全性:为初学者解释的架构

网络安全不是您安装的产品。这是从一开始就设计系统的一种方法。

那些开始进行网络开发的人倾向于将安全性想象为最后添加的东西:防病毒软件、防火墙、插件。这是一个令人舒服的形象,但完全错误。安全性并不是成品的一部分,而是产品构建方式的属性。

差异是根本性的。 Web 应用程序就像一座房子。如果墙壁是纸板且窗户无法关闭,那么在前门安装昂贵的锁并不能保证房屋的安全。安全性来自于结构,而不是来自粘在顶部的配件。

本文在不假设先验知识的情况下解释了 Web 应用程序的架构如何决定其安全性。它适合那些想要从一开始就了解正确基础知识的初学者,然后再养成以后要改掉的代价高昂的习惯。

Web 应用程序的剖析

谈安全,首先要了解各方。简而言之,Web 应用程序具有三层,每一层在安全方面都有其作用。

客户端是在用户浏览器中运行的内容:屏幕、按钮、用户看到和触摸到的内容。 服务器是真正的逻辑发生的地方,远离用户的眼睛。 [数据库0就是存储信息的地方。

在这些层之间,数据通过网络传输。这个简单的结构已经包含了对于初学者来说最重要的安全课程,这就是我们开始的地方。

黄金法则:永远不要相信客户

如果您只记得本文中的一个原则,请记住这一点:用户浏览器中运行的所有内容都在用户的控制之下,因此可以进行操作。客户是敌人的领土。

初学者会犯对客户端进行安全检查的错误。他们在浏览器中验证表单,对没有权限的人隐藏按钮,检查屏幕上的值是否有效。所有这些对于用户体验来说都是有好处的,但对于安全性来说却毫无用处。攻击者只需忽略屏幕并直接与服务器对话,发送他想要的任何内容。

架构结果很明确:每个安全决策都需要在服务器上做出。数据验证、权限检查、业务规则,所有这些都位于用户无法访问的服务器上。客户建议;服务器决定。这种分离是网络安全的支柱。

两大支柱:你是谁以及你能做什么

实际上,所有应用程序安全性都基于初学者容易混淆的两个概念。

身份验证证明您是谁。这是登录名:用户名和密码,也许是第二个因素。它回答了“你真的是你所说的那个人吗?”这个问题。

授权定义了一旦确定您可以做什么。它回答了“你可以这样做吗?”的问题。

两者之间的混淆是最常见的失败之一。系统确认登录([身份验证1]),但忘记在每个操作中检查该用户是否有权访问该数据(授权)。结果是更改 URL 中的数字并访问其他人的信息的经典攻击,该缺陷多年来一直位于 OWASP 列表的首位。

在建筑学中,这意味着两种不同的检查。在入口处确认身份是不够的。每次访问资源时都必须检查权限。忘记第二个就像检查进入建筑物的人的徽章但所有房间都未上锁一样。

保护传输中和静态的数据

应用程序的数据存在两种状态,并且都需要保护。

传输中是指数据通过网络在客户端和服务器之间传输的情况。此处,保护是通过 HTTPS 进行的[通信加密2]。如果没有这一点,共享网络(例如公共 Wi-Fi)上的任何人都可以拦截和读取正在传输的内容,包括密码。如今,HTTPS 已成为基本且不可协商的标准。

静态是数据存储在数据库中的时间。对于初学者来说,最重要的保护是密码的处理:永远不应该在用户键入密码时存储密码。它们经历一个称为“哈希”的过程,将它们转变为不可逆转的东西。因此,即使银行被泄露,密码也无法读取。以纯文本形式保存密码可能是初学者最常见的致命罪过。

架构可预防的经典威胁

有些攻击类别非常常见,每个初学者都应该知道它们的名称。它们出现在 OWASP 列表中,该列表是 Web 应用程序风险的全球参考。

当用户发送的数据被系统解释为命令时,就会发生注入。典型的案例是 SQL 注入,其中使用表单字段来欺骗[数据库3?。架构防御是永远不要将用户数据与命令直接混合,始终将输入视为数据,而不是指令。

当一个用户发送的恶意代码最终在另一个用户的浏览器中运行时,就会发生跨站脚本攻击 (XSS)。防御措施是在将来自外部的所有内容显示在屏幕上之前对其进行处理和逃避。

这些威胁的常见模式与以前的原理相同:来自外部的数据不可信,需要在使用之前在服务器上进行验证和处理。安全架构在很大程度上是系统地不信任输入的架构。

给那些刚开始的人的反思

初学者最危险的心理陷阱是“我的项目太小而无法攻击”。事实恰恰相反。大多数攻击不会选择目标,它们是自动扫描互联网以查找已知缺陷的机器人。一个小的、保护不善的项目恰恰是这些扫描最容易的目标。没有人想要攻击你;所需要的只是偶然发现的一扇敞开的门。

还有初学者忽视的法律层面。在巴西,[LGPD4] 要求收集人们数据的人负责保护数据,无论项目规模如何。从一开始就安全地构建不仅是良好的技术实践,也是对将数据委托给您的人的法律和道德责任。

您不需要掌握所有内容才能正确开始。架构基础,从不信任客户端,将[身份验证5]与授权分开,加密通信,保护密码,验证所有输入,已经使初学者领先于市场上的大量应用程序。一开始,安全性不在于先进技术,而在于不犯你知道如何避免的基本错误。

学会从第一个项目中安全地汲取资金是一项可以带来数倍回报的投资。重新构建没有这些基础的系统是昂贵且痛苦的;从一开始就构建它只是一个习惯问题。

如果您开始进行 Web 开发并希望在正确的基础上进行构建,还有其他关于身份验证、OWASP、[LGPD6? 和安全架构的博客文章,对这些要点进行了更深入的探讨。如果这是您组织中学习或决策的时刻,那么就值得讨论。

另请阅读

  • [API 安全:不让门敞开的基本步骤7
  • [API安全8
  • [网络应用程序的安全性:任何人都不能忽视的基础知识9
  • [应用程序中的漏洞:为什么它们持续存在以及如何领导防御10
  • [授权和权限:防止未经授权的访问的最佳实践11
  • [移动应用程序的安全性:适合需要扩展的架构12