如何(不)从您的API返回数据 - Treblle博客

作者:API传播员 · 2026-01-21 · 阅读时间:5分钟

数据泄露,并提供一些最佳实践


为什么不能从 API 返回所有数据?

在开发过程中,许多开发者倾向于将所有数据直接返回给客户端,认为这样可以简化开发流程。然而,这种做法可能带来以下风险:

  • 隐私泄露:敏感信息(如用户的个人身份信息、密码哈希、2FA 密钥等)可能被暴露。
  • 安全威胁:黑客可以利用暴露的数据进行攻击,例如破解密码或绕过双因素认证。
  • 法律风险:不当的数据处理可能违反隐私保护法规(如 GDPR)。

以下是一个真实案例,展示了不当的 API 数据返回可能带来的后果。


案例分析:Spoutable 的数据泄露

Spoutable 是一个社交媒体平台,允许用户通过个人资料页面进行交互。在其 API 的实现中,开发者不仅返回了构建页面所需的基本信息,还包括了以下敏感数据:

  • 用户的 bcrypt 哈希密码
  • 双因素认证(2FA)密钥及备份代码
  • 密码重置电子邮件令牌

这些数据的暴露使得攻击者可以轻松破解用户账户,甚至绕过 2FA 保护。这种情况的发生,主要是因为开发者在实现 API 时没有限制返回的数据范围。


数据泄露是如何发生的?

数据泄露通常源于以下几个原因:

  1. 内部 API 的误用:开发者可能认为内部 API 不会被外部访问,因此没有对返回数据进行严格限制。
  2. 过度依赖 ORM:对象关系映射器(ORM)在加载数据库记录时,可能会默认加载所有字段,而开发者未对这些字段进行筛选。
  3. 缺乏数据可见性开发者未对 API 返回的数据进行详细检查,导致敏感数据意外暴露。

例如,在单页应用程序(SPA)中,开发者可能直接将完整的用户记录发送到前端,而未意识到其中包含了不必要的敏感信息。


如何避免 API 数据泄露?

1. 仅返回必要的数据

开发者应明确指定 API 返回的数据字段,而不是返回整个记录。以下是一个使用 Laravel 框架的示例:

function show(string $username) {
    $user = User::where('username', $username)->first();
    return [
        'username' => $user->username,
        'display_name' => $user->display_name,
        'biography' => $user->biography,
        'links' => $user->links,
        'follower_count' => $user->follower_count,
        'following_count' => $user->following_count,
        'joined_date' => $user->joined_date,
        'profile_photo' => $user->profile_photo,
    ];
}

通过明确指定返回的字段,可以有效避免敏感数据的意外暴露。

2. 按需逐步添加数据

在开发过程中,应根据实际需求逐步添加返回的数据。例如,初始版本的个人资料页面可能只需要返回用户名和简介。当需要显示关注者数量时,再将其添加到响应中。

3. 增强数据可见性

开发者应在开发和测试阶段使用工具检查 API 返回的数据内容。例如:

  • 使用 Seeder:通过生成逼真的测试数据,模拟真实环境下的 API 响应。
  • 手动检查 API 响应:使用 API 调试工具(如 Postman)查看实际返回的数据。
  • 监控生产环境:在生产环境中设置监控,及时发现和修复数据泄露问题。

外部 API 的数据泄露风险

不仅是内部 API,外部 API 也可能因设计不当而导致数据泄露。例如,一个返回博客文章及其评论的 API:

function getPostsWithComments() {
    $posts = Post::with('comments')
        ->select('slug', 'title', 'author', 'content', 'published_at')
        ->get();
    return response()->json($posts);
}

如果开发者未对评论模型中的字段进行限制,可能会意外暴露用户的电子邮件地址和 IP 地址等敏感信息。因此,在设计外部 API 时,也需要遵循同样的最佳实践。


总结

API 是系统之间数据交互的桥梁,但不当的设计可能导致严重的隐私和安全问题。为了避免数据泄露,开发者应:

  1. 明确限制 API 返回的数据范围。
  2. 根据需求逐步添加返回的数据。
  3. 在开发和测试阶段检查 API 响应的内容。
  4. 保护所有类型的 API,包括内部和外部 API。

通过这些措施,可以有效降低数据泄露的风险,确保 API 的安全性和可靠性。

原文链接: https://blog.treblle.com/how-not-to-return-data-from-your-api/