[Python-de] Firefox Cookie auslesen (sqlite3)

Stefan Schwarzer sschwarzer at sschwarzer.net
Di Jun 24 06:09:39 CEST 2014


Hi Robin,

On 2014-06-24 01:07, Robin Koch wrote:
> ich bin neu in der Gruppe

herzlich willkommen! :-)

> ---
> import sqlite3
> 
> dblocation = r'd:\temp\sqlite\cookies.sqlite'
> query = r"""SELECT value FROM moz_cookies
>              WHERE baseDomain LIKE 'website.com' AND name = 'userid'"""
> 
> db = sqlite3.connect(dblocation)
> cur = db.cursor()
> 
> cur.execute(query)
> ---
> 
> Der execute-Aufruf führt leider zu folgendem Fehler:
>
> ---
> DatabaseError: file is encrypted or is not a database
> ---
> 

Zuerst habe ich mich gewundert, dass der Fehler erst bei
`execute` auftritt. Ein Test mit einer Nicht-Datenbank führt
aber bei mir auch erst beim `execute` zur Exception.

> Internetrecherche auf zu diesem Problem hat mich nicht viel 
> weitergeführt. Entweder hieß es die Datei wäre durch Firefox gegen 
> Zugriff gesperrt oder die SQLite-Version wäre veraltet.

Um das Problem einzugrenzen, könntest du eine Datenbank aus
dem Kommandozeilen-Client frisch anlegen und testen, ob du
`SELECT`s auf dieser Datenbank laufen lassen kannst. Wenn
das geht, liegt es schon mal sehr nahe, dass es etwas mit
der Firefox-Datenbank-Datei zu tun hat.

Ich kann meine `cookies.sqlite` (unter Fedora Linux)
problemlos öffnen und mit `SELECT` Werte auslesen. Dafür
habe ich die Datei in ein gesondertes Verzeichnis kopiert.

> Nun, die Datei ist in Ordnung, es wird nicht darauf zugegriffen und mit 
> dem SQLite Manager aus Firefox sowie direkt mit dem 
> sqlite3-Kommandozeilentool kann ich problemlos darauf zugreifen.[1]
> 
> Die SQLite-Versionsnummer lauten:
> sqlite.version_info = 2.6.0

Ich nehme an, dass sollte `sqlite3.version_info` sein? Oder
wo kommt der Wert sonst her?

> sqlite3.sqlite_version_info = 3.6.21

Zum Vergleich: Bei mir sind die Werte

sqlite3.version_info -> (2, 6, 0)
sqlite3.sqlite_version_info -> (3, 8, 3)

> [1] In der Tat löse ich das Problem im Moment durch
> 
> subprocess.check_output(["sqlite3.exe",  dblocation, query])

Das spricht ja auch stark dafür, dass es nicht mit der
Datenbank-Datei zu tun hat. Noch "sicherheitshalber" die
Frage: Handelt es sich bei den Zugriffen aus Python und über
die Kommandozeile um ein und dieselbe Datenbank-Datei
(gleiche Position im Dateisystem) oder könnte die von Python
aus genutzte Datei bei einem Kopiervorgang beschädigt worden
sein?

Viele Grüße
Stefan


Mehr Informationen über die Mailingliste python-de