J'ai une petite application Web Python/Flask qui retourne des données d'une table SQLite au format CSV. J'ai trouvé qu'il est plus rapide d'utiliser le programme de ligne de commande sqlite3
pour exporter les résultats de la requête directement dans un fichier CSV puis retourner le fichier CSV que pour lire les résultats de la requête en Python, les écrire dans un fichier en mémoire, puis retourner le fichier en mémoire. Cependant, l'utilisation du programme sqlite3
signifie que je dois créer les requêtes moi-même, en soumettant mon application aux attaques par injection SQL.Construire une requête SQLite en Python mais l'exécuter en utilisant le programme de ligne de commande sqlite3?
plus rapide, mais vulnérables aux attaques par injection SQL
queries = """
.mode csv
.headers on
.output /tmp/results.csv
SELECT * FROM mytable WHERE foo = '{0}';
""".format(user_input)
subprocess.check_output(
["sqlite3", "/path/to/mydb.sqlite"], input=bytes(queries.encode("utf-8")))
return send_file("/tmp/results.csv", mimetype="text/csv")
Safe de l'injection SQL, mais plus lent
conn = sqlalchemy.create_engine("sqlite:////path/to/mydb.sqlite")
result = conn.execute("SELECT * FROM mytable WHERE foo = ?", (user_input,))
csvfile = io.StringIO()
csvwriter = csv.writer(csvfile)
csvwriter.writerow(result.keys())
for row in result.fetchall():
csvwriter.writerow(row)
return Response(csvfile.getvalue(), mimetype="text/csv")
Est-il possible que je peux utiliser une bibliothèque Python (sqlalchemy, le module sqlite3, ou toute autre chose) pour construire une requête qui soit sûre de l'injection SQL mais qui n'exécute pas réellement la requête, de sorte que je puisse à la place exécuter la requête via un sous-processus en utilisant le sqlite3
programme de ligne de commande?