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

Почему переменные $_POST получают экранирование в PHP?

Когда мой PHP script получает данные из запроса POST AJAX, переменные $_POST экранируются. Странно, что это происходит только на моем рабочем сервере (работает PHP 5.2.12 на Linux), а не на моем локальном сервере (работает PHP 5.3.1 в Windows).

Вот код AJAX:

var pageRequest = false;
if(window.XMLHttpRequest)     pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");

pageRequest.onreadystatechange = function() { }

var q_str = 'data=' + " ' ";

pageRequest.open('POST','unnamed_page.php',true);

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");

pageRequest.send(q_str);

Есть ли причина, по которой это происходит? И как мне исправить это, чтобы он работал на обоих серверах?

Изменить: у меня есть следующие настройки для magic_quotes:

                     Local   Master

magic_quotes_gpc     On      On
magic_quotes_runtime Off     Off
magic_quotes_sybase  Off     Off
4b9b3361

Ответ 1

Вероятно, на сервере Linux установлены волшебные кавычки: magic_quotes

Когда magic_quotes включены, все '(одинарная кавычка), "(двойная кавычка),\(обратная косая черта) и NUL автоматически сбрасываются с обратным слэшем.

Они хорошо отключаются, так как они все равно будут удалены с PHP 6. Вы также можете отключить их внутри script: set-magic-quotes-runtime Вы не можете деактивировать часть magic_quotes, ответственных за предотвращение данных POST во время выполнения. Если вы можете, отключите его в php.ini. Если вы не можете этого сделать, проверьте, включены ли magic_quotes, и делайте stripslashes() для любого содержимого, которое вы получаете из POST:

if (get_magic_quotes_gpc())  
 $my_post_var = stripslashes($_POST["my_post_var"]);

Ответ 2

Я не думаю, что это применимо в вашем случае, но у меня была аналогичная проблема. Я загружал установку Wordpress вместе с сайтом, чтобы я мог показывать последние сообщения на всех страницах. Оказывается, Wordpress избегает всех $_POST vars, независимо от того, для чего установлены magic_quotes.

Я упоминаю об этом, потому что было сложно разобраться, и поиск в Google для ответа привел меня сюда.

Вот как я исправил это в моем случае:

$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;

Ответ 4

Вероятно, в вашей рабочей среде есть волшебные кавычки. Проверьте вывод phpinfo().

Вы можете запускать все свои входы через что-то вроде этого, чтобы снять кавычки:

        /* strip slashes from the string if magic quotes are on */
    static function strip_magic_slashes($str)
    {
            return get_magic_quotes_gpc() ? stripslashes($str) : $str;
    }

Ответ 5

Возможно, на вашем сервере Linux php.ini включены магические кавычки.

http://php.net/manual/en/security.magicquotes.php

Это плохо, конечно, поскольку функциональность устарела и будет удалена в будущем PHP 6.

Вы можете отключить его в php.ini так

magic_quotes_gpc = Off

Вы можете проверить и отключить его во время выполнения, если вы не можете получить доступ к вашему php.ini

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>

Из Руководство по PHP

Ответ 6

Итак, я поговорил с wordpress dev (https://core.trac.wordpress.org/ticket/40476#ticket), и он сказал:

"В тот же день, много лет назад, WordPress слепо следил за PHP, принимая, что все суперглобальные ценности должны быть сокращены. PHP позже сделал поворот в идее к чему-то более здравому, что вы видите сегодня, но ущерб был нанесен, WordPress как приложение существовало достаточно долго, и было достаточно существующих плагинов и тем, основанных на WordPress, создающем разумную единую среду, которая Изменение WordPress может нанести непоправимый ущерб этим сайтам - внедрить уязвимости безопасности, калечить контент и кучу других интересных вещей. https://core.trac.wordpress.org/ticket/18322 - это наш билет для отслеживания этого и получения чего-то более разумного - в короткий срок (и в более долгосрочной перспективе) мы просим, ​​чтобы if вы получаете доступ к переменным $_POST, которые вы делаете как таковые: $myvar = wp_unslash ($ _POST ['variable']); так что в один прекрасный день мы сможем иметь $_POST в качестве несвязанного массива.

относительно приведенного здесь ответа:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; 
$_POST = $temp_POST;

Пожалуйста, не делай этого. Вы просто открываете себе проблемы с безопасностью, а также неожиданные вещи, которые происходят с вашим контентом, где WordPress ожидает, что значения будут сокращены. Вместо этого просто используйте wp_unslash(), и если вам действительно нужна копия $_POST для работы на себя, сделайте это как таковое: $my_POST = wp_unslash( $_POST );.

Я также должен добавить: я ожидаю, что вы это сделаете, потому что вы пытаетесь использовать конечную точку API для чего-то, я бы предпочел переключиться на использование REST API, представленного с WordPress 4.7, вместо этого, поскольку это позволяет нам предлагают разработчикам гораздо более последовательный опыт. "