发布上线前必读
模块 5 · 第 3 节
数据与隐私安全:收了用户数据,责任就在你
是什么
一旦你的应用开始收集用户数据——哪怕只是一个邮箱地址——你就承担了保护这些数据的责任。明文存储密码、过度收集信息、不加密传输,这些看似无害的做法都可能在数据泄露时造成严重后果。
解决什么问题
如果不了解数据安全的基本原则,你可能会在 AI 的帮助下搭建出一个功能完好但安全裸奔的应用——直到用户数据泄露时,才发现所有密码都是明文存储的。
你手里多了一份责任
当你的应用只是在本地跑着玩的时候,数据安全还不是一个紧迫的问题。但一旦你的应用开始接受真实用户的注册——收集他们的邮箱、密码、甚至更私密的信息——事情的性质就变了。
从这一刻起,你不只是一个建造者,你还是这些数据的保管人。如果这些数据因为你的疏忽而泄露,受害的是信任你的用户。
这不是在吓唬你,而是在帮你建立一个重要的意识:收集数据的便利和保护数据的责任是绑定在一起的。
最致命的错误:明文存密码
在所有数据安全问题中,有一个错误的后果是最严重的,也是最容易犯的——把用户的密码以明文形式存储在数据库里。
"明文"的意思是:密码以原始的、可直接阅读的形式保存。如果用户的密码是 MyPassword123,数据库里存的就是 MyPassword123 这个字符串。
这意味着:任何能够接触到数据库的人——包括黑客在数据泄露时——都能直接看到每一个用户的原始密码。而由于很多人在不同的网站上使用相同的密码,一次泄露可能波及用户在其他平台上的账户。
明文存密码是必须立即修复的严重问题
如果你能在数据库里直接读出用户的原始密码,说明密码是明文存储的。这是数据安全中最严重、最不可饶恕的错误——一旦数据库泄露,所有用户的密码将原样暴露,并波及他们在其他平台的账户。正确的做法是在存储前对密码进行哈希处理(单向不可逆转换),数据库里只应保存一串无法还原的乱码。
正确的做法是:在存储密码之前,先对它进行哈希处理。
哈希是一种单向转换——它能把 MyPassword123 变成一串看起来像乱码的字符(比如 $2b$10$abcdef...),而且这个过程是不可逆的,没有人能从这串乱码反推出原始密码。当用户下次登录时,系统会把用户输入的密码用同样的方式转换一遍,然后对比两串乱码是否一致——而不是对比原始密码。
这样,即使数据库被泄露,攻击者拿到的也只是一堆无法还原的乱码。
最小化收集:不需要的信息就不要收
另一个重要的原则是:只收集你的应用真正需要的数据,不多收一点。
你的应用需要用户的生日吗?需要他们的真实姓名吗?需要他们的手机号吗?如果某项信息对你的应用功能来说不是必需的,那就不要收集它。
你收集的数据越少,需要保护的就越少,万一发生泄露时造成的危害也越小。
这不仅仅是一个安全建议,在很多国家和地区,这还是法律的要求。数据保护法规通常都包含"最小化原则"——你只能收集实现服务目的所必需的信息。
传输中的数据也需要保护
数据不仅在存储时需要保护,在传输过程中也需要。
当用户在你的应用中输入密码并点击"登录"时,这个密码会通过网络从用户的浏览器传输到你的服务器。如果这个传输过程没有加密,密码就可能在途中被截获。
好消息是,现代的托管平台(比如 Vercel、Netlify)默认都会为你的网站启用 HTTPS——这就是传输加密。你通常不需要额外配置什么。但如果你注意到你的网站地址以 http://(没有 s)开头而不是 https://,那就需要排查一下了。
一份简单的安全清单
在你的应用上线之前,对照以下几点做一次检查:
密码存储 ——数据库中的密码字段是否经过哈希处理?你能否从数据库中直接读出用户的原始密码?如果能,这是一个严重问题。
数据收集 ——你收集的每一项用户信息是否都有明确的用途?是否有可以去掉的字段?
传输安全 ——你的网站是否使用 HTTPS?
访问控制 ——是否只有需要的人才能访问数据库?数据库的连接凭证是否安全保管(参考前一篇关于密钥安全的内容)?
这份清单不能覆盖数据安全的全部内容,但它能帮你避免最常见、最严重的错误。
指挥与验收
一边讲怎么让 AI 帮你做,一边讲怎么看出 AI 做砸了。
指挥
连接到
术语
事故复盘