Подтвердить что ты не робот

Почему строки в $_POST не могут содержать точку "."?

В общем, название говорит все. У меня был скрытый ввод на моей странице, где я хотел установить имя "some.major.uber.setting"

например: <input type="hidden" name="some.major.uber.setting" value="dummy value" />

и когда я посмотрел на данные $_POST, он содержал "some_major_uber_setting". Может ли кто-нибудь объяснить это поведение

4b9b3361

Ответ 1

Это, вероятно, реликт из register_global = В разы. $_GET/$_ переменные POST превратились в стандартные переменные ($ _GET ['foo'] стал $foo). Имена переменных не могут содержать точки, поэтому они были внутренне преобразованы.

Ответ 2

Это было с тех пор, как оригинал зафиксировал CVS более 10 лет назад.

Он имеет комментарий:

/* убедитесь, что у нас нет пробелов или точек в имени переменной (не бинарный сейф) */

Я понятия не имею, почему это не "двоичный сейф"... Вам нужно будет спросить Зеева.

Текущая ссылка: https://github.com/php/php-src/blob/master/main/php_variables.c#L93

Ответ 3

Его документально подтверждено в php.net как:

Точки и пробелы в именах переменных преобразуются в символы подчеркивания.

Ответ 4

Как уже упоминалось в моем другом ответе, это функция, которая устраняет это неудачное поведение.

function fix(&$target, $source, $discard = true) {
    if ($discard)
        $target = array();

    $source = preg_replace_callback(
        '/(^|(?<=&))[^=[&]+/',
        function($key) { return bin2hex(urldecode($key[0])); },
        $source
    );

    parse_str($source, $post);
    foreach($post as $key => $val)
        $target[ hex2bin($key) ] = $val;
}

И тогда вы можете вызвать эту функцию следующим образом:

fix($_POST, file_get_contents('php://input'));