2013-04-24 167 views
1

我有這樣一段代碼:pgdb防止注入攻擊嗎?

db = pgdb.connect(
    database=connection['database'], 
    user=connection['user'], 
    host=connection['host']) 
cursor = db.cursor() 
# ask database 
query = ''' 
    SELECT a, b, c 
    FROM table 
    WHERE a ILIKE %s;''' 
try: 
    cursor.execute(query, userInput) 
except pgdb.Error, error: 
    error = str(error) 
    print json.dumps({ 
     'errorMessage': 'ERROR: %s' % error 
    }) 

我已閱讀another forum像MySQLdb的Python模塊都逃脫防止對注入攻擊。我也瀏覽了documentation on pgdb,但它非常薄。最後,我試圖用我自己的測試數據庫來做自己的注射攻擊,但我不確定我的測試是否足夠。什麼是測試這個的好方法?

回答

1

當您使用execute method時,所有DB-API模塊都可以防止SQL注入,並且所有變量輸入保留在參數列表中(在您的示例中爲userInput,這很安全)。

事實證明,對於pgdb這樣做的方式確實是通過轉義每個參數來獲取SQL文字值,然後將它們注入到SQL查詢中的佔位符中。這不一定是這種情況:某些數據庫連接器可以將參數作爲單獨的結構傳遞給它們的服務器,而不是查詢字符串的一部分,並且這樣做有潛在的性能優勢。最終,儘管您不應該關心使用什麼方法 - 您將參數分別傳送到DB-API連接器,並且有責任以安全的方式進行工作。

當然,如果您自己開始將變量放入查詢中(例如"WHERE a ILIKE '%s'" % userInput),pgdb或任何其他連接器都無法阻止您傷害自己。