我是 PyMySQL 的新手,只是嘗試執行一個查詢:
c.execute('''INSERT INTO mysql_test1 (
data,
duration,
audio,
comments
) VALUES (
?,
?,
?,
?
);
''', [
comments_var,
duration_var,
audio_var,
comments_var
]
);
但是,它引發了以下錯誤:
TypeError: not all arguments converted during string formatting
我注意到我的變數一定有問題,并閱讀了如何在 PyMySQL 中正確處理它們,期待引數替換的方法,但令我驚訝的是,我找不到任何東西。相反,我發現的每個執行緒都使用了字串操作(例如, here、here、here和here(有一條評論聲稱字串操作將是 PyMySQL 的標準)。
這對我來說很有趣,因為我之前只處理過 DBAPI 檔案明確警告要對變數使用字串操作的 SQLite:
SQL 操作通常需要使用 Python 變數中的值。但是,請注意使用 Python 的字串操作來組裝查詢,因為它們容易受到 SQL 注入攻擊。
檔案用以下代碼片段舉例說明了這一點:
Never do this -- insecure!
symbol = 'RHAT'
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
Instead, use the DB-API’s parameter substitution.
在閱讀PyMySQL 檔案時,我找不到任何關于此類危險的提及。它只是證實了我之前的發現:
如果 args 是串列或元組,則 %s 可以用作查詢中的占位符。如果 args 是 dict,則 %(name)s 可以用作查詢中的占位符。
為什么使用字串操作sqlite3被認為容易受到 SQL 注入攻擊,同時又沒有受到質疑pymysql?
uj5u.com熱心網友回復:
可惜pymysql的設計者選擇了%s作為引數占位符。%s它使許多開發人員感到困惑,因為這與字串格式化函式中使用的相同。但它在 pymysql 中并沒有做同樣的事情。
它不僅僅是做一個簡單的字串替換。Pymysql 將在將它們插入 SQL 查詢之前對這些值應用轉義。這可以防止特殊字符更改 SQL 查詢的語法。
事實上,你也可能會在使用 pymysql 時遇到麻煩。以下是不安全的:
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
因為它在將變數symbol作為引數傳遞給execute(). 唯一的引數是一個完成的 SQL 字串,其中包含格式化的變數。
雖然這是安全的:
cur.execute("SELECT * FROM stocks WHERE symbol = %s", (symbol,))
因為它將包含symbol變數的串列作為第二個引數傳遞。函式中的代碼execute()對串列中的每個元素應用轉義,并將結果值插入到 SQL 查詢字串中。請注意,%s不是由單引號分隔。的代碼execute()負責這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/412137.html
標籤:
上一篇:使用`try:except:`將pandas字串更改為整數或浮點數
下一篇:正則運算式重新查找
