modernc.org/sqlite: 新增 StrictPragmas 限制 _pragma
sqlite: add StrictPragmas; document that _pragma runs as SQL text
涉及 DSN 注入防护的关键安全加固,使用 Go sqlite 驱动且动态拼接参数的开发者必须评估是否开启 StrictPragmas 以阻断潜在的多语句攻击。
Driver.Open 将每个 _pragma 值记录为“PRAGMA 语句”。它作为带有 PRAGMA 前缀的 SQL 文本运行,分号后的内容也会执行:“_pragma=foreign_keys(1);ATTACH 'x.db' AS x”会附加并创建 x.db。文档现已如此说明。StrictPragmas(true) 为可选开启项,默认关闭,使连接拒绝包含多条语句的 _pragma 值,并包装 ErrMultiStatementPragma 错误。它是进程范围的,类似于 OFDLocking,并且故意不作为 DSN 键:DSN 是它所保护的对象,而编写 DSN 的人可能会遗漏该键。建议任何其 DSN 非编译时常量的应用程序使用。检查在验证阶段运行,因此被拒绝的 DSN 不会应用任何更改。它是词法层面的,不编译任何内容:准备文本会编译那些旨在被拒绝的语句,某些 PRAGMAs 在编译时生效,且它会在 busy_timeout 设置之前运行。它遵循 SQLite 对引号和注释的词法分析器规则。TestSingleStatementAgainstSQLite 和 FuzzSingleStatement 使其与 SQLite 自身的解析器保持一致。模糊测试发现了三处分歧,均无害,现在检查已与 SQLite 在各处达成一致:末尾的 /* 被视为斜杠而非注释;SQLite 在遇到 NUL 时停止;以及 \v 仅在其它空白字符序列内部计为空白,因此检查直接拒绝它。这三个输入被保留为种子。在上一次修复之后进行了 510 万次执行,未发现任何问题。此问题是在审查 Ian Chechin 起草的 DSN 表面威胁模型时发现。联合署名:Claude Opus 5(1M 上下文)<[email protected]>
更进一步:量化金融体系
看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力