系列文章目錄
文章目錄
- 系列文章目錄
- 一、pymysql模塊
- 二、SQL注入及解決方法
一、pymysql模塊
-
作用:
該模塊可以幫助我們使用python代碼,操作資料庫,
-
安裝:
該模塊是第三方模塊,需要手動安裝:
python3 -m pip install PyMySQL -
語法:
# 匯入模塊 import pymysql # 建立與MySQL服務器的連接 conn = pymysql.connect(host='localhost', # MySQL服務器的主機地址 port=3306, # 埠號 user='root', # 用戶名 password='123456', # 密碼 database='task', # 目標資料庫 charset='utf8mb4' # 編碼,不要加“-”,否則報錯 ) # 創建游標 # 游標是專門用于執行sql陳述句的 cursor = conn.cursor() # sql陳述句,不要忘記分號 sql = 'INSERT INTO user(name,age) values(%s,%s);' try: # 執行sql陳述句 cursor.execute(sql,('hugh',17)) # 提交對資料庫的修改 conn.commit() except: # 執行回滾 conn.rollback()- 第24行,
execute()方法,第一個引數是要執行的SQL陳述句;第二個引數是SQL陳述句需要的值(在sql陳述句中用%s占位),采用元組形式傳入,
其實,這里的SQL陳述句是字串,我們完全可以采用格式化輸出的方式直接修改,之所以這樣大費周章的采用傳引數的形式,是為了防止SQL注入,這個SQL注入會在下一節講,
execute()方法的回傳值是SQL陳述句影響的記錄行數,比如,插入了4行記錄,就回傳4,一般用不到這個回傳值, - 如果要一次插入多個值,就改用
executemany()方法,傳入的引數采用串列包含元組的形式:sql = 'INSERT INTO user(name,age) values(%s,%s)' cursor.executemany(sql,[('張三',11),('李四',21),('王五',31)]) - 第26行,在提交修改前,所有的修改操作都只是作用于記憶體當中臨時的資料庫,不是真正的資料庫,一旦提交修改,才會應用到硬碟中保存的真正的資料庫,
- 第30行,回滾用于SQL陳述句執行失敗的時候,它會將撤銷所有的修改操作,讓資料庫(不是真正的資料庫,是記憶體當中臨時的資料庫)恢復到執行SQL陳述句之前的模樣,
- 第24行,
-
獲取SQL的執行結果:
這些方法通常只在查詢操作中使用:# 獲取sql的查詢結果,回傳值為元組型別 cursor.fetchone() # 獲取一行記錄 cursor.fetchmany(數量) # 獲取指定數量的記錄 cursor.fetchall() # 獲取所有記錄-
回傳值默認為元組型別,比如:
((1, 'hugh', 'male', 18), (2, 'tom', 'male', 33)), -
在創建游標時,向
cursor()方法傳入引數cursor=DictCursor,可以使查詢結果以字典形式回傳,其中,鍵就是欄位名:
[{'id': 1, 'name': 'hugh', 'gender': 'male', 'age': 18}, {'id': 2, 'name': 'tom', 'gender': 'male', 'age': 33},, -
游標取完第n條記錄后,會向后移動到第n+1條記錄的位置,下次再獲取時,會從n+1條開始繼續獲取,
-
移動游標:
游標.scroll(偏移量, 模式)偏移量代表移動的步數,正數代表向后移,負數代表向前移;
模式有兩種:
相對位移——
relative:從當前位置開始移動;絕對位移——
absolute:從第一條記錄的位置開始移動,
-
-
呼叫存盤程序:
游標.callproc(存盤程序名稱, (存盤程序的實參串列))
二、SQL注入及解決方法
永遠不要信任用戶的任何輸入!
-
SQL注入的概念:
SQL注入是一種常見的網路攻擊手法,它利用sql的語法特性和程式員撰寫程式時產生的漏洞,完成一些如跳過密碼驗證等的非法操作,
-
舉例:
比如,在撰寫登錄模塊時,我們使用了如下查詢陳述句來查詢用戶資訊:
SELECT * FROM usrs WHERE username=用戶輸入的用戶名 AND password=用戶輸入的密碼;并且,我們沒有對用戶的輸入做任何處理,直接放到了SQL陳述句中,那么,當黑客輸入了
xxx' OR 1=1 -- haacyugjavh作為用戶名時,原來的SQL陳述句就會變成下面的樣子:SELECT * FROM usrs WHERE username='xxx' OR 1=1 -- haacyugjavh' AND password=;username='xxx' OR 1=1是一個恒成立的條件,所以無論輸入什么用戶名都會回傳True;而--后面的陳述句被當作注釋忽略掉了,密碼驗證也被跳過,最終,黑客成功登錄, -
解決方法:
不要手動拼接sql陳述句,而是交給pymysql去處理,
先用
%s占位:sql = 'SELECT * FROM usrs WHERE username=%s AND password=%s;'再在執行sql陳述句時,以元組形式傳入用戶輸入:
cursor.execute(sql,(username,password))pymysql會自動處理用戶輸入,防止SQL注入,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294398.html
標籤:其他
