私は、CSV形式のSQLiteテーブルからデータを返す小さなPython/Flask Webアプリケーションを持っています。 sqlite3
コマンドラインプログラムを使用してクエリ結果を直接CSVファイルにエクスポートし、クエリ結果をPythonに読み込んでメモリ内のファイルに書き込んでから、CSVファイルを返す方が速いことがわかったメモリ内ファイル。しかし、sqlite3
プログラムを使用すると、私は自分のアプリケーションをSQLインジェクション攻撃にさらしてクエリを構築する必要があります。PythonでSQLiteクエリを作成しますが、sqlite3コマンドラインプログラムを使用してSQLiteクエリを実行しますか?
より速く、しかし
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")
SQLインジェクションから安全な、しかし遅く
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")
SQLインジェクション攻撃に対して脆弱私はPythonライブラリ(sqlalchemyのを、使用することができる方法はありますSQLインジェクションから安全ですが、実際にはクエリを実行しないクエリを作成するために、代わりに0を使用してサブプロセスを介してクエリを実行することができますコマンドラインプログラム?