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;
}
}