WordPress и магические цитаты

12

Я писал несколько плагинов для Wordpress, и у меня были некоторые проблемы с Wordpress, помещающим волшебные кавычки в данные POST и GET.

В частности, функция «wp_magic_quotes» в \ wp-includes \ load.php, которая вызывается (предположительно при каждом ответе) в wp-settings.php. Эта функция добавляет к данным магические кавычки, даже если я отключаю магические кавычки в настройках PHP.

/**
 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 *
 * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE,
 * or $_ENV are needed, use those superglobals directly.
 *
 * @access private
 * @since 3.0.0
 */
function wp_magic_quotes() {
    // If already slashed, strip.
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep( $_GET    );
        $_POST   = stripslashes_deep( $_POST   );
        $_COOKIE = stripslashes_deep( $_COOKIE );
    }

    // Escape with wpdb.
    $_GET    = add_magic_quotes( $_GET    );
    $_POST   = add_magic_quotes( $_POST   );
    $_COOKIE = add_magic_quotes( $_COOKIE );
    $_SERVER = add_magic_quotes( $_SERVER );

    // Force REQUEST to be GET + POST.
    $_REQUEST = array_merge( $_GET, $_POST );
}

Безопасно ли мне просто закомментировать вызов wp_magic_quotes () в wp-settings.php? То есть это отрицательно повлияет на нормальный код Wordpress и / или откроет какой-нибудь вектор эксплуатации? Если это так, есть ли другой способ сделать это, кроме изменения кода WP (поэтому мне не приходится иметь дело с этим каждый раз, когда происходит обновление)?

Мэтью Гровс
источник
Может кто-нибудь сказать мне, где / когда функция wp_magic_quotes()выполняется? Я не мог найти исполнение в wp-core.
Т.Тодуа
Эта проблема все еще существует в 2019 году, более 8 лет спустя (например, с PHP 7.1.33 (2019-10-23) и WordPress 5.2.4 (2019-10-14).
Питер Мортенсен

Ответы:

8

Проще говоря, WP превращает неопределенную ситуацию (магические кавычки могут или не могут быть включены в конфигурации сервера) в детерминированные (магические кавычки всегда присутствуют, а конфигурация сервера не имеет значения).

Вместо того, чтобы возиться с этим для всего ядра WP, имеет гораздо больше смысла просто вырезать косые черты в вашем коде по своим собственным переменным, когда вам это нужно.

Rarst
источник
7
Это безумие, если можно. Магические кавычки считаются плохими любым здравомыслящим программистом, и Wordpress действительно делает это безответственно. Не то чтобы я удивился.
о0 '.
5
@Lohoris обратите внимание, что WP существует не только здесь и сейчас. Он существует в течение многих лет. Если бы магические цитаты были изначально плохой идеей, то их бы вообще не было. Хотя времена меняются, и легко кричать, насколько это плохая идея сейчас - изменение существующего поведения в кодовой базе приводит к серьезным последствиям для безопасности и обратной совместимости.
Первый
3

Текущее поведение в WordPress - лучшая практика, основанная на совместимости всех систем и конфигураций PHP. WordPress всегда нормализует $ _GET, $ _POST, $ _COOKIE и $ _SERVER и ожидает, что так будет и дальше.

Итак, чтобы извлечь параметр POST или GET, мы должны написать:

$value = stripslashes_deep($_POST['name']); или же

$value = stripslashes_deep($_GET['name']);
two7s_clash
источник
0

Я написал решение для работы с этими суперглобальными массивами в аналогичном вопросе в Stack Overflow.

Он состоит из написания одного «метода доступа» (get / set) для каждого суперглобального элемента, прозрачного разреза и удаления. Так что вы бы использовали, например:

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

Таким образом, вы можете воздерживаться от дальнейших действий с суперглобалами и наслаждаться решением, которое будет работать «локально» для вашего кода без каких-либо побочных эффектов. Для меня это было окончательное решение.

Андре Шалелла
источник
-3

У меня недавно была эта проблема, и я наконец понял это. Я в основном искал почти каждый сайт по волшебным цитатам на WordPress, и ни один из них не помог.

Вот как это исправить:

  1. Зайдите в ваш wp-settings.php

  2. Поиск по wp_magic_quotes ();

  3. Просто закомментируйте это, и оно должно работать сейчас

Это работает, потому что если вы посмотрите перед этим кодом, вы увидите:

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

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

Джо
источник
6
Плохая идея: после следующего обновления это изменение теряется.
fuxia
Хотя это плохая идея ™, это единственное решение, которое я нашел для одновременной работы WordPress и Magento без проблем Magento при сохранении контента.
forsvunnet
1
Это также плохая идея, потому что многие плагины написаны плохо и неправильно экранируют SQL, поэтому ваш сайт может стать уязвимым для атак SQL-инъекций. И любые плагины, которые делают правильную вещь, запустив stripslashes / stripslashes_deep на $ _GET / $ _ POST, повредят ввод данных пользователем, удалив обратную косую черту.