您的位置:68399皇家赌场 > 集群主机 > 【皇家赌场】PHP 模拟$_PUT实当代码

【皇家赌场】PHP 模拟$_PUT实当代码

发布时间:2019-07-28 06:52编辑:集群主机浏览(200)

    浏览器一般只允许行使GET/POST方法,纵然能够因此JS来发送PUT方法,但是还得编写代码,相对来讲,使用命令行下的CULX570L命令则展现方便广大,在付出测量检验时很有用,所以读书一下要么至关重要的:

    <Location "/demo.php">
    RequestHeader set Content-Type foobar
    </Location>

    curl -X PUT -d "id=1" -d "title=a"

    二、扩展

    那么些题目即便减轻了,可是自个儿还是对两样HTTP method情形下,http央求参数获取的里边境海关系以管窥天,在条分缕析翻阅了Phalcon 哀告参数获取部分源码后,小编了然本人索要先从PHP中php://input输入流、$_POST、$_GET、$HTTP_RAW_POST_DATA这多少个兄弟之间的关联初叶理解。

    $_PUT = array();
    if ('PUT' == $_SERVER['REQUEST_METHOD']) {
    parse_str(file_get_contents('php://input'), $_PUT);
    }

    由此php://input获得的多寡是raw data,所以要求用parse_str深入分析一下。

    浏览器一般只允许选择GET/POST方法,就算能够因此JS来发送PUT方法,不过还得编写代码,相对来说,使用命令行下的CU瑞鹰L命令则突显方便广大,在开采测验时很有用,所以读书一下或然不能缺少的:

    一、填坑

    皇家赌场 1

    前端数据抓包

    率先抓取前端的数码央浼包,能够看出HTTP Method为PUT,提交的数额在entity body中,何况为JSON数据格式,可是大家在后台接口框架中打字与印刷捕获到的POST数据为:

    皇家赌场 2

    image.png

    很明朗后端框架尽管捕获到了前面一个提交的POST数据,可是并不曾科学剖析,由此难题应有珍视出在框架上(后端使用Phalcon框架)。通过追踪代码看到,后端获取POST数据的代码为:

       if ($method == PostedDataMethods::JSON_BODY) {
            return $this->getJsonRawBody(true);
        }
        else if($method == PostedDataMethods::POST) {
            return $this->getPost();
        }
        else if($method == PostedDataMethods::PUT) {
            return $this->getPut();
        }
        else if($method == PostedDataMethods::GET) {
            return $this->getQuery();
        }
    

    接口框架通过决断HTTP诉求方法调用不一样的章程获得POST数据,本例使用PUT提交数据,所以调用了getPut(),该办法为Phalcon框架的不二秘诀,由此调出Phalcon源码继续追踪。

    Phalcon源码部分:

    public function getPut(string! name = null, var filters = null, var defaultValue = null, boolean notAllowEmpty = false, boolean noRecursive = false) -> var
    {
        var put;
    
        let put = this->_putCache;
    
        if typeof put != "array" {
            let put = [];
            parse_str(this->getRawBody(), put);
    
            let this->_putCache = put;
        }
    
        return this->getHelper(put, name, filters, defaultValue, notAllowEmpty, noRecursive);
    }
    
    /**
     * Gets HTTP raw request body
     */
    public function getRawBody() -> string
    {
        var rawBody, contents;
    
        let rawBody = this->_rawBody;
        if empty rawBody {
    
            let contents = file_get_contents("php://input");
    
            /**
             * We need store the read raw body because it can't be read again
             */
            let this->_rawBody = contents;
            return contents;
        }
        return rawBody;
    }
    

    从地点代码能够见见,对于PUT伏乞,Phalcon框架首先获得php://input输入流中的信息,在本例中,php://input输入流中的值为:

    {"id":22,"package_name":"test","md5":"ste1","type":"3","op_id":0,"status":1,"update_time":1509677637,"create_time":1509625133}
    

    所以该字符串通过parse_str()深入分析后,就产生了:

    {{"id":22,"package_name":"test","md5":"ste1","type":"3","op_id":0,"status":1,"update_time":1509677637,"create_time":1509625133} : ""}
    

    即:我们在后台获取到的POST值。
    迄今,这些标题标来头基本能够规定,是出于前端提交的数额是JSON格式的多少,但是Phalcon并未去深入分析那一个JSON数据,而是径直把它当作一个字符串,然后直接实行深入分析。

    进而解决当下难题的消除方法有:

    • 让前面三个提交的数据格式由JSON格式转化为形如:id=22&package_name=test&…… 的字符串格局,从而后端能够科学分析前端传过来的参数;
    • 照旧在接口框架中钦定前端传过来的数量为JSON格式,让接口框架调用Phalcon框架中getJsonRawBody()方法,进而也可以科学分析前端传过来的参数

    谈到底,实施注解这二种办法都灵验!

    PHP里有$_GET,$_POST,不过并未有$_PUT,所以一旦须要动用它的话,则你不得不本人模仿一下:

    复制代码 代码如下:

    复制代码 代码如下:

    前不久在Coding的时候蒙受了一个让人头晕的标题:前端用axios库提交的数量,在后端框架不能捕获;于是本着追本溯源的神气起来了那一个标题标商讨!

    经过复位Content-Type央浼头为foobar(只要不是multipart/form-data就能够),此时php://input就有数量了,但是原来应该的$_FILES数据却不设有了,所以基本上唯有演示上的含义,固然想获得raw data,只可以本身依照数量变化,在PEASportage里有临近的贯彻:HTTP_Request2_MultipartBody。

    复制代码 代码如下:

    <Location "/demo.php">
         RequestHeader set Content-Type foobar
    </Location>

    三、总结

    本文由68399皇家赌场发布于集群主机,转载请注明出处:【皇家赌场】PHP 模拟$_PUT实当代码

    关键词: 68399皇家赌场 日记本

上一篇:PHP命名空间的用途和namespace关键字

下一篇:没有了