Почему переменные $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
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"]);
Я не думаю, что это применимо в вашем случае, но у меня просто была похожая проблема. Я загружал установку Wordpress вместе с сайтом, чтобы показывать последние сообщения на всех страницах. Оказывается, Wordpress избегает всех переменных $_POST, независимо от того, какие значения установлены для magic_quotes.
Я упоминаю об этом, потому что было неприятно выяснять, и поиск ответа в Google привел меня сюда.
Вот как я исправил это в своем случае:
$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;
Это "функция" PHP, известная как Волшебные кавычки, которая теперь устарела в PHP 5.3 и удалена в PHP 5.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;
}
Возможно, в 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);
}
?>
Так что я поговорил с разработчиком 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, поскольку это позволяет нам предлагать разработчикам гораздо более согласованный опыт. "