2011-08-31 76 views
1
  1. 是來自MySQL的MATCH也容易受到注入攻擊? 例如:MySQL中的Python,MATCH和注入攻擊

    """SELECT * 
        FROM myTable 
        WHERE MATCH(myColumnName) AGAINST(%s) 
        ORDER BY id 
        LIMIT 20""" % query 
    

    似乎允許任意的字符串,這很糟糕。

  2. 如果是這樣,我已經改爲設法 - 按照Python文檔的例子 -

    t = (query,) 
    statement = """SELECT * 
           FROM myTable 
           WHERE MATCH(myColumnName) AGAINST(?) 
           ORDER BY id 
           LIMIT 20""" 
    cursor.execute(statement, t) 
    

    但不返回任何 - 即使串query在上述(1)返回命中。這是爲什麼?

  3. 2),使用佔位符%s代替?返回結果。爲什麼這比1)更安全(如果有的話)?例如。與查詢字符串我可以隨時關閉一個字符串和括號query=')...'並繼續query=') OR otherColumnName LIKE '%hello%' --

因此,是否足以去除除羅馬字符或數字之外的所有內容的查詢字符串?

+0

使用上面準備好的查詢 - 使用'?'確保字符串在需要時被視爲引用/轉義。 – viraptor

+0

[樣本](http://sscce.org/)不完整。在2.中,查詢的價值是什麼?你期望它匹配什麼?請注意,雖然在示例中無關緊要,但不要使用['SELECT *'](http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select)在生產代碼中;只選擇你需要的列。 – outis

+0

碰巧,我需要表中的所有列。我可以通過命名所有列來拼出相同的結果。 – SK9

回答

4

它並沒有多大無論什麼操作符,函數,條款或當它涉及到注入你使用任何其他host-language條款。注入是混合數據和語言語句的問題,當您將數據插入語句時會發生這種情況。準備好的語句參數保持數據和語句分離,所以它們不容易被注入。

至於?%s爲參數,Cursor.execute的MySQLdb的文件說以下內容:

 execute(self, query, args=None)

[...]

注意:如果參數表是一個序列,然後%S必須用作查詢中的參數佔位符。如果使用映射,則必須使用%(鍵)作爲佔位符。

1

當使用具有參數的參數化語句時,MySQLdb會轉義參數並使用Python字符串格式化將這些參數重新插入到參數化語句中。然後單個字符串語句被髮送到服務器。 你是靠MySQLdb的的能力,正確逃生參數來防止SQL注入:

MySQLdb的/ cursors.py:

def execute(self, query, args=None): 
    ... 
    if args is not None: 
     query = query % db.literal(args) 

相比之下,oursql sends queries and data to the server completely separately。 它不依賴於轉義數據。這應該更安全。

1

第一種方法是不正確的,因爲它使用基本的python字符串格式,不會轉義查詢字符串。

第二種方法是向服務器發送簡單查詢的首選方法,它將正確地轉義查詢。

你只是有一個簡單的錯誤。您需要AGAINST(%s)

的信息,以取代AGAINST(?)在蟒蛇還發現DbApi FAQ

+0

Python MySQL不會在這裏接受'?'作爲佔位符嗎? – SK9

+1

'connect'的'paramstyle'參數應該能夠設置合適的期望 –

0

對於我而言這足以消毒query串 - 條如果所有非字母數字字符(特別是')) 。