在开发中考虑的6个Web后端安全风险
在开发过程中采取措施来加固和保护您的网络后端安全。
小型企业、银行和许多行业都依赖于网络应用程序。从构建网络应用程序的时候开始,关键是确保在开发过程中有协议来检查漏洞,以避免安全漏洞、数据泄漏和财务问题。
最危险的网络攻击是发生在服务器端的攻击,这是数据存储和分析的地方。
什么是后端?
一个网络应用程序分为两个部分 – 前端和后端。
- 前端是客户端,用户与之交互的部分。通常使用HTML、CSS和Javascript构建。
- 后端是服务器端。它基本上是应用程序的工作方式,应用业务逻辑,进行更改和更新。一些热门的服务器端技术栈涉及PHP、NodeJS、Java、Ruby、C、Python、数据库、安全(身份验证、访问控制等)、结构和内容管理。
开始之前的一个小提示 – 身份验证、访问控制和会话管理
我们经常混淆这些术语。所以让我们快速澄清一下:
- 身份验证涉及证明用户身份(例如,密码、用户名、安全问题、指纹等)
- 访问控制涉及用户可以访问应用程序的内容。它强制执行用户不能超出其预期权限的策略。
- 会话管理涉及与同一用户关联的响应和请求事务。它是在用户成功身份验证后在用户和应用程序之间使用的交换机制。
让我们探讨以下内容,以实现更好的后端网络安全。
注入漏洞
自2010年以来,OWASP将注入分类为最危险的网络应用程序风险。
注入漏洞允许用户提供包含关键字的数据,这些关键字将修改基于数据库构建的查询的行为。例如,假设我们有一个SQL脚本,检查数据库中是否存在匹配的条目。
uname = request.POST['username'] passwd = request.POST['password'] sql = "SELECT id FROM users WHERE username='" + uname + "' AND password='" + passwd + "'" database.execute(sql)
攻击者现在可以使用SQL injection操纵密码字段,例如输入密码'OR 1 ='1,这将导致以下SQL查询:
sql = "SELECT id FROM users WHERE username='' AND password='password' OR 1='1'
通过这样做,攻击者可以访问数据库中的所有用户表,密码始终有效(1 ='1')。如果他们以管理员身份登录,他们可以随意进行任何更改。
如何预防?
避免注入漏洞非常简单。
验证是否存在注入漏洞的最佳和简单方法是对源代码进行彻底的手动审核,检查是否通过准备好的语句在数据库中执行查询。您还可以使用工具检查vulnerabilities。
您还应该执行以下操作。
- 使用ORM(对象关系映射工具)。
- 转义所有输入。日期字段除了日期之外,不应存储任何其他内容。
- 隔离数据,使得只有在给定位置应该被访问的东西才在该位置上保留。
- 编写良好的错误处理代码。不要使数据库或后端过于冗长。
Troy Hunt拥有一个关于SQL注入的精彩课程。如果有兴趣,可以探索一下。
破损的身份验证
如前所述,身份验证涉及提供凭证的处理。它是防止未受限制访问的第一道防线。然而,糟糕的实现和不遵守安全策略可能会导致身份验证失效。
身份验证失效主要发生在以下三种模式中:
- Credentials stuffings:攻击者拥有有效用户名和密码列表,并可以自动化攻击以确定凭证是否有效。
- 暴力破解攻击:应用程序允许用户或管理员使用弱密码。
- Session hijacking:应用程序暴露会话ID、URL或登录后未进行轮转。
在所有情况下,攻击者可以访问重要账户,并依赖于能够导致洗钱、身份盗用或披露法律保护的高度敏感信息的业务。
如何预防?
在实施身份验证系统之前,问问自己——如果身份验证系统被破坏,攻击者可以取得什么成果?
然后根据回答,可以采取以下措施:
- 实施多因素身份验证以防止自动化攻击。
- 鼓励(或强制)用户采用良好的密码策略。
- 限制失败的登录尝试。
- 使用高效的哈希算法。在选择算法时,考虑最大密码长度。
- 测试会话超时系统,并确保会话令牌在注销后无效。
破坏访问控制
访问控制的存在是为了确保经过身份验证的用户被允许做什么。身份验证和会话管理是访问控制规则的基础。但是,当这些规则设置不当时,就会导致重大问题。
常见的访问控制缺陷包括:
- CORS配置错误,允许未经授权的API访问。
- 元数据篡改以直接访问方法。
- 强制浏览:攻击者将尝试一个URL,修改路径(例如,将http://website.domain/user/修改为http://website.domain/admin),甚至可以发现重要文件。
如何预防?
大多数时候,破坏性的访问控制缺陷是由于对有效访问管理的基本要求的无知造成的。
- 默认拒绝,除了公共资源。
- 禁用服务器目录列表,并确保不存在备份文件。
- 限制API访问以减少自动化攻击的影响。
- 在后端注销后使JWT令牌无效。
数据泄露
也称为数据泄露,数据曝露是威胁企业和客户的网络威胁。
当应用程序未能适当保护凭据或信用卡等敏感数据时,就会发生数据曝露。超过4000条记录被泄露。
从财务方面来看,这对企业的影响很大:根据某项调查,平均一次泄露可能导致390万美元的损失。
如何预防?
作为后端开发人员,您应该问一问哪些信息需要受到保护。
然后为了防止此类缺陷:
- 加密敏感数据:对于静态数据,对所有内容进行加密。对于传输中的数据,确保使用安全的网关( SSL)。
- 识别需要额外保护的数据,并通过强制使用基于密钥的加密将其访问权限限制为仅限一小部分合法用户。
- 避免使用弱加密算法:使用最新和强大的加密算法。
- 拥有安全的备份计划。
不安全的序列化
序列化和反序列化是在数据转换为对象格式以便存储或发送到另一个应用程序时使用的概念。序列化包括将数据转换为可用的对象格式,如XML或JSON。反序列化只是相反的过程。
对反序列化程序的攻击可能导致拒绝服务、访问控制和远程代码执行(RCE)攻击,如果存在可以修改行为的类。
OWASP十大漏洞文档的第二个示例提供了PHP对象序列化的良好示例:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
这是一个超级cookie,包含用户ID、用户级别和散列密码等信息。
攻击者可以更改序列化对象以获取管理员权限:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
如何预防?
关键是不要接受来自不受信任的来源的序列化对象。
你还应该:
- 永远不要相信用户输入。
- 验证数据:如果你的应用程序期望一个字符串,请确保它是一个字符串再使用它。
- 使用检查来确保数据没有被更改。在发送数据之间的两个受信任的来源之间传递数据时很有用(例如,存储数据在客户端)。
服务器XSS
Server XSS(跨站脚本攻击)是一种注入类型的攻击,当攻击者使用Web应用程序向不同的用户发送恶意代码时发生。当攻击者发布一些包含恶意代码的精心制作的数据,而应用程序又未经验证地存储这些数据时,就会发生这种漏洞。这个漏洞是服务器端的,浏览器只是呈现响应。
例如,在一个论坛中,用户的帖子通常在数据库中保存,但未经验证。攻击者利用这个机会添加带有恶意脚本的帖子。随后,其他用户通过电子邮件接收到这个链接,或者在问题帖子中看到它并点击。
如何预防?
在初步确定所有可能存在XSS风险并需要受到保护的操作后,应考虑以下事项。
- 验证输入:检查输入长度,使用正则表达式匹配,并只允许一定的字符集。
- 验证输出:如果应用程序将来自用户或第三方的任何数据复制到其响应中,则应对该数据进行HTML编码,以消除潜在的恶意字符。
- 允许限制HTML:例如,如果你有一个评论博客系统,只允许使用特定的标签。如果可能的话,使用适当的框架来处理用户提供的HTML标记,以确保它不包含任何执行JavaScript的方式。
结论
开发阶段对于Web应用程序的安全性至关重要。你还应考虑在开发生命周期中包括一个security vulnerabilities scanner,以便在生产之前修复识别出的问题。