简而言之
- 你发布的每个文件,任何能打开网站的人都可以读取,访问口令也不会改变哪些内容适合放上去。请不要放入密钥、密码和客户数据。
- 没有服务器不等于没有风险。留意粘贴进去的密钥、外部脚本,以及用 innerHTML 插入的文字。
- 如果密钥泄露,先吊销它。只删除文件是不够的。
哪些内容会被公开
这是需要记住的一条规则。当你发布网站时,只要知道地址,任何人都可以下载其中的每个文件,包括没有任何页面链接到的文件。用“压缩”或“混淆”来隐藏代码,只会让它更难读,并不会让它保密。
| 文件类型 | 是否公开? | 示例 |
|---|---|---|
| HTML、CSS、JavaScript | 有 | 输入到 script.js 里的 API 密钥 |
| 图片、PDF、下载文件 | 有 | 一份没有任何页面链接到的价目表 PDF |
| 配置文件 | 有 | 里面带有令牌的 config.json |
.env 文件 | 是,只要上传了 | 放在项目旁边的密钥 |
源码映射(.map) | 是,只要上传了 | 你原始代码的可读副本 |
.git 文件夹 | 是,只要上传了 | 带有“已删除”密钥的旧历史记录 |
| 你没有发布的文件 | 无 | 笔记、草稿,以及项目的其余部分 |
密钥藏在哪里
AI 工具擅长让东西跑起来。有时最快的办法,就是把密钥直接粘贴进代码。留意这些:
- JavaScript 里的密钥。一个直接从页面调用 AI 服务的聊天机器人小部件,密钥就写在代码里。任何人都能复制这个密钥,让你的账单暴涨。
.env文件。项目会把密钥放在名为.env的文件里。它应当留在你的电脑上,但如果你发布整个项目文件夹,它就会被上传。- 配置和构建文件。设置文件、源码映射和遗留的测试文件,可能包含你不想分享的密钥或路径。
.git文件夹。这个隐藏文件夹保存着项目的完整历史,包括很久以前就被“删除”的密钥。
公开密钥没问题
有些密钥本来就设计放在网页里:Stripe 的可公开密钥(pk_...)、限定在你的域名下使用的地图密钥、统计 ID。服务的文档会说明某个密钥能否用在浏览器里。如果文档写的是“secret”或“仅限服务器端”,或者密钥以 sk_ 开头,它就绝不能出现在你的网站里。
如果某个功能需要密钥
如果某个功能只能配合密钥使用,普通网站自己无法安全地做到。你的选择:
- 使用专门的服务:联系表单用表单服务,预约用预约工具,付款用托管结账。它们会替你保管机密信息。
- 把密钥放在支持的地方的一个小型服务器函数后面,让你的页面去调用它。
- 暂时去掉这个功能。一个清楚的邮件链接,好过一个泄露的密钥。
直接问你的 AI:“这个网站里有没有任何密钥?如果有,怎样才能在不把密钥放进浏览器的情况下实现这个功能?”一旦你问了,它通常就能发现问题。
从别处加载的脚本
很多 AI 做的页面会从其他网站引入脚本:字体加载器、图标包、统计、聊天小部件。每一个都以完整权限在你的页面上运行,可以读取访客输入的内容,也可以改变他们看到的东西。如果那个网站被黑,你的页面也会受牵连。
- 尽量少用。问一问:“这个页面真的需要每一个外部脚本吗?”
- 锁定版本。使用
library@1.2.3,而不是“latest”,这样文件就不会在你不知情时被改动。 - 添加完整性校验,只要库提供了的话。这样浏览器会拒绝被篡改过的文件。看起来是这样的:
<script src="https://cdn.example.com/lib@1.2.3/lib.min.js" integrity="sha384-..." crossorigin="anonymous"></script>
- 检查小部件。统计、聊天和预约小部件往往还会添加 Cookie 和追踪。要了解每一个做了什么,并写进你的隐私页面。
安全地把文字放到页面上
如果你的代码从地址栏、表单框或访客那里获取文字,并用 innerHTML 把它放到页面上,攻击者就可能塞进代码,在其他人的浏览器里运行。这叫跨站脚本攻击,简称 XSS。安全的做法是用 textContent 插入纯文本,它绝不会被当作代码运行。
Find every use of innerHTML, document.write and eval in my site. For each one, say where the text comes from. If it can come from the URL, a form or a visitor, change it to use textContent instead. Tell me what you changed.
页面上的聊天机器人
与 AI 对话的聊天框需要一个密钥来调用 AI 服务。这个密钥应当放在服务器上,绝不能放在你的页面里。还有两点要知道:
- 提示词注入。访客可能输入指令,企图诱使机器人无视你的设定。你无法完全阻止这一点。
- 所以要限制危害。不要给机器人任何密钥和操作权限。如果它只根据公开文本回答问题,即使被骗,也造不成多大伤害。
表单和个人信息
- 只收集必要的信息。姓名和邮箱往往就够了。每多一个字段,就多一份你要保护的东西。
- 说明信息去向。你的隐私页面应当说明谁会收到这些消息、为什么。
- 不要自己做存储。普通页面无法安全地存储消息。请使用表单服务,或托管服务内置的功能。
在 Page Lemon 上,让你的 AI“给我的网站添加一个联系表单”。消息会发到你的邮箱,并保存在你的账号里,不需要单独的表单服务。表单包含在付费套餐中。请看联系表单。
许可与准确性
- 检查许可。外部的库、字体、图标和图片都有使用条款。有些要求署名,有些禁止商用。让你的 AI 列出你用了什么、来自哪里。
- 核对事实。AI 可能编造价格、评价和说法。而发布它们的人是你。
- AI 写的作品归谁所有取决于所在国家,且仍在厘清中。这不是法律意见。如果事关重大,请咨询专业人士。
不要粘贴给你的 AI 的内容
你的网站是公开的,但你的聊天并不是。不要往里面粘贴:
- 客户名单、订单或消息,除非你清楚你的 AI 服务如何处理这些数据;
- 密码、API 密钥或登录验证码,因为 AI 可能把它们写进网站;
- 任何你不愿印在传单上的内容。
建站时使用占位名称和“example@example.com”。真实信息请你自己替换进去。
分享链接前的五分钟检查
逐项勾选。或者把扫描的部分交给你的 AI,使用下面的提示词。
已完成 0/6
List every external script, key-like string, innerHTML use, form action and personal detail in my site, with the file and line for each. Don't change anything.
检查通过后,再过一遍网站上线检查清单。
如果密钥真的公开了
Page Lemon 能帮上什么
AI 做的网站,常常由从未考虑过这些问题的人发布,所以我们设了几道安全网:
.env文件、.git、node_modules、源码映射和私钥文件会被跳过,永远不会被提供访问。- 上传的内容会被检查是否含有常见类型的密钥和私钥。一旦发现,这次上传的任何内容都不会发布,并会告诉你要修改哪个文件的哪一行。