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

Когда мой PHP-скрипт получает данные из запроса 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 

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

Когда 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"]); 

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

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

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

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

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

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

Вероятно, у вас есть волшебные кавычки в вашей рабочей среде. Проверьте 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); } ?> с <?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 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

Поэтому я поговорил с wordpress dev ( 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, поскольку это позволяет нам предлагать гораздо больше постоянный опыт разработчиков. "