基础知识
为了开发安全的代码,您应该遵循一些非常基本的基本准则。
第一条:所有用户输入都是恶意的
将用户输入的每一个输入都视为恶意输入。不能信任它,始终需要在输入时进行过滤和/或验证,并在输出时需要进行转义。
请记住,这不仅适用于“明显的”用户输入来源,如 POST 或 GET 输入,还适用于其他受用户控制的来源,例如
- cookie
- REQUEST 超级全局变量
- SERVER 超级全局变量的主要部分,因为它包含受用户控制的输入,如 URL、域名或 HTTP 方法
- HTTP 请求头
第二条:客户端安全不是安全
在客户端上下文(= 浏览器中)发生的任何事情都是用户控制的。这也意味着在客户端实施的任何安全措施都不算安全措施,因为用户始终可以停用或操纵这些检查。
这最重要的是适用于
- (表单)验证:基于浏览器的输入验证是一个 UX 特性(因为它提供即时的用户反馈,无需页面重新加载),但不能替代服务器端验证
- 访问检查:如果您,例如,将秘密字符串输出到浏览器,但通过
display:none
隐藏它,用户仍然可以通过删除显示指令来访问它 - 速率限制:如果您通过客户端措施(例如,通过使用 JS 禁用按钮)限制客户端允许执行的请求数,这也不能提供任何保护
第三条:不要自己进行加密
正确实施的加密在保持秘密内容安全方面做得非常出色。然而,难点在于正确实施它,因为细节往往决定着实施是否真正安全。因此,您不应该自己实施加密方法或算法。相反,使用“现成”的实现,例如 PHP 中提供的libsodium方法。这些方法由比您聪明得多的人开发,并且经过广泛的测试和审查。
第四条:不要使用安全性模糊
这条规则不仅适用于代码库中的实际实现,也适用于您应该如何处理代码中的安全问题:一旦它被修复并且修复程序已发布,请公开处理它,通知用户有关问题和修复程序,并概述其严重程度。
第五条:减少攻击面
您编写的每一行代码都可能包含安全问题,并会增加您的攻击面。仔细权衡新功能的优势与维护工作量和增加的攻击面。
对于扩展开发人员,这也意味着应该尽可能使用 Joomla 核心类和功能,而不是编写自己的实现,因为 Joomla 的核心代码维护良好,经过测试,并且由安全团队积极进行安全覆盖。