天天看點

Python:MySQL與python的互動,防止sql注入

python中使用MySQL的子產品

import pymysql

python中使用MySQL的基本流程

Python:MySQL與python的互動,防止sql注入

·

python中使用MySQL的代碼模闆

from pymysql import *

# 建立connection連接配接
conn = connect(host="localhost",port=3306,user="root",password="mysql",database="本地資料庫名稱", charset="utf8")

# 獲得cursor對象
cs = conn.cursor()

# 輸入sql語句,cout中儲存的是通過sql語句受到影響的行數
cout = cs.execute("sql語句")

# 列印sql語句擷取的内容
cs.fetchone() # 一次列印一條内容(以元組的形式)
cs.fetchmany(numb) # 一次列印numb條内容(以元組的形式)
cs.fetchall() # 一次列印所有内容(以元組的形式)

# 當寫入的sql語句是增删改時,commit()方法用來送出之前多次執行過的execute(sql語句(增删改))方法
conn.commit()

# 關閉cursor對象
cs.close()

# 關閉連接配接
conn.close()
           

·

注:這裡如果用pymysql無法建立connection本地連接配接,出現錯誤(

pymysql.err.OperationalError: (1045, u"Access denied for user 'root'@'localhost' (using password: No)")

可在終端進入mysql,并輸入

原因:

更換密碼的認證方式,新版mysql使用的caching_sha2_password,換成mysql_native_password就可以連上了

·

·

● 當

execute()

中寫入的sql語句為增删改時,每執行一句

execute()

,資料庫中并不會顯示寫入的操作,隻有在最後調用

conn.commit()

方法時,才會将之前所執行過的所有

execute()

進行送出,進而對資料據庫進行操作

● 為了防止多個程式同時對一個資料庫進行增删改,最後調用

commit()

方法必挂,所有每執行一句

execute(sql語句)

時,該表的auto_increment會自動增加

● 在調用

conn.commit()

方法之前,如果想撤銷之前的增删改操作,則可以調用

conn.rollback()

,此方法必須在

commit()

方法調用之前調用才有效,但是即便撤銷了,auto_increment 數值也已經發生了改變

·

·

關于sql注入

在使用者進行查詢時,使用者輸入的内容會填到sql語句中然後對資料庫進行操作,當使用者輸入的内容(例如

' or 1=1 or '

)比對到sql語句中可配通,(這裡整句話相當于true),則可直接對資料庫進行操作

例:

s_name = input("請輸入要查詢的内容:")
self.cs.execute("""select * from goods where name="%s";""" % s_name)
print(self.cs.fetchall())
           

實驗結果:

Python:MySQL與python的互動,防止sql注入
Python:MySQL與python的互動,防止sql注入

·

簡單防止sql注入

s_name = input("請輸入要查詢的内容:")
# execute方法會自動将清單中的元素替換到sql語句中的%s
self.cs.execute("select * from goods where name=%s;", [s_name])
print(self.cs.fetchall())

           

實驗結果:

Python:MySQL與python的互動,防止sql注入
Python:MySQL與python的互動,防止sql注入
Python:MySQL與python的互動,防止sql注入
Python:MySQL與python的互動,防止sql注入