#define SQLITE_DETERMINISTIC 0x000000800 #define SQLITE_DIRECTONLY 0x000080000 #define SQLITE_SUBTYPE 0x000100000 #define SQLITE_INNOCUOUS 0x000200000 #define SQLITE_RESULT_SUBTYPE 0x001000000
这些常量可以与 首选文本编码 进行按位或运算,作为 sqlite3_create_function()、sqlite3_create_function16() 或 sqlite3_create_function_v2() 的第四个参数。
对于任何具有副作用或可能泄漏敏感信息的 应用程序定义的 SQL 函数,建议使用 SQLITE_DIRECTONLY 标志。这将防止攻击者诱骗应用程序使用其模式已被秘密修改以以有害方式调用应用程序定义函数的数据库文件。
有些人认为,无论 应用程序定义的 SQL 函数 是否对安全性敏感,都应该将 SQLITE_DIRECTONLY 设置为所有函数的良好实践,因为这样做可以防止这些函数在数据库模式内部使用,从而确保可以使用通用工具(例如 CLI)检查和修改数据库,而这些工具无法访问应用程序定义的函数。
SQLITE_INNOCUOUS 与 SQLITE_DETERMINISTIC 类似,但并不完全相同。 random() 函数 是一个无害但非确定性函数的例子。
某些更高的安全设置(SQLITE_DBCONFIG_TRUSTED_SCHEMA 和 PRAGMA trusted_schema=OFF)禁用在视图和触发器以及模式结构(例如 CHECK 约束、DEFAULT 子句、表达式索引、部分索引 和 生成列)中使用 SQL 函数,除非该函数被标记为 SQLITE_INNOCUOUS。大多数内置函数都是无害的。建议开发人员避免对应用程序定义的函数使用 SQLITE_INNOCUOUS 标志,除非该函数已仔细审核并发现没有潜在的安全风险副作用和信息泄漏。