实际上,每个 Web 应用程序都是通向世界的一扇大门。您可以撬开锁或将钥匙留在地毯下。大多数团队在没有意识到的情况下选择了第二种选择,不是因为无能,而是因为从一开始就很少将安全性视为一项要求。
我向任何团队提出的问题都很简单:如果攻击者今天决定攻击您,需要多长时间?诚实的回答往往会让人感到不舒服。问题几乎从来都不是缺乏技术。这是缺乏基础。
本文就是关于这些基础知识的。不是关于流行的工具,而是关于支持值得信任的 Web 应用程序的原则。
为什么安全已成为一个业务问题
曾经有一段时间,安全问题仅限于基础设施团队。如今,这是一个首席执行官、董事会和声誉问题。
数据泄露不仅仅是一个错误。这是一个头条新闻,这是一个罚款,这是一个失去的客户。在巴西,[LGPD0] 给那些粗心对待个人数据的人带来了具体后果。但即使没有监管,事故的成本也始终很高,而且只会变得更加明显。
关键是安全不再是一个技术细节,而成为一个业务变量。那些主导产品或技术的人需要了解这一点才能决定投资方向。
论文:安全是架构,而不是清漆
我的立场很简单。安全性不是您在产品准备就绪后添加的一层。它是一种从你一开始就做出的决定中产生的属性。
将安全性视为最终任务、发布前的审查、仓促的笔测试的团队只是购买了保护的假象。笔测试发现症状。该架构定义了疾病是否存在。
当安全性成为根本时,它就体现在如何对数据进行建模、如何对用户进行身份验证以及如何信任(或不信任)输入。当它是清漆时,它会出现在一份没有人读的报告中。
真正重要的基本原理
我会务实的。有几十个可能的主题,但一些基本原理可以解决大多数实际问题。
永远不要相信用户输入
大多数经典漏洞,SQL 注入、跨站脚本、参数操纵,都源于同一个错误:信任来自外部的数据。
规则很简单且不容谈判:除非另有证明,否则所有进入都是敌对的。始终在服务器上进行验证。浏览器中的验证是用户体验,而不是安全性,这是很容易规避的。
在数据库中使用参数化查询。根据上下文转义输出。将文件上传视为潜在的恶意代码。这些预防措施看似显而易见,但它们仍然是新闻事件发生的原因。
身份验证和授权是不同的事情
身份验证回答“你是谁”。授权回答“你能做什么”。将两者混淆会导致灾难。
我看到的最常见的错误:应用程序检查用户是否已登录,但不检查他们是否有权访问该特定资源。结果就出现了一个经典问题:用户 A 只需更改 URL 中的数字就可以看到用户 B 的数据。
需要在服务器上检查每个敏感请求的授权,而不是根据界面显示的内容进行假设。隐藏按钮并不能保护任何东西。
将秘密作为秘密进行管理
密码、API 密钥、访问令牌。这些数据不属于源代码,不属于存储库,并且绝对不属于版本化配置文件。
用户密码必须使用为此目的设计的哈希算法来存储,而不是使用可逆加密,更不用说以纯文本形式存储。使用综合图书馆。自制加密是造成问题的最快方法之一,而您在发现问题时却为时已晚。
传输中的加密不是可选的
所有流量都必须使用 HTTPS。今天没有合理的理由不这样做。未经[加密2]传输的数据可能会被拦截,其中包括凭证。
但请注意:HTTPS 保护的是路径,而不是目的地。应用程序可以在浏览器中显示绿色锁,但仍以纯文本形式存储密码。传输中的加密和静态的加密是不同的层,而且都很重要。
OWASP 教给我们什么
当有人问我从哪里开始时,我的答案几乎总是相同的:从 OWASP 开始。
OWASP Top 10 是 Web 应用程序中最严重的漏洞列表,由社区维护并定期更新。这不是一个官僚标准,而是一张实际造成伤害的威胁地图。
它的价值不在于记住列表,而在于将其用作团队内的通用语言。当每个人都了解什么是损坏的访问控制或失败的安全配置时,技术对话就会变得更加客观,决策也会变得更加明智。
我建议将前 10 项作为流程的一部分:进行轻松但一致的审查,询问“我们是否面临这些风险?”在每次相关交付之前。
破坏安全的文化错误
安全最困难的部分不是技术。这是文化。
第一个错误是将安全视为一个人或一个孤立团队的责任。安全性是那些编写代码的人、设计产品的人以及确定待办事项优先级的人的责任。当它成为某人的工作时,它就不再是任何人的工作了。
第二个错误是安全问题:没有人遵循的大量政策、存在于文档中但不是日常的流程。真正的安全是谨慎且可操作的,而不是抽屉里的手册。
第三,也许是最危险的,是“这不会发生在我身上”的错误感觉。小型应用程序一直受到攻击,通常是由不选择目标的自动化攻击造成的。小并不是保护。
安全是一种优势,而不是成本
有一个更好的方法来看待这一切。出色的安全不仅仅是防御,更是一种差异。
在处理敏感数据的部门,例如医疗保健、金融和公共部门,信任就是货币。与忽视数据主题的竞争对手相比,对数据表现出关注的产品具有优势。对于公共管理者来说,这一点更为重要:公民数据不是组织的资产,而是责任。
投资安全基础并不会阻止创新。相反,它为您提供了坚实的基础,您可以在此基础上快速构建,而不必担心一切都会崩溃。
安全不是你有时间时所做的事情。它决定了您正在构建的产品是否值得存在。
如果您的组织正在开发 Web 应用程序,并且安全性仍然是一个留到最后的主题,那么值得重新审视这个优先事项。我的博客上还有其他关于 [LGPD3´、密码学和安全架构的文章,并且我始终愿意与认真对待该主题的任何人交换想法。
另请阅读
- [应用程序中的漏洞:为什么它们持续存在以及如何领导防御4
- 【创建应用时:初学者不能忽视的安全5
- [Web 应用程序的安全性:为初学者解释的架构6
- [移动应用程序的安全性:保护数据和用户的基础7
- 【内容推荐:系统扩容时的安全与隐私8
- [API安全:不让门敞开的基本步骤9