什么是Sql注入,如何防止Sql注入?
所謂的sql注入就是攻擊者將命令插入到WEB表單的輸入域或者頁面請求的查詢字符串, 欺騙服務器,執行惡意的SQL命令,在某些表單中,用戶輸入的內容直接用來構造動態SQL命令, 或者作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。參考代碼:
假如某個網站使用賬戶名密碼登錄的驗證SQL語句是:select * from users wherer username="" and passWord= "" ; 攻擊者在表單中輸入賬戶名" or 1=1 --密碼為空,則查詢語句變成了: select * from users where username=""or 1=1 --"and password="" ; --在SQL中為注釋,后面的都不執行,整個執行的語句變成了 select * from users where username=" or 1=1 ;//這句語句是永遠能成功執行的更有甚者,攻擊者使用語句 select * from users where username="; DROP Database (DB Name) -- "and password="";網站就變的危險了。防止措施:
最常用的,采用預編譯語句集PReparedStatement;使用正則表達式將單引號,分號,和注釋號–的語法給替換掉 public static String TransactSQLInjection(String str){ return str.replaceAll(“.([‘;]+|(–)+).“, ” “); }嚴格區分管理員和普通用戶權限使用過濾器過濾一些字符串2.數據庫死鎖是如何產生的?
2.1 死鎖定義:
當多個進程同時訪問一個數據庫時,其中的每個進程擁有的資源都是其他進程所需的, 由此造成的每個進程都無法繼續下去的情況2.2 產生的原因:
一個進程需要訪問數據庫表或者字段的時候,另外一個進程正在執行帶鎖的訪問,那么這個進程就會等待,當等待很久鎖還沒有解除的話,就會鎖超時,報告一個拒絕執行的SQL操作。說白了,就是事務的控制導致。2.3 減少和防止死鎖的方法:
- 按統一順序進行訪問 - 避免事務中的用戶交互 - 降低事務的隔離級別 - 保持事務在同一個批處理中 - ....3.事務的隔離級別有哪些?
Msyql數據庫的事務級別有四個:
- 1.未提交讀:read uncommitted 臟讀,不重復讀,虛讀 都有可能發生 - 2.已提交讀:read committed 避免臟讀,但是不可重復讀,虛讀都有可能發生 - 4.可重復讀: repeatable read 避免臟讀,不可重復讀,但是虛讀有可能發生 - 8.串行化 :serializable 避免了臟讀,不可重復讀,虛讀的發生。Msql默認級別是repeatable,Orcale默認級別是read committed
查詢事務級別語句:select @@tx_isolation更新事務級別的語句:set session transaction isolation level 事務級別4.說說樂觀鎖,悲觀鎖以及其應用場景
數據丟失是數據庫中常見的一類問題,丟失更新一般有兩個解覺方案:
4.1 樂觀鎖解決
樂觀鎖認為丟失更新不會發生,解決方式是: 在數據庫表中插入一個額外的字段,就做版本最開始有一個版本,一旦更新一次,就會有新的版本,如果一個事務在更新的時候,發現本地現有拿到的數據版本與服務器中表的版本不一致,就會重新查詢一下,重新再改。4.2 悲觀鎖解決
悲觀鎖認為丟失更新一定會發生,解決的方法是: 利用數據庫自帶的鎖機制來實現,關系型數據庫有兩種鎖,其中有一種叫做排他鎖,悲觀鎖使用排他鎖,將當前要被修改的那一行數據鎖定起來,鎖住后其他事務不可以去更新它,直到當前的事務解決了,這個鎖被釋放了,其他事務才可以去修改。4.3 悲觀鎖和樂觀鎖的選擇
這兩種沒有說哪一種就一定好于另一種,需要在不同的應用場景下選擇。樂觀鎖適用于寫比較少的情況,即沖突比較少發生的情況下,這樣可以提高系統的吞吐量,但是如果沖突經常發生,上層應用會不斷的retry,遮掩反倒會降低性能,這個時候使用悲觀鎖就比較合適。新聞熱點
疑難解答