javaWeb知識之 MySQL資料庫

2021-07-26 16:28:38 字數 2534 閱讀 6175

什麼是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)

嚴格區分管理員和普通使用者許可權

使用過濾器過濾一些字串

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,遮掩反倒會降低效能,這個時候使用

悲觀鎖就比較合適。

Java Web知識梳理

今天給內部做了個培訓,貌似搞錯了物件,不該對新人講這麼原理性的東西。anyway,還是放上來吧,不知道有沒有人能理清其中的邏輯 問題 為什麼要用tomcat tomcat servlet container servlet container 此外,還有filter listener的概念,這是因為...

Java web基礎知識

一 內建物件的生命週期 1.page 在當前頁面有效,即id號不同 2.session在當前會話有效,若是關掉所有頁面,或是設定發呆時間和利用invading結束生命週期 4.request在當前頁面,或是利用request獲取資料和 頁面都有效,其餘情況無效 二 時間格式化 dateformat ...

java web初學筆記之

pagecontext作用域 當前頁面,也就是只要跳轉到別的頁面就失效了。如果把變數放到pagecontext裡,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裡。其生命週期即把該變數放到pagecontext開始到jsp頁面結束。如果num變數是pagecontext作用域的,則當訪問...