- 安装
- 文档
- 入门
- 连接
- 数据导入
- 客户端 API
- 概览
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT 和 IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- 为什么选择 DuckDB
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
DuckDB 拥有强大的扩展机制,这些扩展机制与运行 DuckDB(父)进程的用户拥有相同的权限。这引入了安全方面的考量。因此,我们建议您审阅此页面上列出的配置选项,并根据您的攻击模型进行设置。
DuckDB 签名检查
DuckDB 扩展在每次加载时都会使用二进制文件的签名进行检查。目前有三类扩展:
- 使用
core
密钥签名。只有经过 DuckDB 核心团队审查的扩展才能使用这些密钥签名。 - 使用
community
密钥签名。这些是通过 DuckDB 社区扩展库分发的开源扩展。 - 未签名。
扩展安全级别概述
DuckDB 为扩展提供了以下安全级别。
可用扩展 | 描述 | 配置 |
---|---|---|
core |
扩展只能在通过 core 密钥签名时加载。 |
SET allow_community_extensions = false |
core 和 community |
扩展只能在通过 core 或 community 密钥签名时加载。 |
这是默认安全级别。 |
任何扩展,包括未签名的 | 可以加载任何扩展。 | SET allow_unsigned_extensions = true |
与安全相关的配置设置会自行锁定,即只能在当前进程中限制功能。
例如,尝试以下配置更改将导致错误:
SET allow_community_extensions = false;
SET allow_community_extensions = true;
Invalid Input Error: Cannot upgrade allow_community_extensions setting while database is running
社区扩展
DuckDB 拥有一个社区扩展库,可以方便地安装第三方扩展。像 pip 或 npm 这样的社区扩展库从设计上讲本质上是允许远程代码执行的。这听起来没有那么戏剧性。无论是好是坏,我们都习惯于将来自网络的随机脚本导入到我们的 shell 中,并且经常毫不犹豫地安装大量的传递性依赖。有些存储库,如 CRAN,在某些时候会强制进行人工检查,但这也不能保证任何事情。
我们研究了社区扩展库的几种不同方法,并选择了我们认为合理的方法:我们不尝试审查提交,但要求扩展的源代码可用。我们负责完整的构建、签名和分发过程。请注意,这比允许上传任意二进制文件的 pip 和 npm 更进一步,但比手动审查所有内容有所简化。我们允许用户报告恶意扩展并显示 GitHub 星标和下载量等采用统计数据。由于我们管理存储库,因此我们可以快速从分发中删除有问题的扩展。
尽管如此,从社区扩展库安装和加载 DuckDB 扩展将执行第三方开发人员编写的代码,因此可能是危险的。恶意开发人员可能会创建并注册一个看似无害的 DuckDB 扩展,从而窃取您的加密货币。如果您正在运行一个使用 DuckDB 执行用户不受信任的 SQL 的 Web 服务,我们建议禁用社区扩展。为此,请运行:
SET allow_community_extensions = false;
禁用已知扩展的自动安装和自动加载
默认情况下,DuckDB 会自动安装和加载已知扩展。要禁用已知扩展的自动安装,请运行:
SET autoinstall_known_extensions = false;
要禁用已知扩展的自动加载,请运行:
SET autoload_known_extensions = false;
要锁定此配置,请使用lock_configuration
选项
SET lock_configuration = true;
始终要求已签名扩展
默认情况下,DuckDB 要求扩展要么是核心扩展(由 DuckDB 开发人员创建)要么是社区扩展(由第三方开发人员创建但由 DuckDB 开发人员分发)并已签名。allow_unsigned_extensions
设置可以在启动时启用,以允许加载未签名的扩展。虽然此设置对于扩展开发很有用,但启用它将允许 DuckDB 加载任何扩展,这意味着必须更加小心,以确保不加载恶意扩展。