pymysql模塊

一 安裝

         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號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章