Почему в PHP экранируются переменные $ _POST? - PullRequest
37 голосов
/ 23 марта 2010

Когда мой 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

Ответы [ 6 ]

64 голосов
/ 23 марта 2010

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

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

Их полезно отключить, так как в любом случае они будут удалены из PHP 6. Вы также должны бытьВы можете отключить их внутри вашего скрипта: 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"]);
28 голосов
/ 25 марта 2010

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

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

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

$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;
9 голосов
/ 23 марта 2010

Это «особенность» PHP, известная как Магические кавычки , которая теперь устарела в PHP 5.3 и удалена в PHP 5.4.

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

4 голосов
/ 23 марта 2010

Возможно, в вашей производственной среде включены магические кавычки. Проверьте 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;
    }
2 голосов
/ 31 мая 2017

Итак, я поговорил с разработчиком 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 ['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, поскольку это позволяет нам предложить разработчикам гораздо более последовательный опыт. «

2 голосов
/ 23 марта 2010

Может быть, в 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 Manual

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...