python-pymysql防止sql注入攻擊介紹


pymysql

pymysql 是一個第三方模塊,幫我們封裝了 建立表/用戶認證/sql的執行/結果的獲取

import pymysql

# 步驟
'''
1. 連接服務端
2. 用戶認證
3. 發送指令
4. 提取結果
'''
# 1.連接服務器,獲取連接對象(本質上就是封裝好的socket)
conn = pymysql.connect(
    host = "127.0.0.1",  # 如果是本機,可以忽略
    port = 3306,         # 如果沒有改過,可以忽略
    user = "root",
    password = "123",
    db = "test_7_17"
)
# 2.通過連接拿到游標對象
# 默認返回的游標是元祖類型,不方便使用,更換為字典類型的游標
c = conn.cursor(pymysql.cursors.DictCursor) 

# 3.執行sql
sql = "select * from user"

# 返回的是查詢結果數量
count = c.execute(sql)

# 4.提取結果
print(c.fetchall()) # 查看所有

c.scroll(-2,mode="relative") # 因為查看完后,游標已經到最后面,所有要再次查看,就要移動游標,relative表示相對位置,即游標現在所在位置,-2表示,往前移動2個位置

print(c.fetchone()) # 查看一個值 默認是第一個,

c.scroll(0,mode="absolute") # absolute 表示絕對位置,即從第一個位置開始,0表示將游標移動到第一個位置

print(c.fetchmany(2)) # 查詢多個括號內加參數,2表示查詢2個值

# 5 關閉連接
c.close()
conn.close()

sql 注入攻擊

​ 指的是一些程序員,在輸入數據時,按照sql的語法規范,提交了用於攻擊性目的的數據

如果避免這個問題?

​ 在服務端執行sql前 先做sql的驗證

​ 在pymysql中,已經封裝了驗證操作,我們只需要將參數交給pymysql來做拼接即可.

import pymysql

conn = pymysql.connect(
    host = "127.0.0.1",
    port = 3306,
    user = "root",
    password = "123",
    db = "test_7_17"
    # autocommit = False  # 如果改成True 就表示開啟自動提交,不常用,pymysql中默認開啟事務,所以我們必須在每次執行完成后,commit提交下
)
c = conn.cursor(pymysql.cursors.DictCursor)

name = input("name>>>").strip()
pwd = input("pwd>>>").strip()
# 不能把變量名直接放到sql執行語句中,防止sql攻擊
sql = "select * from user where name = %s and pwd = %s"

count = c.execute(sql,(name,pwd))

if count:
    print("登陸成功")
else:
    print("登陸失敗")
print(c.fetchall())
c.scroll(-2,mode="relative")

print(c.fetchone())
c.scroll(0,mode="absolute")
print(c.fetchmany(2))

調用存儲過程

# 創建存儲過程
delimiter |
create procedure add1(in a int, in b int, out c int)
begin
set c = a + b;
end |
delimiter ;


# pymysql 中調用
import pymysql
conn = pymysql.connect(
    host = "127.0.0.1",
    port = 3306,
    user = "root",
    password = "123",
    db = "test_7_17")

c= conn.cursor(pymysql.cursors.DictCursor)
c.callproc("add1",(1,2,5)) # 1 對應 @_add1_0 ,2 對應 @_add1_1 , 5 對應 @_add1_2
c.execute("select @_add1_2") # 所以返回結果的調用得用第三個變量
print(c.fetchall())

# 調用存儲過程時,傳入參數,會自動定義成變量,
# 命名方式,@_過程的名稱_參數的索引, 從0開始


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM