天天看點

Tomcat 禁用不安全的 HTTP 請求

Tomcat 禁用不安全的 HTTP 請求

一、配置 tomcat 的 web.xml 檔案

  WebDAV (Web-based Distributed Authoring and Versioning) 一種基于 HTTP 1.1協定的通信協定.它擴充了HTTP 1.1,在GET、POST、HEAD等幾個HTTP标準方法以外添加了一些新的方法,使應用程式可直接對Web Server直接讀寫,并支援寫檔案鎖定(Locking)及解鎖(Unlock),還可以支援檔案的版本控制

  HTTP/1.1協定中共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式:

  OPTIONS 傳回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器發送’*’的請求來測試伺服器的功能性

  HEAD 向伺服器索要與GET請求相一緻的響應,隻不過響應體将不會被傳回。這一方法可以在不必傳輸整個響應内容的情況下,就可以擷取包含在響應消息頭中的元資訊。 

  GET 向特定的資源送出請求。注意:GET方法不應當被用于産生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網絡蜘蛛等随意通路

  POST 向指定資源送出資料進行處理請求(例如送出表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導緻新的資源的建立和/或已有資源的修改 

  PUT 向指定資源位置上傳其最新内容 

  DELETE 請求伺服器删除Request-URI所辨別的資源 

  TRACE 回顯伺服器收到的請求,主要用于測試或診斷 

  CONNECT HTTP/1.1協定中預留給能夠将連接配接改為管道方式的代理服務 

  方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當傳回狀态碼405(Method Not Allowed);當伺服器不認識或者不支援對應的請求方法的時候,應當傳回狀态碼501(Not Implemented) 

  HTTP伺服器至少應該實作GET和HEAD方法,其他方法都是可選的。當然,所有的方法支援的實作都應當符合下述的方法各自的語義定義。此外,除了上述方法,特定的HTTP伺服器還能夠擴充自定義的方法

  HTTP的通路中,一般常用的兩個方法是:GET和POST,其實主要是針對DELETE等方法的禁用,有兩種方式:

在配置檔案中禁用不需要的 HTTP 請求:

<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
        <http-method>HEAD</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
    </web-resource-collection>
    <auth-constraint></auth-constraint>
</security-constraint>
           

修改應用中的 web.xml 就隻針對本應用起作用,修改 tomcat 中的 web.xml 就可以對啟動在該 tomcat 下所有的應用起作用

二、SpringBoot項目禁用不安全HTTP請求

spring boot的容器是内嵌的,是沒有web.xml給我們配置的,所有的配置都是在properties檔案中進行配置的,是以我們的思路也是在properties檔案中增加tomcat的相關配置

# 解決不安全的HTTP方法漏洞

server.tomcat.port-header=HEAD,PUT,DELETE,OPTIONS,TRACE,COPY,SEARCH,PROPFIND

也可以修改tomcat啟動類:

@Configuration
public class TomcatConfig {

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {// 1
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                collection.addMethod("HEAD");
                collection.addMethod("PUT");
                collection.addMethod("DELETE");
                collection.addMethod("OPTIONS");
                collection.addMethod("TRACE");
                collection.addMethod("COPY");
                collection.addMethod("SEARCH");
                collection.addMethod("PROPFIND");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        return tomcat;
    }
}