sql注入與防止SQL注入之引數化處理
阿新 • • 發佈:2018-11-25
sql注入的兩種情況:
操作程式碼:
import pymysql user = input('使用者名稱: ').strip() pwd = input('密碼: ').strip() # 連結 conn = pymysql.connect(host='localhost', user='root', password='123', database='db1', charset='utf8') # 遊標 cursor = conn.cursor() # 執行完畢返回的結果集預設以元組顯示 # cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)# 執行sql語句 sql = 'select * from t1 where name="%s" and pwd="%s"' % (user, pwd) # 注意%s需要加引號 print(sql) res = cursor.execute(sql) # 執行sql語句,返回sql查詢成功的記錄數目 print(res) cursor.close() conn.close() if res: print('登入成功') else: print('登入失敗')
正常情況
使用者名稱: zj 密碼: 123 select * from t1 where name="zj" and pwd="123" 1 登入成功
sql注入
1、sql注入之:使用者存在,繞過密碼
使用者名稱: zj" -- saaa 密碼: a select * from t1 where name="zj" -- saaa" and pwd="a" 1 登入成功
2、sql注入之:使用者不存在,繞過使用者與密碼
使用者名稱: 12e" or 1=1 -- asddas 密碼: select * from t1 where name="12e" or 1=1 -- asddas" and pwd="" 1 登入成功
防止SQL注入之引數化處理
優化後的程式碼
import pymysql user = input('使用者名稱: ').strip() pwd = input('密碼: ').strip() # 開啟資料庫連線 conn = pymysql.connect(host='localhost', user='root', password='123', database='db1', charset='utf8') # 建立一個遊標物件 cursor = conn.cursor() # 引數化處理 sql = "select * from t1 where name=%s and pwd=%s" # 注意%s需要去掉引號,因為pymysql會自動為我們加上 print(sql) res = cursor.execute(sql, [user, pwd]) # 執行sql語句,返回sql查詢成功的記錄數目 print("res:", res) # 關閉遊標 cursor.close() # 關閉資料庫 conn.close() if res: print('登入成功') else: print('登入失敗')
正確輸入
使用者名稱: zj 密碼: 123 select * from t1 where name=%s and pwd=%s res: 1 登入成功
sql注入,失敗示例
使用者名稱: zj" -- sad 密碼: a select * from t1 where name=%s and pwd=%s res: 0 登入失敗