MySQL基礎(五):pymysql模塊使用、sql注入

下面是小凰凰的簡介,看下吧!
💗人生態度:珍惜時間,渴望學習,熱愛音樂,把握命運,享受生活
💗學習技能:網絡 -> 雲計算運維 -> python全棧( 當前正在學習中)
💗您的點贊、收藏、關注是對博主創作的最大鼓勵,在此謝過!
有相關技能問題可以寫在下方評論區,我們一起學習,一起進步。
後期會不斷更新python全棧學習筆記,秉着質量博文爲原則,寫好每一篇博文。

一、pymysql模塊基本操作

1、安裝pymysql

1.安裝:pip3 insatll pymysql

2、代碼鏈接mysql

import pymysql
conn=pymysql.connect( # 鏈接
  host='localhost',
  database='db2',
  user='root',
  password='mysql',
  charset='utf8')

# cursor=conn.cursor() # cursor遊標,執行完畢返回的結果集默認以元組顯示,一般採用字典顯示
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  # 以字典的方式顯示數據

3、pymysql操作數據庫

user = input(">>>:").strip()
pwd = input(">>>:").strip()
sql=select * from userinfo where name="%s" and password="%s"%(user,pwd) # 注意%s需要加引號

rows=cursor.execute(sql) # 執行sql語句,返回sql查詢成功的記錄數目,如果查詢沒有匹配的內容,返回0

# 獲取真實數據記錄:cursor.fetchone(),cursor.fetchall(),cursor.fetchmany();
# 獲取真實數據記錄,類似文件read操作,它也會類似有指針移動
cursor.fetchone() # 讀取一條記錄,指針移向下一行記錄
cursor.fetchmany(2) # 指定讀取行數爲2,讀取兩行數據,指針更新到第四行開頭
cursor.fetchall() # 讀取指針後面的所有內容。這裏讀取到的就是第四、五行的記錄

# 控制指針移動
cursor.scroll(1,'relative')  # 相對移動,以當前指針位置爲指針移動的起點,往後移動一條記錄
cursor.scroll(-1,'relative') # 相對移動,以當前指針位置爲指針移動的起點,往前移動一條記錄
cursor.scroll(3,'absolute')  # 絕對移動,以數據的開頭作爲指針移動的起點,往後移動三條記錄

cursor.close() # 回收遊標對象
conn.close() # 關閉與mysql數據庫的鏈接

4、看下整體效果

import pymysql
conn=pymysql.connect(
  host='localhost',# 這裏也可以填雲服務器地址,不需要指明ssh登錄信息。
  database='db2',
  user='root',
  password='mysql',
  charset='utf8')
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
rows=cursor.execute('select * from teacher')
print(rows) # rows也可以理解爲上述sql語句執行過後顯示的記錄條數
print(cursor.fetchone())
print(cursor.fetchmany(2))
print(cursor.fetchall()) # 到這裏我們應該把內容打印完了
cursor.scroll(-1,'relative') # 但是這裏指針回移了一條記錄
print(cursor.fetchall()) # 因此這裏把最後一條記錄打印出來了

# 運行結果
5
{'tid': 1, 'tname': '張磊老師'}
[{'tid': 2, 'tname': '李平老師'}, {'tid': 3, 'tname': '劉海燕老師'}]
[{'tid': 4, 'tname': '朱雲海老師'}, {'tid': 5, 'tname': '李傑老師'}]
[{'tid': 5, 'tname': '李傑老師'}]

5、增刪改操作

增刪改操作 都必須在rows=cursor.execute(sql)下一行加一句
conn.commit()操作
# 注:增刪改操作,不同於查詢操作,它需要對數據進行操作,因此需要謹慎。
# 因此cursor.execute(sql)只是在內存中操作數據,並沒有寫入數據庫(或者說硬盤),因此需要commit進行確認提交到硬盤!

二、SQL注入

1、使用mysql存儲用戶密碼,實現登錄驗證

在這裏插入圖片描述在這裏插入圖片描述
我專門創建了個存儲用戶登錄信息的表。

import pymysql
conn=pymysql.connect(
  host='localhost',# 這裏也可以填雲服務器地址,不需要指明ssh登錄信息。
  database='db1',
  user='root',
  password='mysql',
  charset='utf8')
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('請輸入用戶名 >>>') # 爲了學習,不加strip,不然無法實現用戶名、密碼都不正確登錄成功!
password = input('請輸入密碼 >>>')
sql = 'select * from userinfo where username="%s" and password="%s"' %(username,password)
# 注意上面的%s必須加引號,而且爲了區別外層的單引號,需使用雙引號
rows = cursor.execute(sql)
if rows: # rows不爲空,說明查詢記錄條數不爲0,說明的確有這個用戶,且密碼正確
	print('登錄成功!')
else:
	print('用戶名或者密碼不正確!')

在這裏插入圖片描述成功!

2、sql注入之用戶名正確,密碼錯誤登錄成功

# 用戶名正確
請輸入用戶名 >>> 吳晉丞" -- 後面被註釋了 # 這裏的一個雙引號是爲了不讓--被雙引號失去註釋的意義,多餘的那個雙引號被註釋了
密碼不需要輸入,直接回車

在這裏插入圖片描述看,不需要密碼也能成功!實際的sql語句如下:

select * from userinfo where username="吳晉丞" -- 後面被註釋了" and password="%s"
# 相當於 select * from userinfo where username="吳晉丞"
# 這個執行肯定有記錄顯示,因此rows不爲0,登錄成功,sql注入成功!

3、sql注入之用戶名、密碼都錯誤也能登錄成功

# 用戶名密碼都不對的情況
username >>>: xxx" or 1=1 -- 後面都被註釋了

在這裏插入圖片描述也成功了!實際SQL語句如下:

select * from userinfo where username="xxx" or 1=1 -- 後面都被註釋了" and password="%s"
# 相當於 select * from userinfo where username="xxx" or 1=1
# username="xxx" or 1=1恆成立!rows不爲0,因此登錄成功

4、防止SQL注入措施

(1) 使用代碼過濾特殊字符,達到防止的效果
import pymysql
conn=pymysql.connect(
  host='localhost',
  database='db1',
  user='root',
  password='mysql',
  charset='utf8')
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('請輸入用戶名 >>>')
password = input('請輸入密碼 >>>')
sql = 'select * from userinfo where username=%s and password=%s' # 不需要%替換,因此去掉雙引號
rows = cursor.execute(sql,(username),password) # 這裏把用戶名、密碼傳入,會過濾特殊字符,後替換sql中的%s
if rows:
	print('登錄成功!')
else:
	print('用戶名或者密碼不正確!')

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述防止SQL注入成功!

(2)註冊時防止

其實上述代碼防止還不夠好,因爲最後你還是會訪問數據庫,給數據庫帶來不必要的壓力。帶特殊符號的用戶名檢測到,就應該立即返回登錄失敗
日常生活中的各種軟件,我們註冊用戶時,基本上用戶名都不允許使用特殊符號,這是爲什麼呢?因爲特殊符號不允許存在,一檢測到有特殊字符就立馬返回登錄失敗了!

有人可能有疑問,上面說用戶名不允許,密碼就能允許嗎?

答:對,日常生活中各個軟件的用戶名的密碼都是允許特殊字符的,有些還會要求必須使用特殊字符、數字、字母的組合!

注意:生產環境中,數據庫存的不是密碼,是一個hash值,密碼只有你自己知道,你輸入的密碼,也會被hash之後傳給sql語句,然後進行驗證,因此不存在sql注入問題。

還記得進入mysql設置root用戶密碼的操作吧?

update mysql.user set password=password(123456) where user = 'root'
# 這裏的password(123456),就是對123456做hash再傳給password存進數據庫!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章