利用referer防止盜鏈下載

【這篇是在網上看到的關於referer的文章,還有些不明白,轉過來待日後再好好研究一下】

一、首先了解下 referer 的原理 

request.getHeader("referer") 
在開發web程序的時候,有時我們需要得到用戶是從什麼頁面連過來的,這就用到了referer。 
它是http協議,所以任何能開發web程序的語言都可以實現,比如jsp中是: 
request.getHeader("referer"); 
php是$_SERVER['HTTP_REFERER']。其他的我就不舉例了(其實是不會其他的語言)。 
那它能幹什麼用呢?我舉兩個例子: 
1,防止盜連,比如我是個下載軟件的網站,在下載頁面我先用referer來判斷上一頁面是不是自己網站,如果不是,說明有人盜連了你的下載地址。 
2,電子商務網站的安全,我在提交信用卡等重要信息的頁面用referer來判斷上一頁是不是自己的網站,如果不是,可能是黑客用自己寫的一個表單,來提交,爲了能跳過你上一頁裏的javascript的驗證等目的。 

使用referer的注意事項: 
如果我是直接在瀏覽器裏輸入有referer的頁面,返回是null(jsp),也就是說referer只有從別的頁面點擊連接來到這頁的纔會有內容。 
我做了個實驗,比如我的referer代碼在a.jsp中,它的上一頁面是b.htm,c.htm是一個帶有iframe的頁面,它把a.jsp嵌在iframe裏了。我在瀏覽器裏輸入b.htm的地址,然後點擊連接去c.htm,那顯示的結果是b.htm, 
如果我在瀏覽器裏直接輸入的是c.htm那顯示的是c.htm (注:我試了一下應該是沒有值,即null而不是c.htm奮鬥
referer是瀏覽器在用戶提交請求當前頁面中的一個鏈接時,將當前頁面的URL放在頭域中提交給服務端的,如當前頁面爲a.html,它裏面有一個b.html的鏈接,當用戶要訪問b.html時瀏覽器就會把a.html作爲referer發給服務端. 

二、那麼如何運用"referer" 來防止盜鏈下載呢 
我們考慮了用filter實現 
Java代碼  收藏代碼
  1. public class DefendSteal implements Filter  
  2. {  
  3.   
  4.     protected FilterConfig filterConfig;  
  5.     protected String[] allowsites;  
  6.     protected String[] files;  
  7.     public DefendSteal()  
  8.     {  
  9.      
  10.     }  
  11.   
  12.     public void destroy()  
  13.     {  
  14.   
  15.     }  
  16.   
  17.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  18.         throws IOException, ServletException  
  19.     {  
  20.         HttpServletRequest req = (HttpServletRequest)request;  
  21.         HttpServletResponse res = (HttpServletResponse)response;  
  22.         String suff = req.getRequestURL().substring(req.getRequestURL().lastIndexOf(".")+1);  
  23.         System.out.println("referer:"+req.getHeader("referer"));  
  24.         for(int j=0;j<this.files.length;j++){//判斷是否有需要阻止的文件類型  
  25.             if(suff.equalsIgnoreCase(this.files[j])){  
  26.                 if(req.getHeader("referer")==null||"".equals(req.getHeader("referer"))){//這種情況是直接訪問實體文件,可防止下載  
  27.                     res.sendRedirect(req.getContextPath()+"/NotExist.html");  
  28.                 }else{  
  29.                     int i=0;  
  30.                     for(i=0;i<this.allowsites.length;i++){  
  31.                         if(req.getHeader("referer").indexOf(allowsites[i])>=0){  
  32.                             break;  
  33.                         }  
  34.                     }  
  35.                     if(i==this.allowsites.length){//不在允許站點列表裏,則阻止,這種情況是盜鏈  
  36.                         res.sendRedirect(req.getContextPath()+"/NotExist.html");  
  37.                     }  
  38.                 }  
  39.                 break;  
  40.             }  
  41.         }  
  42.         chain.doFilter(request, response);  
  43.     }  
  44.   
  45.     public void init(FilterConfig filterConfig)  
  46.         throws ServletException  
  47.     {  
  48.         this.filterConfig = filterConfig;  
  49.         String strSite = filterConfig.getInitParameter("allowsite");  
  50.         allowsites = strSite.split(";");  
  51.         String strfile = filterConfig.getInitParameter("file");  
  52.         files = strfile.split(";");  
  53.     }  
  54. }  


對應的web.xml文件配置如下: 

Java代碼  收藏代碼
  1. 在web.xml中加下如下:  
  2.   
  3. <filter>  
  4.     <filter-name>DefendSteal</filter-name>  
  5.     <filter-class>filters.DefendSteal</filter-class>  
  6.     <init-param>  
  7.       <param-name>allowsite</param-name>  
  8.       <param-value>172.19.33.48;172.19.33.91</param-value>  
  9.     </init-param>  
  10.     <init-param>  
  11.       <param-name>file</param-name>  
  12.       <param-value>flv;gif</param-value>  
  13.     </init-param>  
  14.   </filter>  
  15.   <filter-mapping>  
  16.     <filter-name>DefendSteal</filter-name>  
  17.     <url-pattern>/*</url-pattern>  
  18.   </filter-mapping>  

Allowsite爲否充訪問的站點 

File 爲被監測的文件類型 


附: 深入理解HTTP協議 

http://www.blogjava.net/zjusuyong/articles/304788.html 

轉自:http://kennethf6986.iteye.com/blog/980518

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章