firefox places数据库是标准sqlite3格式,存储书签、历史等信息,未加密且可直接用sqlite工具读取;需确保firefox退出后复制places.sqlite操作,核心表为moz_places和moz_bookmarks,时间戳为微秒级unix时间。

Firefox Places数据库是什么格式
Firefox 的 places.sqlite 是一个标准 SQLite3 数据库文件,存储书签、历史记录、标签页会话(部分)、访问次数等信息。它不加密、无特殊封装,只要 Firefox 未运行(否则数据库被锁),就能直接用任何 SQLite 工具读取。
关键点:不是自定义二进制格式,也不是加密 blob;是纯 SQLite,但表结构和字段语义需查证官方或实测,不能靠猜。
如何安全获取并打开 places.sqlite
Firefox 运行时会加写锁,直接打开会报错 database is locked 或返回空结果。必须确保 Firefox 完全退出(包括后台进程),或从配置文件夹复制一份快照。
- Windows 路径通常是:
%APPDATA%\Mozilla\Firefox\Profiles\*.default-release\places.sqlite - macOS:
~/Library/Application Support/Firefox/Profiles/*.default-release/places.sqlite - Linux:
~/.mozilla/firefox/*.default-release/places.sqlite
建议先复制一份再操作,避免干扰浏览器运行。用 sqlite3 命令行或 C++ 的 SQLite3 C API 都可打开 —— 不需要额外解析库。
核心表与常用查询(C++ 中怎么写)
C++ 本身不内置 SQLite 支持,得用 libsqlite3。重点不是“怎么连”,而是“连上后查什么”。Places 的主表是 moz_places(URL 元数据)和 moz_bookmarks(书签树结构),时间戳是微秒级 Unix 时间(非毫秒)。
示例:查最近 10 条访问历史
SELECT url, title, last_visit_date / 1000000 AS visit_time FROM moz_places WHERE last_visit_date > 0 ORDER BY last_visit_date DESC LIMIT 10;
注意:last_visit_date 是微秒,除以 1000000 才是秒级时间戳;moz_bookmarks.type = 1 表示是书签(不是文件夹或分隔线);fk 字段在 moz_bookmarks 中指向 moz_places.id。
容易踩的坑:编码、时区、删除标记
Firefox 存储 URL 和 title 用的是 UTF-8,但某些旧版本或插件可能混入损坏的字节序列;C++ 中用 sqlite3_column_text() 拿到的是 const char*,别直接当 std::string 构造,要检查是否为 NULL。
-
moz_places里有hidden = 1的记录(比如搜索引擎自动补全条目),默认不该显示 -
moz_bookmarks中parent = -1表示根节点,但真实书签树还依赖position排序 - 已删除书签不会立刻从表中清除,而是标记
deleted = 1(在moz_bookmarks中) - SQLite 的
datetime()函数不支持微秒精度,别用它直接转last_visit_date
真正麻烦的从来不是“能不能读”,而是“读出来哪些该信、哪些是中间态、哪些已逻辑删除”——Places 是带状态机的增量同步模型,不是静态快照。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











