Если "волшебные кавычки" отключены, почему PHP/Wordpress продолжает автоматически удалять данные моей ПУБЛИКАЦИИ?


Это простой вопрос со странно неуловимым ответом.

get_magic_quotes_gpc() отчеты 0. Я повторяю, волшебные кавычки отключены. Магические кавычки, похоже, были отключены в php.ini (не во время выполнения).

Тем не менее, все данные POST, включая одинарные кавычки ('), экранируются при доступе в PHP. Что может быть причиной этого?

Спасибо.


Редактировать: Для любопытных, это скриншот нашего пхинфо: http://img843.imageshack.us/img843/6959/screenshot20120120at552.png


Редактировать: При подготовке тестового примера я обнаружил общее происхождение проблемы. Мы загружаем Wordpress, поскольку наше приложение интегрируется с многоузловой установкой WP. Когда я отключаю загрузку Wordpress, автоматическое экранирование отключается. Кто-нибудь знает, где может находиться код автоматического выхода Wordpress?

Author: Your Common Sense, 2012-01-21

6 answers

Я думаю, что нашел его. Проблема (ошибка): http://core.trac.wordpress.org/ticket/18322

Решение: http://codex.wordpress.org/Function_Reference/stripslashes_deep

    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);

Примечание: Как предложил @Alexandar О'Мара, вы, возможно, захотите пересмотреть перезапись суперглобалов, как это. Если это подходит для вашей ситуации, например, вы можете просто "раздеться локально", используя альтернативу, такую как $post = array_map('stripslashes_deep', $_POST);

Также смотрите @quickshiftin отличный ответ.

 36
Author: rinogo, 2015-11-09 06:12:48

Расширяя ответ @rinogo более глубоким объяснением и предлагая другой обходной путь.


В wp-settings.php есть безусловный призыв к wp_magic_quotes

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

Wordpress избегает кавычек, несмотря ни на что

function wp_magic_quotes() {
    // If already slashed, strip.
    // Escape with wpdb.
    // Force REQUEST to be GET + POST.
}

Что интересно, хотя этот вызов выполняется после загрузки плагинов , до загрузки темы . Ооочень, в верхней части вашего плагина

// A hack to cope with un-configurable call to wp_magic_quotes
// E.G. Make the original $_POST available through a global $_REAL_POST
$_REAL_GET     = $_GET;
$_REAL_POST    = $_POST;
$_REAL_COOKIE  = $_COOKIE;
$_REAL_REQUEST = $_REQUEST;

Тогда вы можете свободно использовать $_REAL_POST и др. вместо $_POST (помня, что это глобальный , а не суперглобальный ), где вам нужно. Также помните, что, хотя ваш плагин был загружен до темы, если тема вызывает одну из функций плагина, которая использует $_POST, она должна считываться из $_REAL_POST, чтобы получить неэкранированные значения.

 13
Author: quickshiftin, 2013-12-11 08:20:19

Лучший ответ, приведенный здесь, - скопировать для собственного использования, например:

$post = array_map('stripslashes_deep', $_POST);

Однако с этим есть теоретическая проблема: поскольку вы работаете с дубликатом, вы не можете сохранять какие-либо изменения в суперглобальных (эй, я не говорю, что это хорошая практика, хорошо?).

Решение: методы доступа

В попытке решить эту проблему определенным образом и без каких-либо побочных эффектов я создал "методы доступа", которые прозрачно применяются stripslashes_deep() или addslashes_deep()* к запросы на получение/установку следующих суперглобальных массивов:

* Мне пришлось скинуть addslashes_deep() вместе с WordPress' stripslashes_deep().

  • $_GET
  • $_POST
  • $_COOKIE
  • $_SERVER
  • $_REQUEST

Вы можете использовать их следующим образом:

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

Вот код (я называю его gpcsr.php):

<?php

// cat stripslashes_deep() | sed 's/stripslashes/addslashes/g'
function addslashes_deep( $value ) {
    if ( is_array($value) ) {
        $value = array_map('addslashes_deep', $value);
    } elseif ( is_object($value) ) {
        $vars = get_object_vars( $value );
        foreach ($vars as $key=>$data) {
            $value->{$key} = addslashes_deep( $data );
        }
    } elseif ( is_string( $value ) ) {
        $value = addslashes($value);
    }

    return $value;
}

function _generic_slashes_wrap(&$arr, $key, $value = null) {
    if (func_num_args() === 2) return stripslashes_deep($arr[$key]);
    else $arr[$key] = addslashes_deep($value);
}

function _get       ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_GET,      $key); else _generic_slashes_wrap($_GET,        $key, $value); }
function _post      ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_POST,     $key); else _generic_slashes_wrap($_POST,       $key, $value); }
function _cookie    ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_COOKIE,   $key); else _generic_slashes_wrap($_COOKIE,     $key, $value); }
function _server    ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_SERVER,   $key); else _generic_slashes_wrap($_SERVER,     $key, $value); }
function _request   ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_REQUEST,  $key); else _generic_slashes_wrap($_REQUEST,    $key, $value); }

?>
 0
Author: André Chalella, 2015-11-09 14:15:48

Мне просто пришлось разобраться с этой проблемой, и я нашел, на мой взгляд, довольно хороший обходной путь. Это гарантирует, что GPC никогда не будут разрезаны. Я просто поместил это в начало своего файла плагина (я думаю, это тоже сработало бы в верхней части темы):

add_action( 'init', 'unslash_gpc' );
function unslash_gpc() {
    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);
}

И теперь все идеально!

 0
Author: Jordan, 2015-11-28 21:07:41

Wordpress предоставляет решение для этого с помощью функции wordpress stripslashes_deep. Таким образом, фрагменты, упомянутые в ответе @rinogo, станут следующими:

$_GET     = stripslashes_deep($_GET);
$_POST    = stripslashes_deep($_POST);
$_COOKIE  = stripslashes_deep($_COOKIE);
$_REQUEST = stripslashes_deep($_REQUEST);

Также обратите внимание, что wordpress ничего не говорит о глобальной переменной $_SERVER, поэтому я бы предположил, что это не повлияет.

WordPress добавляет косые черты в $_POST/$_GET/$_REQUEST/$_COOKIE независимо от того, что возвращает get_magic_quotes_gpc(). Таким образом, в контексте WordPress, косые черты() или при использовании этих переменных всегда следует использовать функцию stipslashes_deep().

 0
Author: George Dimitriadis, 2017-04-24 12:43:43

Или просто делай, как я. Прокомментируйте всю реализацию в load.php метод wp_magic_quotes().

Мне не нужны волшебные кавычки. Это причиняло мне гораздо больше головной боли, чем того стоило. Лично я предпочитаю поддерживать свою собственную дисциплину входной санитарии. Я просто не хочу начинать формировать плохие привычки программирования.

Но я понимаю стремление WordPress включить такую "функцию". Возможно, сообществу разработчиков лучше всего было бы воспользоваться глобальным возможность отключить его.

 -2
Author: Tony Gingrich, 2015-01-11 01:56:07