2017-05-03 11 views
0

sql-queryは、pythonモジュールで生成されます。
データベースはPostgreSQLです。 SQLクエリで注入なしの部分文字列との比較

ストリングとの比較があります:

''' 
SELECT * 
FROM TableTemp 
WHERE "SomeColumn" LIKE '%{0}%' 
'''.format(<some_string>) 

文字列の場合:

%' -- 

次にチェックは常に "真" を返します。
さらに、これはSQLインジェクションを行う機会です

プロンプトでは、検索時に考慮された文字列をどのように正しく処理できますが、要求はクラッシュせず、SQLインジェクションもありましたか?

UPD:
質問が解決しました。解説の決定

答えて

1

.execute()の2番目の引数として、文字列全体をpsycopg2に渡します。参考:http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

import psycopg2  

conn = psycopg2.connect("dbname=test user=postgres") 
curs = conn.cursor() 
search_term = 'some string' 
search_tuple = ('%{0}%'.format(search_term,) # note that this has to be a container 
curs.execute('''select 
       from TableTemp 
       where SomeColumn like %s''',search_tuple).fetchall() 

デモ:

>>> conn.execute('select * from t').fetchall() 
[(u'10:00',), (u'8:00',)] 
>>> conn.execute('select * from t where c like ?',('%8%',)).fetchall() 
[(u'8:00',)] 
>>> conn.execute('select * from t where c like ?',('%:%',)).fetchall() 
[(u'10:00',), (u'8:00',)] 
+0

おかげで、この答えは、データベースへの自己参照に適しています。 私は、SQLリクエストと一連のパラメータを持つ行だけを転送する可能性のあるフレームワークを使用しています。パラメータは型を指定することができますが、私には合いません。 文字をセルフシールドするオプションがありましたが、最も良い解決策は、二重引用符で囲まれた引用符を置き換えることでした。 –

関連する問題