整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          SpringBoot如何防止XSS腳本攻擊?

          么是XSS腳本攻擊?

          XSS(Cross-Site Scripting,跨站腳本攻擊)是一種常見的 Web 攻擊技術,攻擊者通過在 Web 頁面中插入惡意的腳本代碼,使得用戶在瀏覽頁面時執行這些腳本,從而達到攻擊的目的。通常被分為如下的三種類型。

          存儲型 XSS(Stored XSS)

          攻擊者將惡意腳本代碼存儲在服務器上的數據庫或文件中,當用戶訪問包含這些惡意代碼的頁面時,會執行這些代碼。

          反射型 XSS(Reflected XSS)

          攻擊者將惡意腳本代碼作為參數注入到URL中,當用戶點擊包含這些惡意參數的URL時,服務器端將參數反射回頁面并執行,從而觸發XSS攻擊。

          DOM 型 XSS(DOM-based XSS)

          攻擊者利用客戶端腳本對DOM(Document Object Model,文檔對象模型)進行操作的漏洞,通過修改頁面的DOM結構來執行惡意代碼。

          常見的XSS攻擊防御手段

          • 過濾和清理用戶輸入數據,移除或轉義HTML標簽和特殊字符
          • 使用 Content Security Policy(CSP)來限制頁面資源加載和執行的范圍。
          • 使用安全的編碼函數來處理用戶輸入和輸出,如HTML編碼、URL編碼等
          • 對于敏感操作和數據,使用HttpOnly標記和Secure標記來設置Cookie的屬性,防止被竊取和劫持。
          • 對于存儲型XSS,嚴格控制用戶輸入的內容,并對輸入數據進行驗證和過濾。
          • 對于反射型XSS,驗證和過濾所有用戶提交的數據,包括URL參數、表單數據等。
          • 對于DOM型XSS,避免直接使用用戶輸入的數據操作DOM,盡量使用安全的DOM操作方式。

          如何實現?

          SpringBoot可以通過使用過濾器或攔截器來對請求參數進行過濾和清理,防止惡意的XSS腳本注入。下面是一種通過過濾器實現防止XSS攻擊的方法。

          創建一個自定義的過濾器,用于過濾請求中的參數,并清理其中的HTML標簽和特殊字符。

          @WebFilter("/*")
          public class XSSFilter implements Filter {
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  // 初始化操作,可以留空
              }
              @Override
              public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                  chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
              }
              @Override
              public void destroy() {
                  // 銷毀操作,可以留空
              }
              static class XSSRequestWrapper extends HttpServletRequestWrapper {
                  XSSRequestWrapper(HttpServletRequest request) {
                      super(request);
                  }
                  @Override
                  public String getParameter(String name) {
                      String value = super.getParameter(name);
                      if (value != null) {
                          value = cleanXSS(value);
                      }
                      return value;
                  }
                  private String cleanXSS(String value) {
                      // 進行 XSS 過濾,清理 HTML 標簽和特殊字符
                      // 例如,可以使用正則表達式或者第三方庫進行過濾
                      // 這里只是簡單示例,具體過濾規則需根據實際情況自行設計
                      return value.replaceAll("<", "<")
                                  .replaceAll(">", ">")
                                  .replaceAll("\"", """)
                                  .replaceAll("'", "'")
                                  .replaceAll("&", "&");
                  }
              }
          }

          在SpringBoot應用的配置類中注冊該過濾器。

          @Bean
          public FilterRegistrationBean<XSSFilter> xssFilterRegistration() {
              FilterRegistrationBean<XSSFilter> registration = new FilterRegistrationBean<>();
              registration.setFilter(new XSSFilter());
              registration.addUrlPatterns("/*");
              registration.setName("xssFilter");
              registration.setOrder(1);
              return registration;
          }

          上述代碼,我們創建了一個名為XSSFilter的過濾器,在doFilter方法中,對請求進行過濾,并在需要時使用XSSRequestWrapper對請求參數進行清理。清理過程中,我們簡單地將 HTML 標簽和一些特殊字符替換為相應的轉義序列,以防止惡意腳本注入。

          請注意,這只是一種簡單的示例,實際場景中應根據具體情況制定更為嚴格的過濾規則。

          互聯網誕生起,安全威脅就--直伴隨著網站的發展,各種Web攻擊和信息泄露也從未停止。2011年中國互聯網領域爆出兩樁比較大的安全事故,一樁是新浪微博遭XSS攻擊,另一樁是以CSDN為代表的多個網站泄露用戶密碼和個人信息。特別是后者,因為影響人群廣泛,部分受影響網站涉及用戶實體資產和交易安全,一時成為輿論焦點。



          這里列舉常用的幾中攻擊方式:

          一、XSS攻擊

          xss攻擊即跨站點腳本攻擊( Cross Site Script), 指黑客通過篡改網頁,注入惡意HTML腳本,保存在網站的服務器,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。

          XSS攻擊相對而言是一種“古老”的攻擊手段,卻又歷久彌新,不斷變化出新的攻擊花樣,許多以前認為不可能用來攻擊的漏洞也逐漸被攻擊者利用。因此XSS防攻擊也是非常復雜的。主要手段有如下兩種。

          1、過濾消毒

          xss攻擊者一般都是通過在請求中嵌入惡意腳本達到攻擊的目的,這些腳本是一般用戶輸入中不使用的,如果進行過濾和消毒處理,即對某些html 危險字符轉義,如“>”轉義為“>"、“<”轉義為“<” 等,就可以防止大部分攻擊。為了避免對不必要的內容錯誤轉義,如“3<5”中的“<”需要進行文本匹配后再轉義,如“<img src=”這樣的上下文中的“<" 才轉義。事實上,消毒幾乎是所有網站最必備的XSS防攻擊手段。

          2、HttpOnly

          最早由微軟提出,即瀏覽器禁止頁面JavaScript訪問帶有HttpOnly屬性的Cookie。

          HttpOnly并不是直接對抗XSS攻擊的,而是防止XSS攻擊者竊取Cookie。對于存放敏感

          信息的Cookie,如用戶認證信息等,可通過對該Cookie添加HttpOnly屬性,避免被攻擊

          腳本竊取。


          二、注入攻擊

          注入攻擊主要有兩種形式,SQL 注入攻擊和OS注入攻擊。SQL注入攻擊的原理如下。攻擊者在HTTP請求中注入惡意SQL命令( drop table users;),服務器用請求參數構造數據庫SQL命令時,惡意SQL被一起構造,并在數據庫中執行。


          SQL注入攻擊需要攻擊者對數據庫結構有所了解才能進行,攻擊者獲取數據庫表結構信息的手段有如下幾種:比如網站使用了開源的組件、錯誤提示返回數據結構信息等。常用防御方式有兩種:

          1、過濾

          和防XSS攻擊一樣,請求參數消毒是一種比較簡單粗暴又有效的手段。通過正則匹配,過濾請求數據中可能注入的SQL,如“ drop table" 、“ \b(?:updatelb.*?\bset|delete\b\W*?\bfrom)b"等。

          2、參數綁定

          使用預編譯手段,綁定參數是最好的防SQL注入方法。目前許多數據訪問層框架,如IBatis, Hibernate等,都實現SQL預編譯和參數綁定,攻擊者的惡意SQL會被當做SQL的參數,而不是SQL命令被執行。

          除了SQL注入,攻擊者還根據具體應用,注入OS命令、編程語言代碼等,利用程序漏洞,達到攻擊目的。


          三、CSRF攻擊

          CSRF ( Cross Site Request Forgery,跨站點請求偽造),攻擊者通過跨站請求,以合法用戶的身份進行非法操作,如轉賬交易、發表評論等。CSRF的主要手法是利用跨站請求,在用戶不知情的情況下,以用戶的身份偽造請求。其核心是利用了瀏覽器Cookie或服務器Session策略,盜取用戶身份。


          相應地,CSRF的防御手段主要是識別請求者身份。主要有下面幾種方法。

          1、表單token

          CSRF是一個偽造用戶請求的操作,所以需要構造用戶請求的所有參數才可以。表單Token通過在請求參數中增加隨機數的辦法來阻止攻擊者獲得所有請求參數:在頁面表單中增加一個隨機數作為Token,每次響應頁面的Token都不相同,從正常頁面提交的請求會包含該Token值,而偽造的請求無法獲得該值,服務器檢查請求參數中Token的值是否存在并且正確以確定請求提交者是否合法。

          2、驗證碼

          相對說來,驗證碼則更加簡單有效,即請求提交時,需要用戶輸入驗證碼,以避免在用戶不知情的情況下被攻擊者偽造請求。但是輸入驗證碼是一個糟糕的用戶體驗,所以請在必要時使用,如支付交易等關鍵頁面。

          3、Referer check

          HTTP請求頭的Referer域中記錄著請求來源,可通過檢查請求來源,驗證其是否合法。很多網站使用這個功能實現圖片防盜鏈(如果圖片訪問的頁面來源不是來自自己網站的網頁就拒絕)。


          三、其他攻擊和漏洞

          以上只是列舉常見的三種,還有一些其他的也常被黑客利用,比如錯誤堆棧信息直接返回敏感信息,HTML注釋有敏感信息,文件上傳只沒有限制文件類型(黑客上傳惡意腳本),路徑遍厲等

          天,從開發人員的角度,說說《如何防范常見的Web攻擊》話題。

          SQL注入攻擊

          SQL注入攻擊,這個是最常聊到的話題,使用過Java的開發人員,第一個反應就是一定要使用預編譯的PrepareStatement,是吧?

          什么是SQL注入攻擊

          攻擊者在HTTP請求中注入惡意的SQL代碼,服務器使用參數構建數據庫SQL命令時,惡意SQL被一起構造,并在數據庫中執行。

          用戶登錄,輸入用戶名 lianggzone,密碼 ‘ or ‘1’=’1 ,如果此時使用參數構造的方式,就會出現

          select * from user 
           where name = 'lianggzone' 
           and password = '' or '1'='1'
          

          不管用戶名和密碼是什么內容,使查詢出來的用戶列表不為空。

          現在還會存在SQL注入攻擊么

          這個問題在使用了預編譯的PrepareStatement后,安全性得到了很大的提高,但是真實情況下,很多同學并不重視,還是會留下漏洞的。舉個例子,看看,大家的代碼中對 sql 中 in 操作,使用了預編譯,還是仍然還是通過字符串拼接呢?

          如何防范SQL注入攻擊

          使用預編譯的PrepareStatement是必須的,但是一般我們會從兩個方面同時入手。

          Web端

          • 有效性檢驗。
          • 限制字符串輸入的長度。

          服務端

          • 不用拼接 SQL 字符串。
          • 使用預編譯的 PrepareStatement。
          • 有效性檢驗。(為什么服務端還要做有效性檢驗?第一準則,外部都是不可信的,防止攻擊者繞過Web端請求)
          • 過濾 SQL 需要的參數中的特殊字符。比如單引號、雙引號。

          XSS攻擊

          什么是XSS攻擊

          跨站點腳本攻擊,指攻擊者通過篡改網頁,嵌入惡意腳本程序,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。

          假設頁面上有一個表單

          <input type="text" name="name" value="梁桂釗"/>
          

          如果,用戶輸入的不是一個正常的字符串,而是

          "/><script>alert("haha")</script><!-
          

          此時,頁面變成下面的內容,在輸入框input的后面帶上了一段腳本代碼。

          <input type="text" name="name" value="梁桂釗"/><script>alert("haha")</script><!-"/>
          

          這端腳本程序只是彈出一個消息框,并不會造成什么危害,攻擊的威力取決于用戶輸入了什么樣的腳本,只要稍微修改,便可使攻擊極具攻擊性。

          XSS攻擊有多可怕

          蠻早之前,我曾經找了幾個網站做個測試,其實大家對XSS攻擊的防范還是不夠,都成功的注入了測試腳本。

          甚至,還有攻擊者提交惡意的javascript代碼的評論信息或者反饋信息(這些信息,正常客戶端沒有做xss校驗,會存在客戶端注入問題),所有訪問者訪問該內容時,都會執行這段惡意的javascript代碼。

          如何防范XSS攻擊

          • 前端,服務端,同時需要字符串輸入的長度限制。
          • 前端,服務端,同時需要對HTML轉義處理。將其中的”<”,”>”等特殊字符進行轉義編碼。

          CSRF攻擊

          什么是CSRF攻擊

          跨站點請求偽造,指攻擊者通過跨站請求,以合法的用戶的身份進行非法操作。可以這么理解CSRF攻擊:攻擊者盜用你的身份,以你的名義向第三方網站發送惡意請求。CRSF能做的事情包括利用你的身份發郵件,發短信,進行交易轉賬,甚至盜取賬號信息。

          如何防范CSRF攻擊

          • 安全框架,例如Spring Security。
          • token機制。在HTTP請求中進行token驗證,如果請求中沒有token或者token內容不正確,則認為CSRF攻擊而拒絕該請求。
          • 驗證碼。通常情況下,驗證碼能夠很好的遏制CSRF攻擊,但是很多情況下,出于用戶體驗考慮,驗證碼只能作為一種輔助手段,而不是最主要的解決方案。
          • referer識別。在HTTP Header中有一個字段Referer,它記錄了HTTP請求的來源地址。如果Referer是其他網站,就有可能是CSRF攻擊,則拒絕該請求。但是,服務器并非都能取到Referer。很多用戶出于隱私保護的考慮,限制了Referer的發送。在某些情況下,瀏覽器也不會發送Referer,例如HTTPS跳轉到HTTP。

          文件上傳漏洞

          什么是文件上傳漏洞

          文件上傳漏洞,指的是用戶上傳一個可執行的腳本文件,并通過此腳本文件獲得了執行服務端命令的能力。

          許多第三方框架、服務,都曾經被爆出文件上傳漏洞,比如很早之前的Struts2,以及富文本編輯器等等,可能被一旦被攻擊者上傳惡意代碼,有可能服務端就被人黑了。

          如何防范文件上傳漏洞

          • 文件上傳的目錄設置為不可執行。
          • 判斷文件類型。在判斷文件類型的時候,可以結合使用MIME Type,后綴檢查等方式。因為對于上傳文件,不能簡單地通過后綴名稱來判斷文件的類型,因為攻擊者可以將可執行文件的后綴名稱改為圖片或其他后綴類型,誘導用戶執行。
          • 對上傳的文件類型進行白名單校驗,只允許上傳可靠類型。
          • 上傳的文件需要進行重新命名,使攻擊者無法猜想上傳文件的訪問路徑,將極大地增加攻擊成本,同時向shell.php.rar.ara這種文件,因為重命名而無法成功實施攻擊。
          • 限制上傳文件的大小。
          • 單獨設置文件服務器的域名。

          訪問控制

          一般來說,“基于URL的訪問控制”是最常見的。

          垂直權限管理

          訪問控制實際上是建立用戶與權限之間的對應關系,即“基于角色的訪問控制”,RBAC。不同角色的權限有高低之分。高權限角色訪問低權限角色的資源往往是被允許的,而低權限角色訪問高權限的資源往往被禁止的。在配置權限時,應當使用“最小權限原則”,并使用“默認拒絕”的策略,只對有需要的主體單獨配置”允許”的策略,這在很多時候能夠避免發生“越權訪問”。

          例如,Spring Security, Apache Shiro都可以建立垂直權限管理。

          水平權限管理

          水平權限問題在同一個角色上,系統只驗證了訪問數據的角色,沒有對角色內的用戶做細分,由于水平權限管理是系統缺乏一個數據級的訪問控制所造成的,因此水平權限管理又可以稱之為“基于數據的訪問控制”。

          舉個理解,比如我們之前的一個助手產品,客戶端用戶刪除評論功能,如果沒有做水平權限管理,即設置只有本人才可以刪除自己的評論,那么用戶通過修改評論id就可以刪除別人的評論這個就存在危險的越權操作。

          這個層面,基本需要我們業務層面去處理,但是這個也是最為經常遺落的安全點。

          總結

          上面列舉的幾個話題,都是我在開發過程中,遇到的比較常見的Web安全話題,以及一些防范方案,需要我們在開發過程中及時規避,而不是依靠安全人員或者真正用戶,甚至惡意的攻擊者幫我們去發現問題。當然,還有很多Web安全話題,例如遠程執行漏洞、拒絕服務攻擊、Session保持攻擊等等

          喜歡的小伙伴,點個關注吧!


          主站蜘蛛池模板: 糖心vlog精品一区二区三区| 怡红院AV一区二区三区| 无码一区二区三区免费| 天堂Av无码Av一区二区三区| 日本在线一区二区| 全国精品一区二区在线观看| 精品日韩亚洲AV无码一区二区三区| 国产精品成人99一区无码| 免费播放一区二区三区| 另类免费视频一区二区在线观看| 一区国严二区亚洲三区| 国产一区二区福利久久| 国内精品一区二区三区在线观看| 射精专区一区二区朝鲜| 免费视频一区二区| 色妞AV永久一区二区国产AV| 相泽亚洲一区中文字幕| 国产精品区AV一区二区| 国产伦精品一区二区三区视频金莲 | 日韩AV在线不卡一区二区三区 | 精品国产一区二区三区久久狼 | av无码人妻一区二区三区牛牛| 天码av无码一区二区三区四区| 在线观看一区二区三区视频| 亚洲性色精品一区二区在线| 韩国理伦片一区二区三区在线播放| 精品一区二区三区免费毛片爱| 精品人无码一区二区三区| 国产一区二区三区乱码网站| 天堂一区人妻无码| 国产一区中文字幕| 成人国产精品一区二区网站| 国产另类ts人妖一区二区三区 | 亚洲AV无码一区二区三区电影| 无码中文字幕人妻在线一区二区三区 | 亚洲一区精品视频在线| 亚无码乱人伦一区二区| 国产一区二区三区在线看片| 国产不卡视频一区二区三区| 免费一区二区三区| 亚洲日韩一区二区三区|