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

    参考

      HTTP 请求方法

      Tomcat 启用/禁用PUT & DELETE

  • 相关阅读:
    网站、数据库的衍变之路(三)
    脚本嵌入式抓取引擎
    db4objects 7.4应用笔记
    网站、数据库的衍变之路(二)
    IIS连接数实验——Web开发必读
    攻破WebService,WCF的改进
    C#使用BerkeleyDB操作简介
    面试两个星期来的一点体会
    Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
    轻量级爬虫+全文检索解决方案项目——NukeLite(20081114 更新r24版 引入新线程机制)
  • 原文地址:https://www.cnblogs.com/Hi-blog/p/HTTP-METHODS.html
Copyright © 2020-2023  润新知