限制直接經過地址欄鍵入連接地址訪問xml配置文件

前言

在實際的web項目中,有些配置項會放在xml文件裏面,對於xml文件,咱們其實並不但願訪問者進行訪問,畢竟xml文件裏面可能配置了一些較爲敏感的信息,好比內網IP、用戶名及密碼等。
對此,但願可以限制訪問者直接在地址欄鍵入連接地址訪問到xml文件。html

方法

一、 判斷請求方式(POST、GET)java

在web項目內讀取xml文件通常進行的是POST請求,而經過地址欄鍵入地址訪問則爲GET請求,依次來區分。web

public void doFilter(ServletRequest request, ServletResponse response,
                    FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpreq = (HttpServletRequest) request;
            String method = httpreq.getMethod();
            if("GET".equals(method)) {
                httpres.sendRedirect(httpreq.getContextPath() + "/error.html");
                return;
            }
            chain.doFilter(request, response);
        }

固然,在web.xml裏面也要相應的配置filter:app

<filter>
            <filter-name>authVisitPage</filter-name>
            <filter-class>web.AuthVisitFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>authVisitPage</filter-name>
            <url-pattern>*.xml</url-pattern>
        </filter-mapping>

二、 利用document.referrer屬性url

referrer是與對網頁的請求有關的document對象中的屬性。referrer屬性中保存着連接到當前頁面的那個頁面的URL,在沒有來源頁面的狀況下,referrer屬性中可能會包含空字符串。
該屬性不可設置。code

public void doFilter(ServletRequest request, ServletResponse response,
                    FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpreq = (HttpServletRequest) request;
            String referer = httpreq.getHeader("Referer");
            if(referer == null) {
                httpres.sendRedirect(httpreq.getContextPath() + "/error.html");
                return;
            }
            chain.doFilter(request, response);
        }

這裏只是判斷referer是否爲空,但忽略了一種狀況:
假設已知xml的路徑(如:http://域名/configs/*.xml),咱們能夠在本地新建一個web工程,裏面增長一個跳轉xml

<a href="http://域名/configs/*.xml">跳轉</a>

若是仍是用以前的過濾器,只是判斷referer是否爲空的話,是不可以過濾掉這種跳轉過來的訪問請求。對此,過濾器須要增長判斷:禁止非內部訪問htm

public void doFilter(ServletRequest request, ServletResponse response,
                    FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpreq = (HttpServletRequest) request;
            String referer = httpreq.getHeader("Referer");
            String host = httpreq.getHeader("Host");
            if(referer == null || referer.indexOf(host) < 0) {
                httpres.sendRedirect(httpreq.getContextPath() + "/error.html");
                return;
            }
            chain.doFilter(request, response);
        }

總結

  • 對於第一種方法,應該也存在跳轉訪問這個bug,同時這種方法就要求內部全部對xml的訪問都應確保爲POST方式。這樣一對比的話,感受第二種方法可能會更好。對象

  • 對這個需求若是進行擴展的話,能夠限制不想被訪問者直接訪問的全部文件類型。字符串

相關文章
相關標籤/搜索