简介
HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作, 虽然他们也可以是名词,但这些请求方法有时被称为HTTP动词。每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享。
方法 | 说明 |
GET | GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据。 |
HEAD | HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体。 |
POST | POST方法用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的更改。 |
PUT | PUT方法用请求有效载荷替换目标资源的所有当前表示。 |
DELETE | DELETE方法删除指定的资源。 |
CONNECT | CONNECT方法建立一个到由目标资源标识的服务器的隧道。 |
OPTIONS | OPTIONS方法用于描述目标资源的通信选项。 |
TRACE | TRACE方法沿着到目标资源的路径执行一个消息环回测试。 |
PATCH | PATCH方法用于对资源应用部分修改。 |
上述HTTP方法中,可能会产生较大威胁的是PUT和DELETE方法,可以在目标系统上创建和删除文件。
Tomcat配置
一般而言,GET和POST方法是被启用的,而想PUT、DELETE等不太安全的方法应该禁用。
启用不安全的HTTP方法
Step 1: 在配置文件./conf/web.xml,Filter Mappings处,添加如下配置
<!-- ==================== Built In Filter Mappings ====================== --> <filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Accept,Accept-Encoding,Accept-Language,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization,Connection,Content-Type,Host,Origin,Referer,Token-Id,User-Agent, X-Requested-With</param-value> </init-param> <init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET, POST, PUT, DELETE, OPTIONS, HEAD</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Step 2: 在配置文件./conf/web.xml,servlet处添加readonly参数,并设置为false。
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
重启Tomat服务,使用curl命令进行测试。
C:WINDOWSsystem32>curl -I -X OPTIONS http://localhost:8080/
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
vary: Access-Control-Request-Headers,Access-Control-Request-Headers,access-control-request-method
Access-Control-Max-Age: 1800
Access-Control-Allow-Methods: HEAD,DELETE,POST,GET,OPTIONS,PUT
Access-Control-Allow-Headers: referer,accept-language,origin,access-control-request-method,accept,authorization,x-requested-with,host,access-control-request-headers,connection,content-type,token-id,accept-encoding,user-agent
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Mon, 25 Mar 2019 01:03:51 GMT
可以看到PUT、DELETE等方法已启用。这样便能对目标服务器做一些有危害的操作。
测试验证
主要测试一下PUT和DELETE两个方法。
PUT方法
使用PUT方法,向目标系统http://127.0.0.1:8080/test/helo.txt,写入字符串"hello world"。
C:WINDOWSsystem32>curl -v -X PUT -d "hello world" http://127.0.0.1:8080/test/helo.txt * Trying 127.0.0.1... * TCP_NODELAY set * Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0) > PUT /test/helo.txt HTTP/1.1 > Host: 127.0.0.1:8080 > User-Agent: curl/7.55.1 > Accept: */* > Content-Length: 11 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 11 out of 11 bytes < HTTP/1.1 201 Created < Server: Apache-Coyote/1.1 < Access-Control-Allow-Origin: * < Content-Length: 0 < Date: Mon, 25 Mar 2019 01:14:46 GMT < * Connection #0 to host 127.0.0.1 left intact
响应码为201,表示文件创建成功,通过浏览器访问,我们可以看到:
hello world ~
或使用REST API进行测试,在Chrome上安装REST API插件...请自行安装
可以看到文件创建成功。
DELETE方法
我们使用curl命令删除前面用REST API创建的文件:http://localhost:8080/test/haha.txt
C:WINDOWSsystem32>curl -v -X DELETE http://localhost:8080/test/haha.txt * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 8080 (#0) > DELETE /test/haha.txt HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.55.1 > Accept: */* > < HTTP/1.1 204 No Content < Server: Apache-Coyote/1.1 < Access-Control-Allow-Origin: * < Date: Mon, 25 Mar 2019 01:24:14 GMT < * Connection #0 to host localhost left intact
再使用REST API删除使用curl创建的文件:http://localhost:8080/test/helo.txt
整个世界都清净了...
由上可知,PUT和DELETE方法可以在目标服务器上创建和删除文件,危害较大。因此,应该尽量不去使用这些不安全的方法,仅允许一些常规的GET和POST请求,其它不用的方法都禁用。