2010-09-17 17 views
6

Quiero otorgar a mis usuarios de sitios web acceso arbitrario de solo lectura a una base de datos SQLite3 , sin dejarlos escribir en la base de datos ni hacer ningún otro daño . ¿Cómo?Base de datos sqlite3 de solo lectura segura

Hacer el archivo db sólo lectura ayuda un poco, pero al igual que los comandos "ATTACH", ".load" y ".output" permiten a las personas para leer/escribir archivos de otros , que no pueden ser protegidos.

Por supuesto, si conociera todos estos comandos, simplemente me gustaría filtrar en contra de ellos, , pero me preocupan más los comandos que no he pensado.

traté brevemente para alterar el código fuente de sqlite3 para no permitir las escrituras, pero esto es más difícil de lo que parece: aunque la instrucción SELECT parece hacer algunas inserciones internas/etc.

Nota:he considerado ataques DOS, y tendrá ulimit cputime a 5s o algo. Mi principal preocupación es dañar los archivos/"piratería", no el DOS.

chroot() puede funcionar, pero parece extremo.

¿Pensamientos?

EDITAR: Guau, ¿realmente pregunté esto hace 3+ años?

Desde entonces, I've actually written a program to do this.

que creo que es razonablemente seguro (pero podría estar equivocado).

Here is a sample query.

+0

Supongo que realmente estoy buscando una "meta-solución" aquí. Por ejemplo, si ejecutara todo mi sistema fuera de un CD de solo lectura, no tendría que preocuparme por lo que sqlite3 puede/no puede hacer. Eso es demasiado extremo en mi caso, pero la idea general es que quiero encontrar una solución que funcione sin depender de las propiedades de sqlite3. – barrycarter

Respuesta

1

Por supuesto, si supiera todas esas comandos, que acababa de filtrar teniendo ellos, pero estoy preocupado por su mayoría comandos no he pensado.

¿Ha considerado utilizar una lista blanca en lugar de una lista negra? Solo permite declaraciones que comienzan con SELECT o EXPLAIN.

+1

sqllite permite el apilamiento de consultas ... – rook

+0

Sí, pero * usted * no tiene que permitirlo. En lugar de sqlite3_exec, use las declaraciones preparadas, que ejecutan solo una declaración a la vez. – dan04

+1

Las consultas de escritura de un usuario son exactamente lo contrario de las declaraciones preparadas. – rook

0

Asegúrate de que tu usuario tenga acceso de escritura y de que otros usuarios (especialmente el usuario con el que se ejecuta el servidor web) solo tengan acceso de lectura al archivo. Cómo hacer esto, por supuesto, depende de su plataforma (Linux, Windows, etc.)

+0

Derecha. Esa parte es fácil. La parte difícil: qué comandos sqlite3 pueden acceder a otros archivos (por ejemplo, ATTACH). – barrycarter

0

Haga que su archivo de base de datos sea de solo lectura en el sistema operativo. Una vez que haya hecho eso, SQLite no puede anularlo. Si todavía tiene problemas, no es un problema de SQLite. Es posible que aún puedan encontrar un problema de php/cgi/etc, pero esa es la naturaleza de la bestia de seguridad.

+0

Lamentablemente, no es cierto (ese era mi plan original). Los comandos como ATTACH pueden acceder a otros archivos. – barrycarter

+0

Si su entorno no permite el acceso a otros archivos, no hay mucho que puedan hacer con él. ¿Puedes ejecutarlo en una cárcel de chroot? – Jay

0

No ha mencionado cómo está proporcionando acceso a la base de datos SQLite.

Si lo hace a través de la API C (por ejemplo, escribiendo un CGI en C que toma una consulta SQL sin procesar, la pasa a sqlite y luego devuelve lo que se devolvió), los comandos de punto como ".load" son sin preocupaciones Estos están implementados por sqlite3 shell program, y no funcionarán al llamar directamente a las funciones de API de C.

En este caso puede llamar al sqlite3_open_v2 pasando SQLITE_OPEN_READONLY como uno de los indicadores para evitar que se escriba la base de datos.

El comando ATTACH se puede deshabilitar llamando a sqlite3_limit() para establecer SQLITE_LIMIT_ATTACHED en 1 para evitar que se adjunte una segunda base de datos. Dado que la declaración DETACH "separa una conexión de base de datos adicional previamente asociada con la declaración ATTACH", parece que esto evitaría que se separe la base de datos original para eludir esta restricción.

Por lo que puedo ver al mirar SQL understood by SQLite, esto debería cerrar todos los agujeros. Es posible que desee ejecutar el pragmas con un peine de dientes finos solo para asegurarse de que, si hay algo que omití, hágamelo saber y actualizaré esta respuesta.

Cuestiones relacionadas