7
votes

Base de données SQLITE3 sécurisée en lecture seule

Je veux donner à mes utilisateurs à mon site Web un accès unique en lecture seule à un Base de données SQLITE3, sans les laisser écrire dans la base de données ou faire autres dommages. Comment?

Faire du fichier db en lecture seule aide un peu, mais des commandes comme "Attachez", ".LOPT" et ".Output" permettent aux personnes de lire / écrire d'autres fichiers, qui peuvent ne pas être protégés.

Bien sûr, si je connaissais toutes ces commandes, je ne voudrais que filtrer contre eux, Mais je suis surtout inquiété des ordres que je n'ai pas pensé.

J'ai essayé brièvement de modifier le code source de SQLite3 pour interdire les écrivies, mais Ceci est plus difficile qu'il ne semble que: Même l'instruction SELECT apparaît à faire quelques inserts internes / etc.

Note: J'ai considéré des attaques à DOS et ulmimiterez CPITIME à 5s ou quelque chose. Ma principale préoccupation est des dommages aux fichiers / "piratage", pas à DOS.

chroot () peut fonctionner, mais semble extrême.

pensées?

edit: wow, ai-je vraiment demandé cela il y a 3 ans et plus?

Depuis lors, J'ai réellement écrit un programme pour faire cela.

que je pense est raisonnablement en sécurité (mais je pourrais me tromper).

Voici une requête d'échantillon.


1 commentaires

Je suppose que je cherche vraiment une "méta-solution" ici. Par exemple, si je manquais tout mon système sur un CD en lecture seule, je n'aurais pas à vous soucier de ce que SQLite3 peut / ne peut pas faire. C'est trop extrême dans mon cas, mais l'idée générale est que je souhaite trouver une solution qui fonctionne avec les propriétés SQLITE3.


4 Réponses :


1
votes

Bien sûr, si je savais tout ce que commandes, je voudrais juste filtrer contre eux, mais je suis surtout inquiet pour commandes que je n'ai pas pensées.

Avez-vous envisagé d'utiliser un whitelist au lieu d'une liste noire? Autoriser uniquement des déclarations commençant par sélectionner ou expliquer.


3 commentaires

Oui, mais vous Vous n'avez pas à le permettre. Au lieu de SQLITE3_EXEC, utilisez des déclarations préparées, qui n'exécutent qu'une seule déclaration à la fois.


Une requête d'écriture utilisateur est l'exactement opposé des déclarations préparées.


Je pense que je suis ok w / o plusieurs requêtes en une fois, mais je suis toujours inquiet pour les requêtes imbriquées. Cependant, si le fichier en lecture seule, cela peut être correct. Je vérifierai si SQLite3 répond à "Sélectionner * à partir de (joindre ...)" Tapez les requêtes. Je suis également inquiet pour (par exemple) des points-virgules qui feront de toutes les requêtes de SQLite. Bien sûr, je peux filtrer contre des points-virgules, mais vous obtenez l'idée générale.



0
votes

Assurez-vous que votre utilisateur dispose d'un accès en écriture et que d'autres utilisateurs (en particulier l'utilisateur que le serveur Web fonctionnant sous) n'a que lire l'accès au fichier lui-même. Comment cela fait-il que cela dépend de votre plate-forme (Linux, Windows, etc.)


1 commentaires

À droite. Cette partie est facile. La partie difficile: les commandes SQLITE3 peuvent accéder à d'autres fichiers (par exemple, Joindre).



0
votes

Créez votre fichier de base de données Lecture uniquement dans le système d'exploitation. Une fois que vous avez fait que SQLite ne peut pas le remplacer. Si vous avez toujours des problèmes, ce n'est pas un problème SQLite. Ils pourraient toujours être en mesure de trouver un problème PHP / CGI / etc, mais c'est la nature de la bête de sécurité.


2 commentaires

Malheureusement, pas vrai (c'était mon plan initial). Les commandes telles que Joindre peuvent accéder à d'autres fichiers.


Si votre environnement n'autorise pas l'accès à d'autres fichiers, ils ne peuvent pas le faire. Pouvez-vous l'exécuter dans une prison chroot?



1
votes

Vous n'avez pas mentionné comment vous donnez accès à la base de données SQLITE.

Si vous le faites via l'API C (par exemple, écrire un CGI en C qui prend une requête SQL brute, le transmet à SQLite, puis renvoie tout ce qui a été renvoyé), puis les commandes DOT comme ".charger" pas concerné. Celles-ci sont implémentées par le Programme SQLITE3 Shell et ne fonctionnera pas lorsque vous appelez directement les fonctions d'API C.

Dans ce cas, vous pouvez appeler sqlite3_open_v2 passant sqlite_open_readonly comme l'un des drapeaux pour empêcher la base de données d'être écrite.

La commande jointe peut être désactivée en appelant SQLITE3_LIMIT () pour définir SQLITE_LIMIT_ATTACHED sur 1 pour éviter de joindre une deuxième base de données de réussir. Depuis le Détacher instruction "détache une connexion de base de données supplémentaire précédemment jointe à l'aide de l'instruction ATTRAIND" Cela ressemble à ceci empêcherait-en-même de détacher la base de données d'origine afin de contourner cette restriction.

Autant que je puisse dire de regarder le SQL compris par SQLite , cela devrait fermer tous les trous. Vous voudrez peut-être courir sur le Pragmas avec un peigne à dents fine juste pour vous assurer, s'il y a Est-ce que tout ce que j'ai manqué m'a laissé savoir et je mettrai à jour cette réponse.


0 commentaires