day-44mysql
sql注入
a. 登錄驗證寫sql語句的時候, %傳值的時候, 需要加引號:sql = "select * from t4 where name = '%s' and pwd = '%s'" % (username, pwd)上面的sql語句帶來的風險是:例一:username = zekai' #select * from t4 where name = 'zekai' #' and pwd = '' 例二:username = dbsahvbdsha' or 1=1 #select * from t4 where name = 'dbsahvbdsha' or 1=1上面出現的問題,我們稱之為 SQL注入
出現問題的根源是:
因為太過于相信用戶的輸入, 導致我們在接受用戶輸入的參數的時候, 并沒有對他進行轉義
解決SQL注入:
1. 自己手工對用戶輸入的值進行轉義
2. 使用execute()自動進行過濾
sql = "select * from t4 where name = %s and pwd = %s"
cursor.execute(sql,(username, pwd))
?
#$## 插入一條使用
cursor.execute(sql, ('lxxx', '1234'))
### 插入多條
data = [
('aaaaa', 'aaa'),
('bbbb', 'bbb'),
('ffff', '666'),
('rrrr', '888'),
]
cursor.executemany(sql, data)
try:
cursor.execute(sql, ('lxxx', '1234'))
### 刪除和更新的時候, 需要事物提交
conn.commit()
except Exception as e:
conn.rollback()
cursor.lastrowid : 最后一行的行數
事務
一組操作, 要么都成功, 要么都失敗
特性:
原子性: 一組操作, 要么都成功, 要么都失敗
一致性(Consistency):指事務發生前和發生后,數據的總額依然匹配
隔離性(Isolation):簡單點說,某個事務的操作對其他事務不可見的
持久性(Durability):當事務完成后,其影響應該保留下來,不能撤消,只能通過“另開起一個事物”來抵消之前的錯誤
解決方法:
開啟事務 (start transaction)
(執行sql操作)
commit : 提交上面的SQL, 讓其生效
rollback: 回滾
show full tables; 顯示全部類型
?
視圖
產生的原因:
如果有一個SQL語句頻繁的會被使用到,比如說:
select * from t4 where id>12 and id <24;
搞一個映射,或者取一個別名
select * from t4 where id>12 and id <24 === > v1
視圖:
select * from v1;
創建視圖:
create view v1 as select * from t4 where id>12 and id <24;
修改視圖:
alter view v1 as sql語句;
刪除視圖:
drop view v1;
問題:
如果原生的表數據發生了變化, 那視圖會不會發生變化? 也會變化
視圖中的數據會不會發生修改? 不會發生修改
應用場景:
MySQL: (DBA)
生成視圖View
程序:
調用 select * from v1;
函數:
不要輕易使用
在程序中, 用代碼計算, 計算好了, 再傳給SQL語句執行
存儲過程:
將一大堆 SQL 語句進行封裝, 類似于函數, 結果就是存儲過程
MySQL服務端:
DBA (寫)
觸發器:
向用戶表中添加一條數據的同時, 在日志表中也添加一條記錄
?
轉載于:https://www.cnblogs.com/klw1/p/11032644.html
總結
以上是生活随笔為你收集整理的day-44mysql的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 军人保障卡丢失的危害
- 下一篇: django-model操作数据库(增删