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

Когда мой Сценарий PHP получает данные из Ajax запрос POST, $_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
37
задан Nathan Osman 22 March 2010 в 23:19
поделиться

5 ответов

У вас, вероятно, включены магические кавычки на сервере Linux: magic_quotes

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

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

if (get_magic_quotes_gpc())  
 $my_post_var = stripslashes($_POST["my_post_var"]);
65
ответ дан 27 November 2019 в 04:11
поделиться

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

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

2
ответ дан 27 November 2019 в 04:11
поделиться

Это «функция» PHP, известная как Magic Quotes , которая теперь устарела в PHP 5.3 и удалена из PHP 5.4.

Легко отключить эту глупую неприятность в php.ini.

9
ответ дан 27 November 2019 в 04:11
поделиться

Вероятно, в вашей производственной среде включены магические кавычки. Проверьте вывод 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;
    }
4
ответ дан 27 November 2019 в 04:11
поделиться

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

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

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

$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;
28
ответ дан 27 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: