SQL數據庫常見問題解答及萬能密碼注入原理講解[圖]
【萬能密碼】的原理
用戶進行用戶名和密碼驗證時,網站須要查詢數據庫。查詢數據庫就是執行SQL語句。針對此BBS論壇,當用戶登陸時,後臺執行的數據庫查詢操做(SQL語句)是【Selectuser id,user type,email From users Where user id=’用戶名’ And password=’密碼’】
因爲網站後臺在進行數據庫查詢的時候沒有對單引號進行過濾,當輸入用戶名【admin】和萬能密碼【2’or’1】時,執行的SQL語句爲【Select user id,user type,email From users Whereuser id=’ admin’ And password=’ 2’or1】。同時,因爲SQL語句中邏輯運算符具備優先級,【=】 優先於【and】,【and】 優先於【or】,且適用傳遞性。所以,此SQL語句在後臺解析時,分紅兩句【Select user id,user type,emall From users Where user id=’ admin Andpassword=’2’ 】和【’1’ 】 兩句bool值進行邏輯on運算,恆爲TRUE。SQL語句的查詢結果爲TRUE,就意味着認證成功,也能夠登陸到系統中。html
1.數據庫索引失效的場景:
應儘可能避免在 where 子句中使用 != 或 <> 操做符,不然引擎將放棄使用索引而進行全表掃描;
儘可能避免在 where 子句中使用 or 來鏈接條件
若是列類型是字符串,那必定要在條件中將數據使用引號引用起來,不然不會使用索引;
like的模糊查詢以 % 開頭,索引失效;
應儘可能避免在 where 子句中對字段進行表達式操做
應儘可能避免在 where 子句中對字段進行函數操做
不要在 where 子句中的 「=」 左邊進行函數、算術運算或其餘表達式運算
不適合鍵值較少的列(重複數據較多的列)
不符合最左前綴匹配原則(設置了索引A、B、C,而後查找的時候使用索引B、C)
2.使用存儲過程的優缺點:
優勢:(1)存儲過程在第一次使用的時候就進行編譯,之後每次使用都不須要從新編譯,能夠提升數據庫的執行速度(2)代碼複用性,能夠重複使用(3)當對數據庫進行復雜操做的時候,可將這些複雜操做用存儲過程封裝起來,避免進行一條條的sql語句操做,只須要鏈接一次數據庫則能夠了
缺點:(1)不便於調試(2)沒辦法使用緩存
3.爲何MySQL數據庫索引選擇使用B+樹?
二叉樹的查找速度較快,取決於樹的高度,但因爲數據庫索引存放在磁盤上,當數據量比較大的時候,當咱們利用索引查詢的時候,不能把索引所有加載到內存中,能作的就是逐一加載每個磁盤頁,這裏的磁盤頁對應着索引樹的節點,因此應當減小磁盤IO次數。因此B-樹(平衡的多路查找樹)正能夠解決這個問題,雖然在節點上元素較多,比較的次數較多,但因爲節點上的元素是加載到內存中進行比較的,速度比較快。
4.B+樹相對B-樹的優點:
磁盤IO次數更少(B+樹非葉子節點上存放key值,不存放data,相比B-樹,相同節點可以存放更多的data,也就是說,相同節點的話,B+樹的高度可能比B-樹低------>針對節點數比較多的狀況)
查詢性能更加穩定(B+樹必須從根節點到葉子節點這條路徑,才能找到所需的數據;而B-樹可能在非葉子節點上就找到所需的數據)
範圍查詢更加簡便(B+樹的葉子節點採用一種 順序指針,只須要遍歷一遍,則能夠找到全部的數據,而且查找必定範圍內的值也很方便)
5.MySQL日誌文件分類
錯誤日誌:記錄mysql啓動、運行或者關閉時出現錯誤的信息
查詢日誌:記錄全部對數據庫的操做,包括增刪查改
二進制日誌:記錄修改數據或者引發mysql數據變化的sql語句
慢查詢日誌:記錄查詢時間超過指定閾值的查詢語句
6.MySQL存儲引擎MyISAM與InnoDB區別
每一個MyISAM在磁盤上存儲成三個文件。第一個 文件的名字以表的名字開始,擴展名指出文件類型。
.frm文件存儲表定義;.MYD (MYData)存儲數據;.MYI (MYIndex)存儲索引;
基於磁盤的資源是InnoDB表空間數據文件和它的日誌文件,InnoDB 表的 大小隻受限於操做系統文件的大小,通常爲 2GB
事務:InnoDB支持事務,MyIsam不支持事務
外鍵:InnoDB支持外鍵,MyIsam不支持外鍵
鎖:MyIsam只支持表級鎖;InnoDB支持表級鎖和行級鎖,而且支持MVCC(多版本併發控制)來提升併發的性能(多版本只是解決不可重複讀問題,巴黎聖母院讀書筆記(http://www.simayi.net/dushubiji/6382.html)心得感悟,而加上間隙鎖(也就是它這裏所謂的併發控制)才解決了幻讀問題),自身也作了一些優化,好比:創建自適應索引,加快查詢速度;採用可預測性讀磁盤數據;增長了加快插入操做的插入緩衝區
索引:InnoDB的主索引採用的是彙集索引,也就是將數據放在索引上;MyIsam的索引採用的是非彙集索引,只是講數據的地址放在索引上
查詢:若是須要頻繁的查詢數據的話,MyIsam的效率比InnoDB高;若是須要常常執行插入、刪除等操做的話,則優先選擇InnoDB
查詢行數:select count(*) from table --->MyIsam內部保存了行數,能夠直接拿到行數,而InnoDB則須要掃描全表;若是查詢語句裏面包含where條件的話,則兩個存儲引擎的效率同樣,都須要掃描全表mysql