python - mysqldb模塊防注入設置

mysqldb有處理sql語句的轉義方法, 我們不用再考慮關於字符轉義的問題

在接收到客戶端用戶發送的表單之後, 如果需要根據用戶輸入來獲取數據, (即需要把用戶提交的一些數據作爲sql語句的一部分), 如果是這樣的話, 我們需要對其防注入處理.


利用MySQLdb.escape_string()方法對用戶輸入字段進行轉義

MySQLdb.escape_string()可以對用戶輸入進行轉義處理, 以便把用戶輸入的數據用作sql語句的一部分.我們可以這麼用

import MySQLdb
conn = MySQLdb.connect(host='localhost', user='root', passwd='', db='test')
user_keyin = 'aaa'
user_keyin = MySQLdb.escape_string(user_keyin)
cur = conn.cursor()
cur.execute("select * form table where col="+user_keyin+"")
我們先把user_keyin(用戶輸入)的字符串用MySQLdb.escape_string()轉義,然後把它加進作爲execute的參數sql語句裏.

注意! MySQLdb.escape_string()在處理中文字符串的時候可能出現錯誤

'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

這是因爲用戶輸入的字符串的字符集是ascll,但是ascll不支持中文, 所以我們可以把python的默認字符集改成utf-8就可以了

# 把它放到代碼最前面
import sys
reload(sys)
sys.setdefaultencoding('utf-8')


利用execute的第二個參數

這種方法更加簡便.

我們可以把用戶輸入編爲一個列表或者元組, 然後直接把它加到execute()的第二個參數裏, 這樣子execute就自動幫我們轉義這些字符串了.看例子

#前面代碼省略
# 這是有效的
cur.execute('select * from table where col=%s',(user_keyin,))

# 這是無效的,請仔細對比一下參數
cur.execute('select * from table where col=%s'% (user_keyin,))
請注意! 第一個參數是sql語句, 而需要插入user_keyin部分則用%s代替(不需要加引號), 還有一個, 如果你是用python的字符串拼接的話, 是無效的, 因爲只有一個參數輸入.

/* 18-1-30 更新 */
上面說到的第二種方法有一個小問題, 就是這種辦法不能把表名給抽離出去, 就是說, 不應該把表名放在第二個參數裏由execute方法自動組成sql語句,會報錯, 這時候只能用第一種(如果需要的話)

以上!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章