權限管理
- 創(chuàng)建賬號
- 本地賬號
- create user "dc"@"localhost" identified by "123"; #mysql -udc -p123
- 從遠程賬號
- create user "dc"@"192.168.1.10" identified by "123"; # mysql -udc -p123 -h 服務端IP
- create user "dc"@"192.168.1.%" identified by "123"; # 192.168.1.x 網段都可以訪問
- create user "dc"@"%" identified by "123"; # mysql -udc -p123 -h 服務端IP # 所有網段都可以訪問服務端
- 授權
- 級別從上到下
user:*.*
db:db1.*
tables_priv:db1.t1
columns_priv:id,name
- 例子
grant all on *.* to "dc"@"%";
grant select on *.* to "dc"@"localhost";
revoke select on *.* from "dc"@"localhost";
pymysql
一安裝
pip3 install pymysql
二 鏈接敏释、執(zhí)行sql捞烟、關閉(游標)
import pymysql
user=input('用戶名: ').strip()
pwd=input('密碼: ').strip()
#鏈接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
#游標
cursor=conn.cursor() #執(zhí)行完畢返回的結果集默認以元組顯示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
#執(zhí)行sql語句
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引號
print(sql)
res=cursor.execute(sql) #執(zhí)行sql語句嗽仪,返回sql查詢成功的記錄數目
print(res)
cursor.close()
conn.close()
if res:
print('登錄成功')
else:
print('登錄失敗')
三 execute()之sql注入
注意:符號--會注釋掉它之后的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注入的問題骡尽,只要我們按照pymysql的規(guī)矩來遣妥。
四 增、刪攀细、改:conn.commit()
import pymysql
#鏈接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#游標
cursor=conn.cursor()
#執(zhí)行sql語句
#part1
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) #執(zhí)行sql語句箫踩,返回sql影響成功的行數
# print(res)
#part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) #執(zhí)行sql語句,返回sql影響成功的行數
# print(res)
#part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #執(zhí)行sql語句谭贪,返回sql影響成功的行數
print(res)
conn.commit() #提交后才發(fā)現表中插入記錄成功
cursor.close()
conn.close()
五 查:fetchone境钟,fetchmany,fetchall
import pymysql
#鏈接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#游標
cursor=conn.cursor()
#執(zhí)行sql語句
sql='select * from userinfo;'
rows=cursor.execute(sql) #執(zhí)行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)
conn.commit() #提交后才發(fā)現表中插入記錄成功
cursor.close()
conn.close()
'''
(1, 'root', '123456')
(2, 'root', '123456')
(3, 'root', '123456')
((4, 'root', '123456'), (5, 'root', '123456'))
((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
rows in set (0.00 sec)
'''
五 獲取插入的最后一條數據的自增ID
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
cursor=conn.cursor()
sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入語句后查看
conn.commit()
cursor.close()
conn.close()
mysql內置功能
未完待續(xù)