Java Web編程
一、二、三有空補
四. Web應用的安全
1. CSS攻擊,跨站腳本攻擊
跨站腳本,顧名思義,就是惡意攻擊者利用網站漏洞往Web頁面裏插入惡意代碼,一般需要以下幾個
條件:
(1)客戶端訪問的網站是一個有漏洞的網站,但是他沒有意識到;
(2)在這個網站中通過一些手段放入一段可以執行的代碼,吸引客戶執行(通過鼠標點擊等);
(3)客戶點擊後,代碼執行,可以達到攻擊目的。
解決方案:對用戶輸入的數據進行HTML轉移處理。如今很多開源框架默認就支持HTML的轉義。
2. CSRF攻擊(Cross Site Request Forgery, 跨站域請求偽造)
你這可以這麽理解 CSRF 攻擊:攻擊者盜用了你的身份,偽裝成你發送惡意請求。CSRF能夠做的事
情包括:以你名義發送郵件,發消息,盜取你的賬號,甚至於購買商品,虛擬貨幣轉賬......造成的問題包
括:個人隱私泄露以及財產安全。
具體攻擊過程如下:
(1)用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A;
(2)在用戶信息通過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登錄網站A成功,可以正
常發送請求到網站A;
(3)用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;
(4)網站B接收到用戶請求後,返回一些攻擊性代碼,並發出一個請求要求訪問第三方站點A
解決方案:
(1)將cookie設置成HttpOnly
(2)增加token
其原理是在請求中放入攻擊者所不能偽造的信息,並且該新信息不存在於cookie中。鑒於此,系
統開發人員可以在HTTP請求中以參數的形式加入一個隨機產生的token,並在服務端進行token驗證,
如果請求中沒有token或者token內容不正確,則認為CSRF攻擊而拒絕該請求。例如,token可以存放
在表單中的隱藏域中:<input type="hidden" name="_token" value="tokenvalue"/>。token的值通過服
務端生成,表單提交後token的值通過POST請求與參數一同帶到服務端,每次會話可以使用相同的
token,會話過期,則token失效,攻擊者因無法獲取token,也就無法偽造請求。
HttpSession session=request.getSession() Object token=session.getAttribute("_token") if(token==null||"".equals(token)) { session.setAttribute("_token",UUID.randomUUID().toString()); }
3.SQL註入攻擊
解決方案:
(1)使用預編譯語句(PreparedStatement)
預編譯語句使用參數占位符來替代需要動態傳入的參數,這樣攻擊者無法改變SQL語句的結構,
SQL語句的語義不會發生變化,即便用戶輸入sql,它會將其轉義。
例如,原語句:
select * from hhuser where nick=nickname and password=password
例如用戶輸入 ‘or ‘1‘=‘1時,不使用預編譯,生成語句為:
select * from hhuser where nick=‘zhangsan‘ and password=‘‘ or ‘1‘=‘1‘
使用預編譯:
select * from hhuser where nick=‘zhangsan‘ and password=‘\‘ or \‘1\‘=\‘1‘
可見發生了轉義。
(2)使用ORM框架,如IBATIS和Hibernate等都支持輸入變量的轉義實現辦法時通過#配置變量
4.文件上傳漏洞
(1)一般處理方法
為了防止用戶上傳惡意的可執行文件和腳本,以及將文件服務器當做免費的文件存儲服務器使用,
我們需要對上傳的文件進行白名單校驗並限制上傳文件的大小,上傳文件需要重新命名,使共攻者無
法猜測上傳文件的訪問路徑。對於上傳的文件來說,不能簡單地通過後綴名稱判斷文件的類型,因為
惡意攻擊可以將可執行文件的後綴名稱改成圖片或者其它後綴類型,誘導用戶執行。因此,判斷文件
類型需要使用更安全的方式,很多類型的文件起使得幾個字節內容使固定得,根據這幾個字節的內容,
就可以確定文件的類型,這幾個字節被稱為魔數。
(2)配合使用imagemaglck
對於圖片類型的文件,可以上傳後對圖片進行相應的縮放,破壞惡意用戶上傳的二進制可執行文
件的結構。imagemaglck是一套功能強大、穩定並且開源的對圖片進行處理的開發工具包,能處理多
種格式的圖片文件,可以利用imagemaglck來對圖片進行縮放。
魔數枚舉類型:
public enum FileType { /** JPEG */ JPEG("FFD8FF"), /** PNG */ PNG("89504E47"), /** GIF */ GIF("47494638"), /** TIFF */ TIFF("49492A00"), /** Windows bitmap */ BMP("424D"), /** CAD */ DWG("41433130"), /** Adobe photoshop */ PSD("38425053"), /** Rich Text Format */ RTF("7B5C727466"), /** XML */ XML("3C3F786D6C"), /** HTML */ HTML("68746D6C3E"), /** Outlook Express */ DBX("CFAD12FEC5FD746F "), /** Outlook */ PST("2142444E"), /** doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db */ OLE2("0xD0CF11E0A1B11AE1"), /** Microsoft Word/Excel */ XLS_DOC("D0CF11E0"), /** Microsoft Access */ MDB("5374616E64617264204A"), /** Word Perfect */ WPB("FF575043"), /** Postscript */ EPS_PS("252150532D41646F6265"), /** Adobe Acrobat */ PDF("255044462D312E"), /** Windows Password */ PWL("E3828596"), /** ZIP Archive */ ZIP("504B0304"), /** ARAR Archive */ RAR("52617221"), /** WAVE */ WAV("57415645"), /** AVI */ AVI("41564920"), /** Real Audio */ RAM("2E7261FD"), /** Real Media */ RM("2E524D46"), /** Quicktime */ MOV("6D6F6F76"), /** Windows Media */ ASF("3026B2758E66CF11"), /** MIDI */ MID("4D546864"); private String value = ""; private FileType(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
Java Web編程