python使用mysql
import pymysql conn = pymysql.connect( host = '127.0.0.1', # 連接地址 port = 3306, #端口 user = root, #用戶名 password = '', #密碼 database = 'db', #庫名稱 charset = 'utf8' #編碼格式 utf8,不是utf-8 ) cursor = conn.cursor(pymsql.cursors.DictCursor) #產生一個游標,以字典的形式返回查詢出來的數據,鍵是表的字段,值是表字段對應的信息 sql = select * from userinfo # 寫sql語句 cursor.execute(sql) # 執行傳入的sql語句 print(cursor.fetchone()) #拿到表中一條數據 print(cursor.fetchone()) print(cursor.fetchone()) cursor.scroll(1,'absolute') #absolute絕對移動,前面數字寫幾,就相對於起始位置向后移動幾位 cursor.srcoll(1,'relative') #relative相對移動,前面寫幾,就相對於當前位置向后移動幾位 print(cursor.fetchall()) #拿到表中所有的數據
sql注入問題
conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) username = input('請輸入用戶名:') password = input('請輸入密碼:') sql = "select * from userinfo where name = '%s' and password ='%s'" %s(username, password) res = cursor.execute(sql) if res: print(cursor.fetchall()) else: print('賬號或密碼錯誤')
我們用上述一段代碼詮釋一下sql注入的問題, 當我們輸入正確的賬號密碼的時候,發現可以正常打印字段數據,當我們輸入錯誤賬號或密碼時,就顯示賬號密碼錯誤
以我們只知道用戶名為例
竟然查到了用戶的所有信息,這個是根據 -- 注釋做到的sql注入
假如我們賬號密碼都不知道,那么如何用sql注入去獲取網站的用戶信息呢
在我們對賬號密碼毫不知情的情況下,我們使用or判斷條件的成立,再加上 --注釋,可以獲取到網站所有的用戶信息
根據以上兩個問題我們應該如何解決呢?
conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) username = input('請輸入用戶名:') password = input('請輸入密碼:') sql = "select * from userinfo where name = %s and password =%s" res = cursor.execute(sql,(username,password)) # execute可以自動識別sql語句中的%s,它可以幫助你過濾特殊的字符,避免sql注入的問題 if res: print(cursor.fetchall()) else: print('賬號或密碼錯誤')
總結:
1.sql注入,就是利用注釋等具有特殊意義的符號,來完成的
2.后續寫sql語句時,不要手動去拼接關鍵性的數據,而是交由execute去拼接
python對mysql的增,改,刪操作
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) sql = "insert into user(name,password) values('wu','123') " #插入,增 cursor.execute(sql) conn.commit() 在新增時要寫conn.commit()
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) sql = "update user set name='qazqaz' where id = 1 " #修改 cursor.execute(sql) conn.commit() #在修改時要寫conn.commit()
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) sql = "delete from user where id = 1 " #刪除 cursor.execute(sql) conn.commit() #在刪除時要寫conn.commit()