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()
演示第一種執行結果(在知道用戶名、不知道密碼的情況下,獲取該用戶的資訊):

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

正確演示:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/217953.html
標籤:其他
