发布上线前必读

本模块涉及的安全失误可能造成经济损失、数据丢失或法律风险。

模块 5 · 第 3

数据与隐私安全:收了用户数据,责任就在你

是什么

一旦你的应用开始收集用户数据——哪怕只是一个邮箱地址——你就承担了保护这些数据的责任。明文存储密码、过度收集信息、不加密传输,这些看似无害的做法都可能在数据泄露时造成严重后果。

解决什么问题

如果不了解数据安全的基本原则,你可能会在 AI 的帮助下搭建出一个功能完好但安全裸奔的应用——直到用户数据泄露时,才发现所有密码都是明文存储的。

你手里多了一份责任

当你的应用只是在本地跑着玩的时候,数据安全还不是一个紧迫的问题。但一旦你的应用开始接受真实用户的注册——收集他们的邮箱、密码、甚至更私密的信息——事情的性质就变了。

从这一刻起,你不只是一个建造者,你还是这些数据的保管人。如果这些数据因为你的疏忽而泄露,受害的是信任你的用户。

这不是在吓唬你,而是在帮你建立一个重要的意识:收集数据的便利和保护数据的责任是绑定在一起的。

最致命的错误:明文存密码

在所有数据安全问题中,有一个错误的后果是最严重的,也是最容易犯的——把用户的密码以明文形式存储在数据库里。

"明文"的意思是:密码以原始的、可直接阅读的形式保存。如果用户的密码是 MyPassword123,数据库里存的就是 MyPassword123 这个字符串。

这意味着:任何能够接触到数据库的人——包括黑客在数据泄露时——都能直接看到每一个用户的原始密码。而由于很多人在不同的网站上使用相同的密码,一次泄露可能波及用户在其他平台上的账户。

明文存密码是必须立即修复的严重问题

如果你能在数据库里直接读出用户的原始密码,说明密码是明文存储的。这是数据安全中最严重、最不可饶恕的错误——一旦数据库泄露,所有用户的密码将原样暴露,并波及他们在其他平台的账户。正确的做法是在存储前对密码进行哈希处理(单向不可逆转换),数据库里只应保存一串无法还原的乱码。

正确的做法是:在存储密码之前,先对它进行哈希处理

哈希是一种单向转换——它能把 MyPassword123 变成一串看起来像乱码的字符(比如 $2b$10$abcdef...),而且这个过程是不可逆的,没有人能从这串乱码反推出原始密码。当用户下次登录时,系统会把用户输入的密码用同样的方式转换一遍,然后对比两串乱码是否一致——而不是对比原始密码。

这样,即使数据库被泄露,攻击者拿到的也只是一堆无法还原的乱码。

最小化收集:不需要的信息就不要收

另一个重要的原则是:只收集你的应用真正需要的数据,不多收一点。

你的应用需要用户的生日吗?需要他们的真实姓名吗?需要他们的手机号吗?如果某项信息对你的应用功能来说不是必需的,那就不要收集它。

你收集的数据越少,需要保护的就越少,万一发生泄露时造成的危害也越小。

这不仅仅是一个安全建议,在很多国家和地区,这还是法律的要求。数据保护法规通常都包含"最小化原则"——你只能收集实现服务目的所必需的信息。

传输中的数据也需要保护

数据不仅在存储时需要保护,在传输过程中也需要。

当用户在你的应用中输入密码并点击"登录"时,这个密码会通过网络从用户的浏览器传输到你的服务器。如果这个传输过程没有加密,密码就可能在途中被截获。

好消息是,现代的托管平台(比如 Vercel、Netlify)默认都会为你的网站启用 HTTPS——这就是传输加密。你通常不需要额外配置什么。但如果你注意到你的网站地址以 http://(没有 s)开头而不是 https://,那就需要排查一下了。

一份简单的安全清单

在你的应用上线之前,对照以下几点做一次检查:

密码存储 ——数据库中的密码字段是否经过哈希处理?你能否从数据库中直接读出用户的原始密码?如果能,这是一个严重问题。

数据收集 ——你收集的每一项用户信息是否都有明确的用途?是否有可以去掉的字段?

传输安全 ——你的网站是否使用 HTTPS?

访问控制 ——是否只有需要的人才能访问数据库?数据库的连接凭证是否安全保管(参考前一篇关于密钥安全的内容)?

这份清单不能覆盖数据安全的全部内容,但它能帮你避免最常见、最严重的错误。

指挥与验收

一边讲怎么让 AI 帮你做,一边讲怎么看出 AI 做砸了。

指挥怎么让 AI 帮你做

指挥

当 AI 帮你实现用户注册或登录功能时,明确要求它"对密码进行哈希处理后再存储,绝不能明文存储"。同时问它:我们收集的每一项数据是否都是必需的?能不能少收一些?

连接到

术语

事故复盘