大家都知道在資料庫查詢資料時,是被提示盡量少用字元串查詢資料,而是用(?,?,?)的方式代替,這樣就是為了防sql注入。
那什麼是sql注入呢,我們下面就示範一下:
錯誤執行個體:
sql = '''
SELECT
id,username,email
FROM
users
WHERE
username="{}" and password="{}"
'''.format(usr, pwd)
資料庫中有條資料,username = fei ,password = 1234 ,email = [email protected]
我們這裡usr = fei,pwd = 1234
我們執行正确的資料,傳回,如下:
打開了資料庫
查詢到的資料 [(1, 'fei', '[email protected]')]
這樣就查詢到了需要的資料,但是我們用一條資料庫不存在的資料,usr = fei11,pwd = 1234,如下:
打開了資料庫
查詢到的資料 []
資料為空,因為資料庫根本沒有這條資料!,但是,用sql注入的話,卻可以輕松查到資料
sql注入,隻需要改變一句話:
usr = 'fei11" or "1"="1'
我們再次查詢:
打開了資料庫
查詢到的資料 [(1, 'fei', '[email protected]')]
看見了吧,因為是字元串查詢,是以用個 or 條件就可以輕松擺脫限制查詢到資料。
現在,我們改成正确的代碼:
usr = 'fei11" or "1"="1'
# usr = 'fei222'
pwd = '1234'
sql = '''
SELECT
id,username,email
FROM
users
WHERE
username= ? and password= ?
'''
cursor = conn.execute(sql,(usr,pwd))
usr選擇錯誤的且有注入,然後看結果:
打開了資料庫
查詢到的資料 []
查詢到的為空,是以在資料庫操作中盡量少用字元串插入,防止sql注入。