SvelteKit 3.0 进入稳定线,Astro 连续发了 7.3.6 和 7.3.7 两个版本做安全加固。这两件事放一起看,方向是一致的:把安全的默认值写进框架。
SvelteKit 3.0 的硬性要求
Node 22+、TypeScript 6、Svelte 5.56.4+、Vite 8、@sveltejs/vite-plugin-svelte v7。要求很高,老项目要先解决依赖链。
移除的部分
$app/stores、$service-worker 被移除。handleValidationError 也没了,校验错误现在统一走 handleError,带 kind: 'validation'。CSRF 的 checkOrigin 选项被移除。
别名变了:$lib 改成 #lib,导入需要写显式扩展名。这个改动影响每一个导入语句,迁移时要批量处理。
新的安全默认值
这几条最值得关注:
默认禁止外部重定向。以前要自己判断跳转目标是不是自己的域,现在框架帮你挡了。
没有 Content-Type 头的跨站表单提交会被拒绝。这条挡的是一类自动化攻击。
以 x-sveltekit- 开头的查询参数被拒绝,避免跟框架内部参数冲突。
Cookie 路径默认是 /,Cookie 名必须是 ASCII。
版本轮询默认改成一小时一次。
Astro 的加固
7.3.6 和 7.3.7 做的是 CSRF 加固、Node adapter 的 Host 头校验,以及 security.checkOrigin 的修复。
Host 头校验这个点容易被忽略:不校验的话,攻击者可以伪造 Host 头让应用生成指向恶意站点的绝对 URL,常见于密码重置邮件这类场景。
迁移建议
先跑官方的迁移工具或指南,把机械性的改动(比如 $lib 到 #lib)一次性处理完。
再逐个排查移除的 API,特别是 $app/stores——如果项目里用得多,需要改成对应的新写法。
然后重点测表单提交。新增的 Content-Type 检查会挡掉一部分请求,如果你的前端有用 fetch 提交表单且没设 Content-Type,会被拦。
最后检查所有的重定向逻辑,确认没有依赖外部跳转的功能被默认策略挡住。
一个趋势
框架把安全默认值收紧,对开发者是好事——以前要靠 checklist 记住的事,现在默认是安全的。代价是迁移时要花时间适配,但比出事之后再补救划算得多。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。