Кавычки экранируются, когда magic_quotes_gpc выключен

Magento избегает апострофов, когда magic_quotes_gpc установлено на off. Когда я устанавливаю magic_quotes_gpc в on, Magento перестает вставлять косые черты. Это полностью назад.

Я не могу допустить, чтобы Magento избегал моих апострофов, но я также не хочу, чтобы magic_quotes_gpc устанавливалось в on, потому что я обеспокоен последствиями, которые это может иметь для других частей моего сайта (форум vBulletin, блог Wordpress и т. д.).

Просто отметим: Magento не всегда вел себя таким образом, это началось только сегодня.

РЕДАКТИРОВАТЬ: поведение началось после добавления следующего кода в XML-файл обновления макета одной из моих страниц CMS:

<!--<reference name="content">
<block type="catalog/product_new" name="home.catalog.product.new" alias="product_new" template="catalog/product/new.phtml" after="cms_page"><action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>bundle/catalog/product/price.phtml</template></action></block>
<block type="reports/product_viewed" name="home.reports.product.viewed" alias="product_viewed" template="reports/home_product_viewed.phtml" after="product_new"><action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>bundle/catalog/product/price.phtml</template></action></block>
<block type="reports/product_compared" name="home.reports.product.compared" template="reports/home_product_compared.phtml" after="product_viewed"><action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>bundle/catalog/product/price.phtml</template></action></block>
</reference>
<reference name="right">
<action method="unsetChild"><alias>right.reports.product.viewed</alias></action>
<action method="unsetChild"><alias>right.reports.product.compared</alias></action>
</reference>-->

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


person Nick    schedule 09.08.2011    source источник
comment
Что изменилось на сервере сегодня? Такие вещи обычно не происходят спонтанно. Кроме того, как вы тестируете это. Пример кода, который мы можем попытаться воспроизвести?   -  person Nick    schedule 09.08.2011
comment
На сервере ничего не менялось. Единственное, что я сделал непосредственно перед внесением изменений, — это добавил некоторый код в XML-файл обновления макета страницы CMS. Я добавил код выше. За некоторое время до этого я внес незначительное изменение в robots.txt, чтобы сканеры не могли добраться до этой страницы CMS. Все продолжало работать нормально после этого изменения.   -  person Nick    schedule 09.08.2011


Ответы (2)


РЕДАКТИРОВАТЬ: Я понял проблему. Оказывается, в Wordpress есть собственная функция добавления косых черт. Начиная с Wordpress версии 3.2.1, вы можете найти функцию wp_magic_quotes() в строке 530 файла /wp-includes/load.php.

Чтобы решить эту проблему, я закомментировал все внутри функции (не саму функцию, чтобы предотвратить вызов неопределенной функции). Устранена проблема с экранированными кавычками. Я не проводил тщательного тестирования, но, насколько я понимаю, это может привести к поломке старых плагинов Wordpress, поэтому будьте осторожны.

Отсюда пойдет:

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 );
}

к этому:

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 );*/
}
person Nick    schedule 10.08.2011
comment
Это может сработать, но а) исправление ядра Wordpress никогда не бывает хорошей идеей, и б) вы открываете уязвимость безопасности Wordpress с помощью HTTP-параметров GET и POST, если вы также намереваетесь использовать WordPress независимо от Magento. Если вы включаете Wordpress как часть Magento, вы можете установить флаг, а затем условный возврат в функции wp_magic_quotes... Это может быть нормально. - person Willster; 29.08.2013
comment
@Willster, вы можете расширить это, поскольку я использую wordpress как часть magento, и у меня возникла та же проблема, что и выше. Мне было бы очень интересно узнать, как настроить это таким образом, чтобы предотвратить поломку magento. - person Nick Apromollo; 10.09.2014

В верхней части app/code/core/Mage/Core/functions.php есть это:

if (get_magic_quotes_gpc()) {
    function mageUndoMagicQuotes($array, $topLevel=true) {
        $newArray = array();
        foreach($array as $key => $value) {
            if (!$topLevel) {
                $newKey = stripslashes($key);
                if ($newKey!==$key) {
                    unset($array[$key]);
                }
                $key = $newKey;
            }
            $newArray[$key] = is_array($value) ? mageUndoMagicQuotes($value, false) : stripslashes($value);
        }
        return $newArray;
    }
    $_GET = mageUndoMagicQuotes($_GET);
    $_POST = mageUndoMagicQuotes($_POST);
    $_COOKIE = mageUndoMagicQuotes($_COOKIE);
    $_REQUEST = mageUndoMagicQuotes($_REQUEST);
}

Просто скопируйте этот файл в локальный (app/code/local/Mage/Core/functions.php) и закомментируйте оператор if, чтобы он всегда выполнялся.

// if (get_magic_quotes_gpc()) {
    function mageUndoMagicQuotes($array, $topLevel=true) {
        $newArray = array();
        foreach($array as $key => $value) {
            if (!$topLevel) {
                $newKey = stripslashes($key);
                if ($newKey!==$key) {
                    unset($array[$key]);
                }
                $key = $newKey;
            }
            $newArray[$key] = is_array($value) ? mageUndoMagicQuotes($value, false) : stripslashes($value);
        }
        return $newArray;
    }
    $_GET = mageUndoMagicQuotes($_GET);
    $_POST = mageUndoMagicQuotes($_POST);
    $_COOKIE = mageUndoMagicQuotes($_COOKIE);
    $_REQUEST = mageUndoMagicQuotes($_REQUEST);
// }

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

person mage_dev    schedule 28.11.2014