首頁>技術>

安裝pymysql模組

python操作mysql需要安裝pymysql模組:

pip install pymysql
連線資料庫

建議使用with這種方式,有兩條好處:一是可以不用另外寫close語句關閉連線,二是在異常退出時也能保證關閉連線。

題外話,python非常強調簡潔和一致性,檔案開啟、關閉;socket連線、關閉;mysql連線、關閉等等都建議使用with。

import pymysqlwith pymysql.connect(host='mysql的ip', user='你的使用者名稱', password='你的密碼', database='day5')\        as conn, conn.cursor() as cur:  # 連線資料庫的物件名字是conn;連線資料庫的遊標物件名字是cur。
查詢

使用execute方法執行SQL語句:

cur.execute('select * from score')

獲取查詢結果全部內容。注意這種方式非常佔記憶體,一般不使用這種方式:

ret = cur.fetchall()  # 返回結果是元組,fetchall方法返回所有記錄print(ret)

獲取查詢結果,逐條處理。推薦使用這種方式:

for i in range(cur.rowcount):  # rowcount是查詢結果的記錄數量    print(cur.fetchone())  # fetchone方法返回一條記錄

獲取查詢結果,指定返回記錄數:

ret = cur.fetchmany(50)  # 返回50條記錄print(ret)ret = cur.fetchmany(50)  # 返回剩下50條記錄print(ret)
增刪改

使用execute方法執行SQL語句,注意增刪改涉及到修改資料,execute方法執行完畢後還要執行commit方法提交後才會真正生效:

cur.execute('insert into student values (17,"男","熊大")')conn.commit()

注意,改動資料庫可能會遇到報錯的情況,上述程式碼並不完整。通常完整的結構如下:

try:    cur.execute('insert into student values (17,"男","熊大")')    conn.commit()  # 提交改動資料的操作except Exception as e:    print(e)  # 遇到報錯時列印報錯資訊或寫入日誌檔案    conn.rollback()  # 上述改動資料的操作遇到報錯時執行回滾
防注入

關於防SQL語句注入要先看案例再來說明:

假設有一個應用,登入時需要使用者提供使用者名稱和密碼。Python程式收到使用者輸入的使用者名稱和密碼後再提交到MySQL資料庫進行比對,若使用者名稱和密碼正確則允許登入,錯誤則拒絕登入。

一、建立測試用的庫和表:
create database test_login;use test_login;create table login(name char(12),password char(12));insert into login values('張三','123456');
二、未防範SQL注入的錯誤程式碼案例:
import pymysqlwith pymysql.connect(host='127.0.0.1', user='你的賬戶', password='你的密碼', database='test_login') \        as conn, conn.cursor() as cur:    usr = input('請輸入使用者名稱:')    pwd = input('請輸入密碼:')    condition = f'select * from login where name="{usr}" and password="{pwd}"'    print(condition)    cur.execute(condition)    if cur.rowcount:        print('登入成功')    else:        print('登入失敗')
三、測試SQL注入,在輸使用者名稱時輸入 1" or 1=1; #,請看下圖:請認真看上面列印的sql語句內容:

請認真看上面列印的sql語句內容:

select * from login where name="1" or 1=1; #" and password="1"

請注意sql語句中#表示註釋後面的全部內容,所以MySQL服務端真正執行的語句如下:

select * from login where name="1" or 1=1;

看到這相信大家都能明白為啥無論密碼輸入什麼都能登入成功,以上就是著名的SQL注入。上面的案例僅僅是示範如何繞過安全驗證,實際上透過SQL注入甚至可以刪庫、刪表造成整個系統崩潰。所以我們寫程式碼時必須要防範SQL注入!

四、防範SQL注入的正確程式碼:
import pymysqlwith pymysql.connect(host='127.0.0.1', user='你的賬戶', password='你的密碼', database='test_login') \        as conn, conn.cursor() as cur:    usr = input('請輸入使用者名稱:')    pwd = input('請輸入密碼:')    condition = 'select * from login where name="%s" and password="%s"'    print(condition)    cur.execute(condition, (usr, pwd))  # execute方法有2個引數,第一個是SQL語句,第二個是元組(元組的成員是多個引數)    if cur.rowcount:        print('登入成功')    else:        print('登入失敗')
五、測試SQL注入

此時可以看到SQL注入不會失效,請牢記execute防範SQL注入的正確方法!!!寫程式碼務必不要出現可以SQL注入的巨大漏洞!!!

補充一條:可以在使用者輸入使用者名稱和密碼時進行檢測,不允許使用者名稱和密碼中出現;和#這2個符號。這樣也可以有效地防範SQL注入!

18
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python之資料分析