首頁  >  問答  >  主體

在Python MySQL的IN子句中嵌套一個列表

<p>我知道如何將列表映射為字串:</p> <pre class="brush:php;toolbar:false;">foostring = ",".join( map(str, list_of_ids) )</pre> <p>我知道我可以使用以下方法將該字串放入IN子句中:</p> <pre class="brush:php;toolbar:false;">cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))</pre> <p>我需要以安全的方式(避免SQL注入)在MySQL資料庫中實現相同的功能。在上面的範例中,因為foostring未作為參數傳遞給execute,它是有漏洞的。我還必須在MySQL庫之外進行引用和轉義。 </p> <p>(有一個相關的SO問題,但那裡列出的答案要么不適用於MySQL資料庫,要么容易受到SQL注入攻擊。)</p>
P粉781235689P粉781235689424 天前457

全部回覆(2)我來回復

  • P粉434996845

    P粉4349968452023-08-23 15:50:40

    雖然這個問題很舊,但我想留下回复,以防其他人也在尋找我想要的東西

    當我們有很多參數或想要使用命名參數時,接受的答案會變得混亂

    經過一些嘗試

    ids = [5, 3, ...]  # id列表
    cursor.execute('''
    SELECT 
    ...
    WHERE
      id IN %(ids)s
      AND created_at > %(start_dt)s
    ''', {
      'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
    })
    

    python2.7pymysql==0.7.11下測試通過

    回覆
    0
  • P粉212114661

    P粉2121146612023-08-23 00:26:09

    直接使用list_of_ids

    format_strings = ','.join(['%s'] * len(list_of_ids))
    cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                    tuple(list_of_ids))

    這樣可以避免自己引用,也避免了各種SQL注入問題。

    請注意,資料(list_of_ids)直接傳遞給mysql的驅動程式作為參數(而不是在查詢文字中),因此沒有註入問題。您可以在字串中保留任何字符,無需刪除或引用字符。

    回覆
    0
  • 取消回覆