1. 程式人生 > 資料庫 >sql注入問題(mysql)

sql注入問題(mysql)

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()

 

  演示第一種執行結果(在知道使用者名稱、不知道密碼的情況下,獲取該使用者的資訊):

 

  演示第二種執行結果(在不知道使用者名稱、也不知道密碼的情況下,獲取所有使用者的資訊):

 

 

   正確演示: