どのように安全に生成するSQLのように決pythonを使用したdb-api
-
21-09-2019 - |
質問
うことにより組み立ては以下のSQL文を使用pythonのdb-api:
SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';
がBEGINNING_OF_STRINGはpython varする安全に充填し、DB-APIとなります。てみました
beginningOfString = 'abc'
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString)
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)
私のアイデア何が正しい方法です。
解決
これは、可能な場合は、SQLからパラメータを分離するのが最善です。 そして、あなたはパラメータを引用正しいのDBモジュールの世話をさせることができます。
sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
他のヒント
編集:
としてのブライアン-トーマスとは、 遠 と良いことを利用する:
beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )
最初の方法の葉を開けるSQLインジェクション攻撃であった。
左のための歴史
う:
cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
sqlite3ののドキュメントを書き留めます:
通常、SQL操作が必要になります Pythonの変数から値を使用します。 あなたのクエリを組み立てるべきではありません Pythonの文字列操作を使用して そうすることが安全ではないので。させる あなたのプログラムSQLに対して脆弱 インジェクション攻撃ます。
その代わり、DB-APIのパラメータを使用します 置換。置きますか?プレースホルダとして どこに値を使用したい、と 次いでなどの値のタプルを提供 カーソルの2番目の引数 ()メソッドを実行します。 (他のデータベース モジュールが異なるを使用することができます 例えば%S又はプレースホルダ:1)について 例:
# Never do this -- insecure! symbol = 'IBM' c.execute("... where symbol = '%s'" % symbol) # Do this instead t = (symbol,) c.execute('select * from stocks where symbol=?', t) # Larger example for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ]: c.execute('insert into stocks values (?,?,?,?,?)', t)
私はあなたがこれをしたいと考えます:
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
所属していません StackOverflow