大家都知道在數據庫查詢數據時,是被提示儘量少用字符串查詢數據,而是用(?,?,?)的方式代替,這樣就是爲了防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注入。