OWASP前十(SQL注入、XSS、CSRF等)有很好的文档,大多数开发者知道基础知识。以下是不太常见的正确实施的安全模式,来自2024到2026年的真实漏洞模式。
间接对象引用问题
不安全的直接对象引用(IDOR)是漏洞赏金计划中发现最常见的漏洞之一,尽管理解和预防都很简单。模式:你的API返回`/api/orders/12345`,用户可以将`12345`改为`12346`以查看其他人的订单——因为代码只检查身份验证(该用户是否已登录?)而不是授权(该用户是否拥有订单12346?)。修复:始终验证请求用户是否有权访问他们请求的特定资源。一个简单规则:永远不要直接将数据库ID暴露给前端;如果必须,在每次请求时验证所有权。更好:使用UUID而不是顺序整数(更难猜测),但仍然验证所有权。授权漏洞的模式:大多数授权漏洞不是”检查不存在”——而是”检查存在于一个端点,但对于通过不同路径提供相同数据的另一个端点被遗忘了”。审计所有通往敏感数据的路径。
速率限制:不仅仅用于API
速率限制通常用于登录端点以防止暴力攻击。不那么常见的应用:账户创建(允许攻击者创建数千个账户用于垃圾邮件、凭证填充测试或资源耗尽);密码重置(允许快速枚举哪些电子邮件地址有账户);结账/支付流程(允许购物车填充或库存操纵);搜索端点(启用数据抓取)。正确的方法:按IP、账户和行动类型限制速率。也可以考虑:失败身份验证尝试的指数退避(第一次失败后阻止1秒,第二次后2秒,第三次后4秒等),以及N次连续失败后的账户锁定(使用CAPTCHA解锁而不是电子邮件解锁,以防止通过故意锁定其他账户进行拒绝服务攻击)。
JWT误用问题
JSON Web Tokens(JWT)广泛用于身份验证,但经常被误用。常见错误:信任JWT头部中指定的算法——`alg: “none”`攻击允许攻击者剥离签名并将算法设置为”none”,导致某些实现接受未签名的令牌;使用非对称密钥对(RS256)但使用公钥作为HMAC密钥进行验证(混淆攻击);在JWT负载中存储敏感数据(JWT是base64编码的,不是加密的——任何人都可以解码负载)。正确的模式:在你的验证代码中固定算法(不要从令牌头部读取);使用短期过期(访问令牌15分钟,刷新令牌更长);注销时撤销刷新令牌(维护令牌撤销列表或使用令牌族);永远不要在JWT负载中存储密码、支付数据或其他敏感信息。
依赖安全
2025到2026年最被低估的攻击面:通过npm/PyPI/Maven包的供应链漏洞。`event-stream`事件(2018年)、`log4shell`(2021年)、`polyfill.io`(2024年)和许多较小的事件表明,第三方依赖是主要的攻击面。实际措施:在CI管道中运行`npm audit`、`safety check`(Python)或`snyk test`;固定依赖版本(在生产中不要使用`^1.x.x`或`~1.2.x`——固定到确切版本);检查你添加的依赖的来源(这个包有一个维护者吗?它是否定期更新?每周下载量有多少?是由公司还是个人拥有?);SBOM(软件物料清单):生成并维护所有依赖项及其版本的列表,当新漏洞公布时实现快速评估。



