day36

pymsql 模塊

1. pymsql的使用

import pymysql  # 導入 pymysql 模塊

# 鏈接數據庫
conn = pymysql.connect(host = 'IP', user = '用戶名', password = '密碼', database = '數據庫名稱', charset = 'utf8')

# 遊標
cursor = conn.cursor()  # 執行完畢後返回的結果默認以元祖的形式展現
# cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # 執行完畢後返回的結果以字典的形式展現,推薦使用

# 執行 SQL 指令
sql = 'SQL指令'   # 若是須要傳入參數,在指令裏面使用佔位符,在下面的 cursor.execute(sql) 函數中,將參數按順序寫在 sql 後面  
res = cursor.execute(sql,(參數...))   # 執行 SQL指令,返回查詢成功的記錄

conn.commit()   # 若是對數據庫裏的數據作改動,必須加這一行

# 斷開數據庫的鏈接
cursor.close()
conn.close()

1.1 增

import pymysql  # 導入 pymysql 模塊

# 鏈接數據庫
conn = pymysql.connect(host = 'IP', user = '用戶名', password = '密碼', database = '數據庫名稱', charset = 'utf8')

# 遊標
 # cursor = conn.cursor()   # 執行完畢後返回的結果默認以元祖的形式展現
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 執行完畢後返回的結果以字典的形式展現

'''
1.增長一條數據
# 執行 SQL 指令
sql = 'insert into user (name,password) values (%s, %s)'    # 添加數據的 SQL指令   
res = cursor.execute(sql,('tom','123')) # 將 SQL指令和數據發給 mysql,執行後拿到結果

conn.commit()   # 提交

2.增長多條數據
# 準備要添加的數據
data = [
    ('name1','password1'),
    ('name1','password1'),
    ('name1','password1')
    ]

sql = 'insert into user (name,password) values (%s, %s)'    # 添加數據的 SQL指令   

res = executemany(sql, data)    # 將 SQL指令和數據發給 mysql,執行後拿到結果

conn.commit()
'''

# 斷開數據庫的鏈接
cursor.close()
conn.close()

1.2 改

import pymysql  # 導入 pymysql 模塊

# 鏈接數據庫
conn = pymysql.connect(host = 'IP', user = '用戶名', password = '密碼', database = '數據庫名稱', charset = 'utf8')

# 遊標
# cursor = conn.cursor()    # 執行完畢後返回的結果默認以元祖的形式展現
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 執行完畢後返回的結果以字典的形式展現

# 執行 SQL 指令
sql = 'update user set name=%s where id=%s' # 修改數據的 SQL指令
res = cursor.execute(sql,('jack',2))    # 將 SQL指令和數據發給 mysql,執行後拿到結果

conn.commit()   # 若是對數據庫裏的數據作改動,必須加這一行

# 斷開數據庫的鏈接
cursor.close()
conn.close()

1.3 刪

import pymysql  # 導入 pymysql 模塊

# 鏈接數據庫
conn = pymysql.connect(host = 'IP', user = '用戶名', password = '密碼', database = '數據庫名稱', charset = 'utf8')

# 遊標
# cursor = conn.cursor()    # 執行完畢後返回的結果默認以元祖的形式展現
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 執行完畢後返回的結果以字典的形式展現

# 執行 SQL 指令
sql = 'delete from t3 where id=%s'  # 刪除數據的 SQL指令
res = cursor.execute(sql,(1,))  # 將 SQL指令和數據發給 mysql,執行後拿到結果

conn.commit()   # 若是對數據庫裏的數據作改動,必須加這一行

# 斷開數據庫的鏈接
cursor.close()
conn.close()

1.4 查

import pymysql  # 導入 pymysql 模塊

# 鏈接數據庫
conn = pymysql.connect(host = 'IP', user = '用戶名', password = '密碼', database = '數據庫名稱', charset = 'utf8')

# 遊標
# cursor = conn.cursor()    # 執行完畢後返回的結果默認以元祖的形式展現
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 執行完畢後返回的結果以字典的形式展現

# 執行 SQL 指令
sql = 'delete from t3 where id=%s'  # 查詢數據的 SQL指令

cursor.execute(sql,(1,))    # 將 SQL指令和數據發給 mysql,執行後拿到結果

res = cursor.fetchone()         # 取出查詢結果的一條數據,字典
res = cursor.fetchall()         # 取出查詢結果的全部數據,列表套字典
res = cursor.fetchmany(size)     # 指定取出查詢結果的數量,列表套字典

print(res)  # 打印查詢結果

# 斷開數據庫的鏈接
cursor.close()
conn.close()

2. pymysql的注入攻擊

爲何在編寫 SQL指令時,參數須要使用 execute() 函數傳入,而不是直接在 SQL指令裏面構造好,就是爲了防止 SQL注入攻擊。python

2.1 原理

經過構建特殊的輸入值做爲參數,從而完成欺騙 MySQL ,進而執行惡意的 SQL指令。mysql

若是將 SQL指令寫成以下形式:
sql = "select * from user where name='%s' and password='%s'" % (user, pwd)  # (user,pwd)由用戶輸入
咱們將 user 和 pwd 輸入「admin' or '1」 咱們就能意外的進入到登陸頁面以後了

當用戶輸入
select * from [users] where username= 'admin' or '1' and password='admin' or '1'
根據SQL中邏輯運算的優先級,or低於and,最後的or ‘1’永遠成立,因此該條件表達式結果爲True,
此語句同等於select * from [users]

2.2 防範的方法

  1. 不要相信用戶的輸入,對用戶輸入的信息作校驗,好比特殊字符等...
  2. 使用 pymsql 提供的 execute() 函數傳入用戶輸入的參數,這個函數會自動對用戶輸入的信息進行校驗
  3. 對重要數據進行加密處理
相關文章
相關標籤/搜索