web開發中的常見漏洞,一般都發生在這些輸入框中,一般情況我們會對這些輸入域進行客戶端的校驗和服務器端的校驗,但是在客戶端的校驗基本上起不來什么作用,因為客戶端的所有代碼我們都可以進行更改,防止漏洞的發生還是需要服務器端的校驗,但是一般服務器端的校驗都是校驗你輸入的字符或者是數字的長度等等。下面就演示一個XSS的漏洞注入,JSP頁面中有兩個輸入框,姓名和個人介紹。當我們寫入姓名和個人介紹之后,后台代碼的處理就是進行一個簡單的轉發,然后把我們剛才的信息轉發到一個jsp頁面進行顯示。
如果我們在個人介紹寫上<script>document.location.href='http://www.baidu.com'</script>,那么提交之就跳轉到百度了,如果跳轉到xxoo網站呢,這不就壞事了嘛。
我們需要自己在后台對這些特殊的字符進行轉碼,當這些字符再次顯示到頁面的時候不執行腳本。
使用什么樣的方法才能阻止這種情況的發生,就是對 HTML 中的預留字符替換為字符實體 ,例如:對< 進行替換成 <,對>替換成> 等等。在這里把我們的代碼進行一下完善防止XSS的出現:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String describe = req.getParameter("describe"); if(username == null || describe == null){ username ="aaaa"; describe="helloworld<script>alert('hello world');</script>"; } //HTML 中的預留字符必須被替換為字符實體 username = StringEscapeUtils.escapeHtml4(username); describe = StringEscapeUtils.escapeHtml4(describe); System.out.println(username +" : "+ describe); req.setAttribute("username", username); req.setAttribute("describe", describe); req.getRequestDispatcher("/info.jsp").forward(req, resp); }
這樣我們就可以簡單的防止XSS誇腳本攻擊,代碼中的 StringEscapeUtils是apache common-lang 包下的一個工具類,這個工具類也可以對sql中的保留字符進行轉換,同時我們自己也可以自己實現一個對html中的預留字進行替換的程序。在后台打印的describe的字符已經被替換為:
helloworld<script>alert('hello world');</script> 把這些內容顯示在html中是不會執行javascript腳本的。
