抵御XSS攻擊
1、xss攻擊的危害
XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程式,這些惡意網頁程式通常是JavaScript,但實際上也可以包括Java,VBScript,Activex,Flash或者甚至是普通的HTML,攻擊成功后,攻擊者可能得到包括但不限于更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容,
例如用戶在發帖或者注冊的時候,在文本框中輸入,這段代碼如果不經過轉義處理,而直接保存到資料庫,將來視圖層渲染HTML的時候,把這段代碼輸出到頁面上,那么
通常情況下,我們登陸到某個網站,如果網站使用HttpSession保存登陸憑證,那么SessionId會以Cookie的形式保存在瀏覽器上,如果黑客在這個網頁發帖的時候,填寫的Javascript代碼是用來獲取cookie內容的,并且把cookie內容通過Ajax發送給黑客自己的電腦,于是只要有人在這個網站上瀏覽黑客發的帖子,那么視圖層渲染HTML頁面,就會執行注入的XSS腳本,于是你的Cookie資訊就泄露了,黑客在自己的電腦上構建出Cookie,就可以冒充已經登陸的用戶,
即便很多網站使用了JWT,登陸憑證(Token令牌)是存盤在瀏覽器上面的,所以用XSS腳本可以輕松的從Storage中提取出Token,黑客依然可以輕松的冒充已經登陸的用戶,
所以避免XSS攻擊最有效的辦法就是對用戶輸入的資料進行轉義,然后存盤到資料庫里面,等到視圖層渲染HTML頁面的時候,轉義后的文字是不會被當做JavaScript執行的,這就可以抵御XSS攻擊,
2、匯入依賴庫
因為Hutpol工具包帶有XSS轉義的工具類,所以我們要匯入Hutool,然后利用Servlet規范提供的請求包裝類,定義資料轉義功能,
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.0</version>
</dependency>
3、定義請求包裝類
我們平時寫Web專案遇到的 HttpServletRequest,它其實是個介面,如果我們想要重新定義請求類,擴展這個介面是最不應該的,因為HttpServletRequest介面中抽象方法太多了,我們逐一實作起來太耗費時間,所以我們應該挑選一個簡單一點的自定義請求類的方式,那就是繼承HttpservletRequestwrapper父類,
JavaEER是一個標準,具體的實作由各家應用服務器廠商來完成,比如說Tomcat在實作Servlet規范的時候,就自定義了HttpServletRequest介面的實作類,同時JavaEE規范還定義了ttpServletRequestwrapper,這個類是請求類的包裝類,用上了裝飾器模式,不得不說這里用到的設計模式真的非常棒,無論各家應用服務器廠商怎么去實作HttpServletRequest介面,用戶想要自定義請求,只需要繼承HttpServletRequestwrapper,對應覆寫某個方法即可,然后把請求傳入請求包裝類,裝飾器模式就會替代請求物件中對應的某個方法,用戶的代碼和服務器廠商的代碼完全解耦,我們不用關心HttpServletRequest介面是怎么實作的,借助于包裝類我們可以隨意修改請求中的方法,
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value= super.getParameter(name);
if(!StrUtil.hasEmpty(value)){
value=HtmlUtil.filter(value);
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[] values= super.getParameterValues(name);
if(values!=null){
for (int i=0;i<values.length;i++){
String value=values[i];
if(!StrUtil.hasEmpty(value)){
value=HtmlUtil.filter(value);
}
values[i]=value;
}
}
return values;
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
//這里使用LinkedHashMap來保證元素保持原來的順序
LinkedHashMap<String, String[]> map=new LinkedHashMap();
if(parameters!=null){
for (String key:parameters.keySet()){
String[] values=parameters.get(key);
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
values[i] = value;
}
map.put(key,values);
}
}
return map;
}
@Override
public String getHeader(String name) {
String value= super.getHeader(name);
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
return value;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/398478.html
標籤:其他
下一篇:cgb2111-day04
