1. 程式人生 > >sql注入與防止SQL注入之引數化處理

sql注入與防止SQL注入之引數化處理

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
登入失敗