PHP究竟是如何创建超全局_POST,$ _ GET,$ _COOKIE和$ _REQUEST?(H

2019-09-02 04:14发布

我对这个问题的困惑标题对不起,我会尽力澄清问题是什么。

我在做与Mongrel2服务器一些工作,我正在写访问原始的HTTP请求数据的PHP处理程序。 因为我有PHP背后Mongrel2,没有自动创建_POST,$ _ GET,$ _COOKIE和$ _REQUEST变量。

现在的问题是 - 有,我可以发送HTTP请求的原始的PHP函数(或任何东西),这将产生超全局变量,使用Apache + PHP时通常是可利用的方法吗?

注:我可以手动解析HTTP请求并创建这些变量自己,但我没能找到PHP究竟是如何做到这一点的HTTP解析和导入到超全局变量的任何文件。 如果可能的话,我想不必解析HTTP请求自己自动超全局创作的过程。

谢谢你的任何输入。

Answer 1:

创建这些变量是PHP的内脏深处进行处理,在main/php_variables.c ,在php_auto_globals_create_get()和类似的功能。 从PHP 5.4.3:

static zend_bool php_auto_globals_create_get(const char *name, uint name_len TSRMLS_DC)
{
        zval *vars;

        if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) {
                sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC);
                vars = PG(http_globals)[TRACK_VARS_GET];
        } else {
                ALLOC_ZVAL(vars);
                array_init(vars);
                INIT_PZVAL(vars);
                if (PG(http_globals)[TRACK_VARS_GET]) {
                        zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_GET]);
                }
                PG(http_globals)[TRACK_VARS_GET] = vars;
        }

        zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
        Z_ADDREF_P(vars);

        return 0; /* don't rearm */
}

这结束了直接调用到SAPI(例如,Apache模块/ CGI / FastCGI的/无论)来抓取变量。 我不认为有,你可以改变,如果你在一个奇怪的环境中,GET / POST /等变量是不是哪里PHP希望他们能是这个工作的方式的任何方式。



Answer 2:

我试图推动与我所知道的知识这个问题。

发送具有这样的头部一个HTTP请求可以复制POST可变

POST /somepage.php HTTP/1.1
Host: www.domain.com
User-Agent: Mozilla/12.0
Content-Length: 31
Content-Type: application/x-www-form-urlencoded

parameter=value&testcode=value1

您可能还需要检查HttpRequest PHP的libray。 [从这里开始] 。 对于POST数据,您可以覆盖使用以前的帖子内容HttpRequest::setPostFields()并设置自己的数据了。

HttpRequest::setPostFields(array(
    "parameter" => "value"
));


Answer 3:

发现php.net也许这将是有益的:

$_POST = array();
$str = 'first=value&arr[]=foo+bar&arr[]=baz';
parse_str(html_entity_decode($str), $_POST);
print_r($_POST);

Array
(
    [first] => value
    [arr] => Array
        (
            [0] => foo bar
            [1] => baz
        )

)

注意:

该magic_quotes_gpc的设置会影响此函数的输出,为parse_str()使用PHP使用填充$ _GET,$ _ POST等变量相同的机制。

http://php.net/manual/en/function.parse-str.php



Answer 4:

$ _ POST,$ _ GET,$ _COOKIE和$ _REQUEST每次在PHP中可用,也如果PHP是在命令行中运行。 这些阵列是可写的,你可以添加值$ _POST阵列,并得到一个在任何其他地方。

此代码完全正确的,可行的,如果从控制台运行:

<?php

$_POST['test'] = '1';
echo "\$_POST in global scope:\n";
var_dump($_POST);

function p() {
     echo "\$_POST in function scope:\n";

     var_dump($_POST);

     echo "Others super-global array in function scope:\n";
     var_dump($_REQUEST);
     var_dump($_COOKIE);

}

p();

结果:

$_POST in global scope:
array(1) {
  'test' =>
  string(1) "1"
}
$_POST in function scope:
array(1) {
  'test' =>
  string(1) "1"
}
Others super-global array in function scope:
array(0) {
}
array(0) {
}

编辑

此外,您还可以创建类,并保存在它的静态字段从HttpRequest的数据。 在这种情况下,你可以从anywere使用它。



文章来源: How exactly is PHP creating superglobal $_POST, $_GET, $_COOKIE and $_REQUEST?
标签: php http