Почему переменные $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);

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

Изменить: У меня есть следующие настройки для магические цитаты:

                     Local   Master

magic_quotes_gpc     On      On
magic_quotes_runtime Off     Off
magic_quotes_sybase  Off     Off
Author: Nathan Osman, 2010-03-23

6 answers

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

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

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

if (get_magic_quotes_gpc())  
 $my_post_var = stripslashes($_POST["my_post_var"]);
 64
Author: Pekka 웃, 2010-03-22 23:27:20

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

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

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

$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;
 26
Author: Syntax Error, 2012-11-03 03:21:29

Это "функция" PHP, известная как Волшебные кавычки, которая теперь устарела в PHP 5.3 и удалена в PHP 5.4.

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

 9
Author: Matchu, 2014-09-29 18:38: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
Author: BojanG, 2010-03-23 00:35:13

Возможно, в 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
Author: alex, 2010-03-22 23:21:00

Так что я поговорил с разработчиком wordpress (https://core.trac.wordpress.org/ticket/40476#ticket ) и он сказал:

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

Что касается ответа, данного здесь:

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

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

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

 0
Author: Toskan, 2017-05-31 17:36:21