wuxiren123

          Java防盜鏈在報表中的應用實例

          今天我們來聊聊Java盜鏈,多說無用,直接上應用案例。

          這里所用的工具是報表軟件FineReport,搭配有決策系統(一個web前端展示系統,主要用于權限控制),可以采用java防盜鏈的方式來實現頁面權限。

          瀏覽器中直接輸入報表URL的時候,它的頭文件是空的,因此,可以在訪問的時候做兩個判斷:頭文件是否為空以及以什么頁面進行跳轉,如果不符合跳到錯誤頁面即可。

          什么是Referer?

          這里的 Referer 指的是HTTP頭部的一個字段,也稱為HTTP來源地址(HTTP Referer),用來表示從哪兒鏈接到目前的網頁,采用的格式是URL。換句話說,借著 HTTP Referer 頭部網頁可以檢查訪客從哪里而來,這也常被用來對付偽造的跨網站請求。


          什么是空Referer,什么時候會出現空Referer?

          首先,我們對空Referer的定義為,Referer 頭部的內容為空,或者,一個HTTP請求中根本不包含Referer頭部。

          那么什么時候HTTP請求會不包含Referer字段呢?根據Referer的定義,它的作用是指示一個請求是從哪里鏈接過來,那么當一個請求并不是由鏈接觸發產生的,那么自然也就不需要指定這個請求的鏈接來源。

          比如,直接在瀏覽器的地址欄中輸入一個資源的URL地址,那么這種請求是不會包含Referer字段的,因為這是一個“憑空產生”的HTTP請求,并不是從一個地方鏈接過去的。



          在防盜鏈設置中,允許空Referer和不允許空Referer有什么區別?

          在防盜鏈中,如果允許包含空的Referer,那么通過瀏覽器地址欄直接訪問該資源URL是可以訪問到的;

          但如果不允許包含空的Referer,那么通過瀏覽器直接訪問也是被禁止的。

          操作步驟

          1、添加class文件

          編寫一個類文件,用來判斷頭文件是否為空,代碼如下:

          package com.fr.test;

          import java.io.IOException;
          import java.io.PrintWriter;

          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.HttpSession;

          public  class Dodo implements Filter {
              
          public void destroy() {
                  
          // TODO Auto-generated method stub

              }


              
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

              
          throws IOException, ServletException {
              HttpServletRequest req 
          = (HttpServletRequest) request;
              HttpServletResponse resp 
          = (HttpServletResponse) response;
              String referer 
          = req.getHeader("referer");
              
          //下面的IP地址是正常頁面請求
              if(null != referer && (referer.trim().startsWith("http://localhost:8033")||referer.trim().startsWith("http://www.finereporthelp.com/test/hello.html"))){
                   System.out.println(
          "正常頁面請求"+referer);
                   chain.doFilter(req, resp);
             
          //下面的就是出現不是正常頁面請求的時候跳轉
              }
          else{
                   System.out.println(
          "盜鏈"+referer);
                   req.getRequestDispatcher(
          "/LdapLogin.jsp").forward(req, resp);
              }

          }

              
          public void init(FilterConfig arg0) throws ServletException {
                  
          // TODO Auto-generated method stub

              }

          }
           



          將Dodo.java編譯成class文件,并放在%TOMCAT_HOME%\WebReport\WEB-INF\classes\com\fr\test目錄下。


          2、修改web.xml文件

          打開%TOMCAT_HOME%\webapps\WebReport\WEB-INF下的web.xml文件,配置一個過濾filter,在出現ReportServer的時候執行過濾,代碼如下:

           

          <filter>
          <filter-name>AuthFilter</filter-name>
          <filter-class>com.fr.test.Dodo</filter-class></filter>
          <filter-mapping>
          <filter-name>AuthFilter</filter-name>
          <url-pattern>/ReportServer</url-pattern>
          </filter-mapping>




          兩步就可以搞定,如果屬于盜鏈,則跳轉至上述的LdapLogin錯誤頁面,這里沒有LdapLoign頁面,所以直接跳轉404。如果還想實現數據權限,則可以通過單點登錄或者session注入的方式。

          效果測試

          準備兩個html文件

          假設hello.html是正確的網址

           

          <html>
          <body>
          <p>測試</p>

          <a href="http://localhost:8033/WebReport/ReportServer?reportlet=demo%2Fnewchart%2Fothers%2FL
          <html>
          <body>
          <p>測試,錯誤的鏈接地址</p>

          <a href="http://localhost:8033/WebReport/ReportServer?reportlet=demo%2Fnewchart%2Fothers%2FLogarithmic_axis.cpt&op=write">防盜鏈測試</a>
          </body>
          </html> 
          ogarithmic_axis.cpt&op=write
          ">防盜鏈測試</a>
          </body>
          <html> 


           

          假設steal.html是盜鏈的網址

          情況一

          通過hello.html跳轉,跳轉鏈接正確,即referer不為空且正確


          情況二

           

          通過steal.html跳轉,跳轉鏈接錯誤,即referer不為空且錯誤


          情況三

           

          直接訪問URL地址,即referer為空




          posted on 2016-06-14 15:30 喝水居然長肉 閱讀(113) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 通渭县| 湖州市| 孝昌县| 榆社县| 贡嘎县| 宁化县| 遵义市| 山东| 日照市| 贵阳市| 普安县| 望谟县| 新疆| 华池县| 崇信县| 卓尼县| 仙桃市| 庆云县| 兴安盟| 晋城| 筠连县| 义马市| 天祝| 崇州市| 突泉县| 封开县| 苗栗县| 樟树市| 玉田县| 通海县| 辽中县| 宜丰县| 长沙市| 昌宁县| 永宁县| 和静县| 库车县| 承德市| 旅游| 图木舒克市| 奉贤区|