sql注入問題(mysql)
阿新 • • 發佈:2020-11-16
mysql中的sql注入問題
1、為什麼會出現這種問題?
利用特殊符號和註釋語法來繞過sql校驗
演示:校驗使用者輸入的使用者名稱和密碼來使用資料庫校驗
import pymysql # 與MySQL資料庫建立連線 conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", passwd="123", db="data", charset="utf8", autocommit=True ) # 獲取遊標物件 cursor_obj = conn.cursor(cursor=pymysql.cursors.DictCursor) # 使用者輸入的使用者名稱和密碼 username = input("請輸入使用者名稱>>> ").strip() password = input("請輸入密碼>>> ").strip() # 提交資料並檢驗使用者名稱密碼 sql = "select * from userinfo where username='%s' and password='%s'" % (username, password) # 根據使用者名稱和密碼來查詢是否存在這條資料 print(sql) cursor_obj.execute(sql) res = cursor_obj.fetchall() if res: print(res) else: print("使用者名稱或密碼錯誤!") # 關閉遊標 cursor_obj.close() # 關閉客戶端連線 conn.close()
演示第一種執行結果(在知道使用者名稱、不知道密碼的情況下,獲取該使用者的資訊):
這樣看sql語句可能看不出來什麼,那麼將這一串輸出的sql語句放到Navicat中來看一下:
同一份程式碼,演示第二種執行結果(在不知道使用者名稱、也不知道密碼的情況下,獲取所有使用者的資訊):
將這一串輸出的sql語句放到Navicat中來看一下:
2、解決方法
關鍵性的資料,不要自己手動去拼接,而是交給execute()去做拼接
import pymysql # 與MySQL資料庫建立連線 conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", passwd="123", db="data", charset="utf8", autocommit=True ) # 獲取遊標物件 cursor_obj = conn.cursor(cursor=pymysql.cursors.DictCursor) # 使用者輸入的使用者名稱和密碼 username = input("請輸入使用者名稱>>> ").strip() password = input("請輸入密碼>>> ").strip() # 提交資料並檢驗使用者名稱密碼 sql = 'select * from userinfo where username=%s and password=%s' # 這裡只能用%s來格式化資料,因為後面的execute()只能識別語句中的%s print(sql) cursor_obj.execute(sql, (username, password))# 在execute()方法中傳入username, password引數 res = cursor_obj.fetchall() if res: print(res) else: print("使用者名稱或密碼錯誤!") # 關閉遊標 cursor_obj.close() # 關閉客戶端連線 conn.close()
演示第一種執行結果(在知道使用者名稱、不知道密碼的情況下,獲取該使用者的資訊):
演示第二種執行結果(在不知道使用者名稱、也不知道密碼的情況下,獲取所有使用者的資訊):
正確演示: