欢迎来到starnight_cyber的博客

HTTP Methods

简介

  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:\WINDOWS\system32>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:\WINDOWS\system32>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:\WINDOWS\system32>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请求,其它不用的方法都禁用。

参考

  HTTP 请求方法

  Tomcat 启用/禁用PUT & DELETE

 

posted @ 2019-03-25 09:31 starnight_cyber 阅读(...) 评论(...) 编辑 收藏