我写了一个小的C#/ .Net应用程序,它能够读取Firefox的cookies.sqlite文件。自从我升级到Firefox 4后,我的应用程序无法打开数据库文件:
执行“connection.Open();”行(在下面的代码示例中)会有一个说明:
的执行“打开的文件不是数据库文件。文件已加密或不是数据库”
这是我的程序代码:
class Program
{
static void Main()
{
const string PATH_TO_DATABASE = @"C:\Users\Boris\Desktop\TEMP\cookies.sqlite";
const string CONNECTION_STRING = @"Data Source=" + PATH_TO_DATABASE;
if (!File.Exists(PATH_TO_DATABASE)) return;
using (SQLiteConnection connection = new SQLiteConnection(CONNECTION_STRING))
{
connection.Open();
using (SQLiteCommand command = new SQLiteCommand("SELECT id, name, host, path FROM moz_cookies", connection))
{
using (SQLiteDataReader read = command.ExecuteReader())
{
while (read.Read())
{
string id = read[0].ToString();
string name = read[1].ToString();
string host = read[2].ToString();
string path = read[3].ToString();
Console.WriteLine("ID: " + id);
Console.WriteLine("Name: " + name);
Console.WriteLine("Host: " + host);
Console.WriteLine("Path: " + path);
}
}
}
}
}
}
我正在使用.Net Wrapper DLL for Sqlite v.3.6.23.1。 该应用程序的目标框架是.Net 2.0。
使用名为SqliteExpert的应用程序,我能够毫无问题地打开sqlite数据库。
如果有人有想法会很棒!
此致 鲍里斯
答案 0 :(得分:7)
Firefox 4.0使用SQLite版本3.7.4。 (要查看此信息,请在“执行SQL”选项卡中下载SQLite Manager并运行select sqlite_version();
。)
v3.7.4似乎创建了v3.6.23.1无法读取的数据库。我无法在release notes中明确说明这一点,但通过将cookies.sqlite文件与格式发生变化的file format documentation进行比较可以清楚地看到。具体来说,根据文档,字节19(0x13)应为1
,但cookies.sqlite文件中的该字节为2
。根据文件:
如果读取大于1的值 SQLite,然后库将拒绝 打开数据库。
就像描述的“写版本”一样 以上,此字段存在以方便 某种程度的前向兼容性, 万一需要它。如果一个 在。中创建的SQLite版本 未来使用的文件格式可能不会 被旧的SQLite安全阅读 版本,然后将设置此字段 大于1的值。
要读取数据库,您需要使用最新版本的SQLite;遗憾的是System.Data.SQLite近一年没有更新。该项目后来被sqlite.org接管,但是downloads are not currently available。
如果您不想等待sqlite.org发布基于v3.7.x的.NET包装器,您可以尝试下载source并手动将SQLite.NET/SQLite.Interop/src/sqlite3.c
升级到最新版本合并C源文件(可用here)。
编辑:正如sdwilsh所述,Firefox 4.0使用Write-Ahead Logging;正如新记录模式的描述所述:
因此,如果是旧版本的SQLite 尝试连接到SQLite 在WAL中运行的数据库 模式,它将报告错误 “文件加密或是 不是数据库“。
答案 1 :(得分:3)
我遇到了同样的问题。以前我使用Python脚本(使用sqlite集成)从cookies.sqlite和perms.sqlite文件中获取数据。后者仍然可以正常工作。实际上,除了cookies.sqlite和places.sqlite之外,所有其他.sqlite文件都是可读的。这两个产生“加密或不是数据库”错误。
我没有搜索Python(或sqlite3)的升级,而是为.sqlite文件创建了一个补丁。这个C代码将偏移18和19处的字节从2更改为1.我在Cygwin下的Windows上运行它,但它应该在Unix / Linux上编译和运行。
警告:请勿对原始Firefox cookies.sqlite文件执行此操作。 而是将其复制到临时文件,然后在副本上运行补丁。
// ffpatch.c
// Edits the specified Firefox .sqlite file.
// Changes 0x0202 to 0x0101 at offset 18/19.
// BEFORE
// 0000000 S Q L i t e f o r m a t 3 \0
// 0000020 004 \0 002 002 \0 @ \0 \0 005 034 \0 \0 \0 N
// AFTER
// 0000000 S Q L i t e f o r m a t 3 \0
// 0000020 004 \0 001 001 \0 @ \0 \0 005 034 \0 \0 \0 N
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#define PROGNAME "ffpatch"
#define MY_OFFSET 18
int main (int argc, char *argv[])
{
int fd;
char buf[2];
off_t offset;
ssize_t wsize;
if (argc != 2)
{
fprintf(stderr, "usage: %s sqlite-file\n", PROGNAME);
exit(1);
}
if ((fd = open(argv[1], O_RDWR)) == -1)
{
fprintf(stderr, "cannot open %s\n", argv[1]);
exit(1);
}
if ((offset = lseek(fd, MY_OFFSET, SEEK_SET)) != MY_OFFSET)
{
fprintf(stderr, "lseek() failed\n");
exit(1);
}
buf[0] = 1;
buf[1] = 1;
wsize = write(fd, buf, 2);
close(fd);
exit(0);
}
答案 2 :(得分:2)
您好,非常感谢您的回答!
我以这种方式使我的应用程序工作:
1。 我在这里下载了当前ADO.NET Connector for .NET 4.0的源代码:http://system.data.sqlite.org/index.html/timeline?r=trunk
也许您必须首先使用匿名用户名和capcha作为密码登录网站。
2。 我通过下载安装此ADO.NET连接器获得了sqlite3.dll v.3.7.4的预编译版本:http://www.devart.com/dotconnect/sqlite/ (您也可以使用ADO.NET连接器库来替换system.data.sqlite.org中的连接器。 我自己只对sqlite3.dll感兴趣。)
3。 从system.data.sqlite.org编译源代码后,我将生成的System.Data.Sqlite.dll和sqlite3.dll复制到我的应用程序输出目录。请注意,这两个DLL都是针对x86或x64机器编译的。
此致
答案 3 :(得分:-1)
我想我遇到了你的问题。您的数据库连接正常。首先,您使用的是哪个版本的dotnetFramework
?因此,您可以下载并使用System.Data.SQLite.dll
文件到您的参考文献,然后您的问题可能会得到解决。我认为你使用的是较旧的System.Data.SQLite.dll
文件(与你的dot net版本不符)。