一 安裝
pip3 install pymysql
二 操作(連接,遊標,執行,注入的bug)
import pymysql
# 先要創建用戶
# grant all on *.* to "root"@"localhost" identified by "123"; # 創建賬戶加授權
# flush privileges; # 刷新
user = input("Username:").strip()
password = input("Password:").strip()
# 建立鏈接
conn = pymysql.connect(
host="localhost",
user="root",
password="123",
database="user",
charset="utf8"
)
# 遊標
cursor = conn.cursor() # 以元組顯示結果
# cursor = conn.cursor(pymysql.cursor.DictCursor) # 以字典形式顯示
# 執行
sql = 'select * from userinfo where name="%s" and password="%s"' % (user, password) # 注意%s需要加引號
print(sql)
res = cursor.execute(sql) # 執行sql語句,返回sql查詢成功的記錄數目
print(res)
cursor.close() # 關閉遊標
conn.close() # 關閉鏈接
Note:在注入execute來執行時存在bug。
根據程序的字符串拼接name='%s',我們輸入一個xxx' -- haha,用我們輸入的xxx加'在程序中拼接成一個判斷條件name='xxx' -- haha' # -- 在mysql表示註釋,後面的不會被執行。
#1、sql注入之:用戶存在,繞過密碼
egon' -- 任意字符
#2、sql注入之:用戶不存在,繞過用戶與密碼
xxx' or 1=1 -- 任意字符
解決方法:
不再自己拼接字符串,讓pymysql的內置模塊來實現。
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引號,因爲pymysql會自動爲我們加上
res=cursor.execute(sql,[user,pwd]) #pymysql模塊自動幫我們解決sql注入的問題,只要我們按照pymysql的規矩來。
三 增,刪,改
sql='insert into userinfo(name,password) values("root","123456");'
res=cursor.execute(sql)
print(res)
sql = 'insert into userinfo(name,password) values(%s,%s);'
res = cursor.execute(sql, ("root", "123456"))
print(res)
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 可插入多條記錄
print(res)
conn.commit() # 提交後才發現表中插入記錄成功
四 查
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 rows in set (0.00 sec)' %rows)
五 關於自增id的查看
sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入語句後查看
查看的是插入或刪除前的最近id號。