SQLite 字符串中的空字符处理
来源:sqlite.org — 2026-07-16
📋 概述
SQLite 对字符串中的 NUL 字符采取开放态度——不像大多数数据库那样在遇到 NUL 时截断字符串。SQLite 使用长度前缀而非 NUL 终止符来存储字符串,因此 NUL 字符可以合法地出现在字符串中间。但这也带来了隐患:许多上层语言和 API(如 C 的 printf、Java 的 JNI)以 NUL 作为字符串结束标志,SQLite 的宽容可能导致数据在传递过程中被意外截断或产生 安全漏洞。
🔑 核心要点
- SQLite 不截断 NUL 字符:使用长度前缀而非 NUL 终止符存储字符串,允许 NUL 出现在任意位置
- 与上层语言的冲突:C、Java 等语言以 NUL 为字符串结束标志,SQLite 的宽容可能导致数据被中间截断
- 安全隐患:NULL 字节注入攻击可绕过输入验证——攻击者可在字符串中嵌入 NUL 来欺骗校验逻辑
- 建议显式处理:开发者应在应用层检查并拒绝包含 NUL 的字符串,或在存储前做转义
💡 金句
SQLite does not care about NUL characters. It will happily store them in the middle of a string. Your application, however, may not be so accommodating.
← 返回 Hacker News 首页