Datasette 用 Sec-Fetch-Site 头部替代 CSRF 令牌保护
Simon Willison··作者 Simon Willison
关键信息
新中间件受到 Go 1.25 和 Filippo Valsorda 研究的启发,该研究显示 Sec-Fetch-Site 头可以可靠地防止 CSRF 攻击而无需使用令牌。该变更还包含更新后的文档和升级指南。
资讯摘要
Datasette 是一个流行的 Python Web 框架,已通过使用基于 Sec-Fetch-Site HTTP 头的新方法取代其长期使用的 CSRF 令牌系统,实现了重大安全改进。此前,开发者需在表单中手动添加隐藏输入字段并处理 API 的例外情况,现在这些复杂性已被消除,因为该设计借鉴了 Go 和安全专家 Filippo Valsorda 最新的研究成果。
此 PR 主要由 AI 工具 Claude Code 协助完成,并经过 GPT-5.4 审查,体现了现代开发实践。文档也已更新以反映新方法,用户可通过专门的升级指南了解迁移流程。
资讯正文
<p><strong><a href="https://github.com/simonw/datasette/pull/2689">datasette PR #2689:用 Sec-Fetch-Site 请求头保护替代基于令牌的 CSRF 防护</a></strong></p>
<p>Datasette 一直通过 CSRF 令牌来防范跨站请求伪造(CSRF)攻击,这些令牌是使用我开发的 <a href="https://github.com/simonw/asgi-csrf">asgi-csrf</a> Python 库实现的。这类防护机制使用起来有些麻烦——你需要在模板中的表单里插入类似 <code><input type="hidden" name="csrftoken" value="{{ csrftoken() }}"></code> 的代码行,同时还要为那些计划从浏览器外部调用的 API 接口选择性地禁用 CSRF 保护。</p>
<p>我一直密切关注 Filippo Valsorda 在这方面的工作,其研究成果详见他于 2025 年 8 月发表的这篇详尽文章 <a href="https://words.filippo.io/csrf/">《CSRF》</a>,并在同年同月随 Go 1.25 版本正式发布。</p>
<p>现在我已经在 Datasette 中实现了同样的变更。以下是该 PR 的描述——Claude Code 完成了大部分工作(共 10 次提交,在我的密切指导下并经 GPT-5.4 交叉审查),但我决定今后开始亲自撰写 PR 描述,一方面是为了让内容更简洁,另一方面也是为了锻炼自己保持诚实和清晰表达的能力。</p>
<blockquote>
<ul>
<li>新增了受 Go 1.25 和 Filippo Valsorda 相关研究启发的 CSRF 保护中间件。这取代了原有的基于令牌的 CSRF 保护方式。</li>
<li>移除了模板中所有 <code><input type="hidden" name="csrftoken" value="{{ csrftoken() }}"></code> 的实例——它们已不再需要。</li>
<li>移除了 <code>datasette/hookspecs.py</code> 文件中定义的 <code>def skip_csrf(datasette, scope):</code> 插件钩子及其文档和测试用例。</li>
<li>更新了 <a href="https://docs.datasette.io/en/latest/internals.html#csrf-protection">CSRF 保护文档</a>,以说明新的实现方式。</li>
<li>升级指南现已包含对 CSRF 保护机制变更的说明,见 <a href="https://docs.datasette.io/en/latest/upgrade_guide.html#csrf-protection-is-now-header-based">此处</a>。</li>
</ul>
</blockquote>
<p>标签: <a href="https://simonwillison.net/tags/csrf">csrf</a>,<a href="https://simonwillison.net/tags/security">security</a>,<a href="https://simonwillison.net/tags/datasette">datasette</a>,<a href="https://simonwillison.net/tags/ai-assisted-programming">ai-assisted-programming</a></p>
来源与参考
收录于 2026-04-16