天天看點

python web 資料庫sql注入

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