2010-09-17 2 views
6

Ich möchte meinen Website-Benutzern beliebigen schreibgeschützten Zugriff auf eine SQLite3-Datenbank geben, ohne sie in die Datenbank schreiben zu lassen oder irgendeinen anderen Schaden anzurichten. Wie?Sichere schreibgeschützte sqlite3-Datenbank

Making the db Datei schreibgeschützt hilft ein wenig, aber Befehle wie „Attach“, „.load“ und „.output“ zulassen, dass Menschen lesen/schreiben andere Dateien, die möglicherweise nicht geschützt.

Natürlich, wenn ich alle diese Befehle kannte, würde ich nur gegen sie filtern, , aber ich mache mir hauptsächlich Sorgen über Befehle, an die ich nicht gedacht habe.

ich kurz versucht sqlite3 den Quellcode zu verändern, schreibt zu verbieten, aber das ist schwieriger als es aussieht: auch die SELECT-Anweisung erscheint einige interne EINSÄTZE/etc zu tun.

Hinweis:Ich habe DoS-Angriffe in Betracht gezogen, und wird cputime bis 5s oder etwas ulimit. Mein Hauptanliegen ist der Schaden an Dateien/"Hacking", nicht an DOS.

chroot() kann funktionieren, scheint aber extrem.

Gedanken?

EDIT: Wow, habe ich das wirklich vor 3 Jahren gefragt?

Seitdem I've actually written a program to do this.

die ich denke, ziemlich sicher ist (aber ich könnte falsch sein).

Here is a sample query.

+0

Ich denke, ich bin wirklich auf der Suche nach einer "Meta-Lösung" hier. Wenn ich zum Beispiel mein gesamtes System von einer schreibgeschützten CD aus ausführen würde, müsste ich mir keine Gedanken darüber machen, was sqlite3 kann/kann. Das ist in meinem Fall zu extrem, aber die allgemeine Idee ist, dass ich eine Lösung finden möchte, die abhängig von sqlite3 Eigenschaften funktioniert. – barrycarter

Antwort

1

Natürlich, wenn ich alle diese Befehle wusste, würde ich gegen sie filtern, dass nur, aber ich bin meistens besorgt über Befehle habe ich nicht gedacht.

Haben Sie darüber nachgedacht, eine Whitelist anstelle einer Blacklist zu verwenden? Erlauben Sie nur Anweisungen, die mit SELECT oder EXPLAIN beginnen.

+1

sqllite ermöglicht Abfrage-Stacking ... – rook

+0

Ja, aber * Sie * müssen es nicht zulassen. Verwenden Sie anstelle von sqlite3_exec vorbereitete Anweisungen, die jeweils nur eine Anweisung ausführen. – dan04

+1

Ein Benutzer, der Abfragen schreibt, ist das genaue Gegenteil von vorbereiteten Anweisungen. – rook

0

Stellen Sie sicher, dass Ihr Benutzer Schreibzugriff hat und dass andere Benutzer (insbesondere der Benutzer, unter dem der Webserver läuft) nur Lesezugriff auf die Datei selbst hat. Wie Sie das tun, hängt natürlich von Ihrer Plattform ab (Linux, Windows usw.)

+0

Rechts. Dieser Teil ist einfach. Der schwierige Teil: Welche sqlite3 Befehle können auf andere Dateien zugreifen (zB ATTACH). – barrycarter

0

Machen Sie Ihre Datenbankdatei nur im Betriebssystem lesbar. Sobald Sie das getan haben, kann SQLite es nicht überschreiben. Wenn Sie weiterhin Probleme haben, handelt es sich nicht um ein SQLite-Problem. Sie könnten immer noch ein Problem mit php/cgi/etc finden, aber das ist die Natur des Sicherheitsbiestes.

+0

Leider nicht wahr (das war mein ursprünglicher Plan). Befehle wie ATTACH können auf andere Dateien zugreifen. – barrycarter

+0

Wenn Ihre Umgebung keinen Zugriff auf andere Dateien erlaubt, können sie nicht viel damit machen. Kannst du es in einem Chroot-Gefängnis laufen lassen? – Jay

0

Sie haben nicht erwähnt, wie Sie Zugriff auf die SQLite-Datenbank bereitstellen.

Wenn Sie dies über die C-API tun (z. B. ein CGI in C schreiben, das eine rohe SQL-Abfrage an sqlite übergibt und dann zurückgibt, was zurückgegeben wurde), dann sind die Punktbefehle wie ".load" keine Sorge. Diese werden von sqlite3 shell program implementiert und funktionieren nicht, wenn die C-API-Funktionen direkt aufgerufen werden.

In diesem Fall können Sie sqlite3_open_v2 aufrufen und SQLITE_OPEN_READONLY als eines der Flags übergeben, um zu verhindern, dass die Datenbank geschrieben wird.

Der Befehl ATTACH kann deaktiviert werden, indem sqlite3_limit() aufgerufen wird, um SQLITE_LIMIT_ATTACHED auf 1 zu setzen, um zu verhindern, dass eine zweite Datenbank erfolgreich angehängt wird. Da die Anweisung DETACH "eine zusätzliche Datenbankverbindung, die zuvor unter Verwendung der ATTACH-Anweisung angehängt wurde, löscht", klingt es so, als würde dies verhindern, dass die ursprüngliche Datenbank abgetrennt wird, um diese Beschränkung zu umgehen.

Soweit ich das an der SQL understood by SQLite sehen kann, sollte dies alle Löcher schließen. Vielleicht möchten Sie durch die pragmas mit einem feinen Zahn Kamm laufen, nur um sicherzustellen, wenn es etwas gibt, was ich verpasste, lassen Sie es mich wissen, und ich werde diese Antwort aktualisieren.