psycopg の mogrify 関数のように、InfluxDB Python クライアントで SQL インジェクションの安全な方法でパラメーターを使用する正しい方法はありますか?
- https://github.com/influxdata/influxdb-python/
- http://initd.org/psycopg/docs/cursor.html#cursor.mogrify
以下はかなり危険なようです。
def mogrify(query, params):
return query % tuple(params)
次のようなことが行われたとしたらどうでしょうか。
query = """ SELECT foo FROM bar WHERE baz = %s AND bat = %s """
params = ('safe_param', 'not_so_safe_param; DROP MEASUREMENT bar;')
result_set = client.query(mogrify(query, params))
return result_set
(これが実際に機能するかどうかはわかりませんが、要点はわかります。)
現在、私は簡単な社内ソリューションを検討しています:
def mogrify(query, params):
clean_params = list()
for param in params:
param = ''.join(char for char in param if char.isalnum() or char in ('-', '_', '.'))
clean_params.append(param)
return query % tuple(clean_params)
(英語の) 文字、数字、アンダースコア、単純なハイフン、またはピリオド以外のものはすべて削除されます。次の回答に基づく: https://stackoverflow.com/a/5843560/604048
これで私のユースケースはカバーされると思いますが、害を及ぼす可能性のある危険なコーナーケースがあるかどうかはわかりません。レコードについては、これらのクエリを実行しているユーザーには読み取りアクセスしかありません。しかし、私はむしろこの事実に頼りたくありません。将来、誰かがユーザーに昇格した権限を与える可能性があります。
安全だと思いますが、何か他のことをする必要がありますか? これはむしろ、暗号化やハッシュ化のような独自のものを実行しないように人々に言われるケースの 1 つに思えます。