跳转到内容

安全须知

plugin host 是安全带,不是能抵御恶意代码的沙箱。写插件时要按这一边界设计;站长安装插件等于信任作者在服务器上运行代码。

安装插件与站点以同一个操作系统用户运行。host 使用 Node 权限模型限制文件读取,环境变量为空,没有核心数据库凭据;这些约束用于减少误操作和故障影响,不能当成恶意代码隔离。一个 host 承载全部安装插件,一个插件崩溃会影响同 host 的其他插件。

capabilities、network 白名单、表名隔离和 RPC 校验主要防止写错,不保证恶意插件不会绕过。不要建议站长“因为没申请能力,所以一定安全”。第一版只有上传安装,没有插件市场、签名或容器档位。

高风险能力是 users.readPrivate(邮箱、积分、语言等)、users.score(给任何用户加减积分并看到余额)、notifications.send(给任何用户发站内通知,内容是插件自己的文案)和 textures.readFile(材质文件字节);passwordHasher 会收到明文密码,login 会接触授权码、令牌和第三方身份,同样按高风险展示。只申请需要的能力,第三方登录或 CDN 刷新仅用已有输入时不必申请读核心数据。

申请 users.score 后可以操作任何用户,包括被封禁的用户;只申请这一项也能从结果看到余额。插件在路由里替用户扣分时,用户同不同意、操作是否属于这个用户,由插件自己判断,核心的能力检查不能替代这些授权检查。用永久 key 防止重放多扣或多发,见改积分。

network 仅管 ctx.fetch,逐跳验证精确 HTTPS origin 和 10 MiB 体积限制。Node 24 权限模型拦不住插件绕过它,直接调用全局 fetch 或 node:net 联网。host 运行环境支持 Node 网络权限限制时会禁止直接联网;写可移植插件始终使用 ctx.fetch,不要依赖某个 Node 版本的空隙。

不要把用户提供的 URL 拼进已信任请求而不校验。特别是重定向目标也要纳入设计;声明一个 origin 并不表示它下面的每个接口都适合接受任意用户输入。

密码、令牌、Cookie、OAuth secret、数据库连接串、机密设置不能写进日志、异常消息、路由响应或持久任务载荷。核心只把 password、token、secret 这类字段名(顶层和下一层)的值换掉,不扫描其余内容。日志有截断,不代表会脱敏;事件和任务的异常消息会保存进 last_error,拦截器错误也会写日志。对外错误用固定原因,勿附完整请求、第三方响应或 ctx.settings。

机密设置用顶层 secret(),核心加密存储且不回传浏览器;handler 拿到的是解密值,要自己保密。password 字段只是输入框的显示方式,不会自动获得 secret()的存储规则。

TypeScript 只在编译时生效。路由 JSON、参数、KV、任务 payload、第三方响应都要运行时校验。检查字符串长度、数字是否有限、允许的枚举和数据归属。user 路由只证明调用者已登录,不代表他能操作 payload 里任意 uid 的数据;管理操作加插件 permission。

第一版 UI 只有声明式视图,Markdown 不渲染原始 HTML;插件路由响应带 sandbox CSP,也不能设置 Cookie。不要借路径穿越或 HTML 返回绕过这些约束。完整规则见路由、界面和插件表。

NextSkin v0.7.2插件 SDK v1.0.0-rc.7提交 e6ffcd2本站源码