標籤:通過 -- close art 相對 user rowid 用戶端 base
一 介紹
之前我們都是通過MySQL內建的命令列用戶端工具mysql來操作資料庫,那如何在python程式中操作資料庫呢?這就用到了pymysql模組,該模組本質就是一個通訊端用戶端軟體,使用前需要事先安裝
pip3 install pymysql
二 連結、執行sql、關閉(遊標)
import pymysqluser=input(‘使用者名稱: ‘).strip()pwd=input(‘密碼: ‘).strip()#連結conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123‘,database=‘egon‘,charset=‘utf8‘)#遊標cursor=conn.cursor() #執行完畢返回的結果集預設以元組顯示#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#執行sql語句sql=‘select * from userinfo where name="%s" and password="%s"‘ %(user,pwd) #注意%s需要加引號print(sql)res=cursor.execute(sql) #執行sql語句,返回sql查詢成功的記錄數目print(res)cursor.close()conn.close()if res: print(‘登入成功‘)else: print(‘登入失敗‘)
三 execute()之sql注入
根本原理:就是根據程式的字串拼接name=‘%s’,我們輸入一個XXX‘--haha’,用我們輸入的XXX加‘在程式中拼接成一個判斷條件name=‘XXX‘--haha‘
最後那一個空格,在一條sql語句中如果遇到select * from t1 where id>3 -- and name=‘egon‘;則--之後的條件被注釋掉了# 1、sql注入之:使用者存在,繞過密碼egon‘ -- 任一字元# 2、sql注入之:使用者不存在,繞過使用者和密碼xxx‘ or 1=1 -- 任一字元
使用者名稱存在,直接登入成功
使用者名稱不存在,繞過使用者和密碼
解決方案:
# 原來是我們對sql進行字串拼接# sql="select * from userinfo where name=‘%s‘ and password=‘%s‘" %(user,pwd)# print(sql)# res=cursor.execute(sql)#改寫為(execute幫我們做字串拼接,我們無需且一定不能再為%s加引號了)sql = "select * from userinfo where name =%s and password=%s" # 注意%s需要去掉引號,# 因為pymysql 會自動為我們加上res = cursor.execute(sql,[user,pwd]) # pymysql模組自動幫我們解決sql注入的問題print(res)
四 增、刪、改:conn.commit()
import pymysql# 連結conn = pymysql.connect(host=‘192.168.159.128‘, user=‘root‘, password=‘pertest‘, database=‘luffycity‘, charset=‘utf8‘)# 遊標cursor = conn.cursor()# 執行sql語句# 新增# part1# sql = "insert into userinfo(name,password) values (‘mike‘,‘123‘);"# res = cursor.execute(sql) # 執行sql語句,返回sql影響成功的行數# print(res)# par2sql = "insert into userinfo(name,password) values (%s,%s);"res = cursor.execute(sql, ("mike2", "123")) # 執行sql語句,返回sql影響成功的行數print(res)# par3,插入多行sql = "insert into userinfo(name,password) values (%s,%s);"res = cursor.executemany(sql, [("mike2", "123"), ("mike3", "123"), ("mike4", "123")]) # 執行sql語句,返回sql影響成功的行數print(res)conn.commit() # 提交後才發現表中插入記錄成功cursor.close()conn.close()
五 查:fetchone,fetchmany,fetchall
import pymysql# 連結conn = pymysql.connect(host=‘192.168.159.128‘, user=‘root‘, password=‘pertest‘, database=‘luffycity‘, charset=‘utf8‘)# 遊標cursor = conn.cursor()# 執行sql語句sql = ‘select * from userinfo;‘rows = cursor.execute(sql) # 執行sql語句,返回sql影響成功的行數rows,將結果放入一個集合,等待被查詢# cursor.scroll(3, mode=‘absolute‘) # 相對均對位置移動# cursor.scroll(3, mode=‘relative‘) # 相對當前位置移動res1 = cursor.fetchone()res2 = cursor.fetchone()res3 = cursor.fetchone()res4 = cursor.fetchmany(2)res5 = cursor.fetchall()print(res1)print(res2)print(res3)print(res4)print(res5)print(‘%s row in set(0.00 sec)‘ % rows)conn.commit()cursor.close()conn.close()
五 擷取插入的最後一條資料的自增ID
import pymysql# 連結conn = pymysql.connect(host=‘192.168.159.128‘, user=‘root‘, password=‘pertest‘, database=‘luffycity‘, charset=‘utf8‘)# 遊標cursor = conn.cursor()sql = ‘insert into userinfo(name, password) values ("mike6", "123");‘rows = cursor.execute(sql)print(cursor.lastrowid) # 在插入語句後查看conn.commit()cursor.close()conn.close()
資料庫:pymysql模組