APPSEC-1057 Как добавить переменные или блоки в таблицы белого списка

45

APPSEC-1057 (часть SUPEE-6788) заявляет

Magento теперь включает в себя белый список разрешенных блоков или директив. Если модуль или кто-либо другой использует переменные, такие как {{config path=”web/unsecure/base_url”}}и {{block type=rss/order_new}}на страницах CMS или в электронных письмах, а директивы отсутствуют в этом списке, вам необходимо добавить их с помощью сценария установки базы данных.

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

Как вы вносите белый список пользовательских переменных и блоков?

PAJ
источник

Ответы:

38

Для полноты можно вручную добавить блоки и переменные в белые списки в разделе « Система»> «Разрешения»> «Переменные и система»> «Разрешения»> «Блоки» . Коды, которые вы добавляете, находятся в форме web/unsecure/base_url(путь конфигурации) или rss/order_new(псевдоним класса блока).

Оригинальный ответ

Мой скрипт обновления выглядит так:

/*
 * Make sure the upgrade is not performed on installations without the tables
 * (i.e. unpatched shops).
 */
$adminVersion = Mage::getConfig()->getModuleConfig('Mage_Admin')->version;
if (version_compare($adminVersion, '1.6.1.2', '>=')) {

    $blockNames = array(
        'cms/block',
        'catalog/product_list',
        'germany/impressum',
        'page/html',
        'magesetup/imprint_field',
        'magesetup/imprint_content'
    );
    foreach ($blockNames as $blockName) {
        $whitelistBlock = Mage::getModel('admin/block')->load($blockName, 'block_name');
        $whitelistBlock->setData('block_name', $blockName);
        $whitelistBlock->setData('is_allowed', 1);
        $whitelistBlock->save();
    }

    $variableNames = array(
        'design/email/logo_alt',
        'design/email/logo_width',
        'design/email/logo_height',
    );

    foreach ($variableNames as $variableName) {
        $whitelistVar = Mage::getModel('admin/variable')->load($variableName, 'variable_name');
        $whitelistVar->setData('variable_name', $variableName);
        $whitelistVar->setData('is_allowed', 1);
        $whitelistVar->save();
    }
}

Замени $blockNamesи $variableNamesна свой. Следующий инструмент помогает найти используемые переменные и блоки: https://github.com/peterjaap/magerun-addons

Сначала загружая переменные / блоки, убедитесь, что вы не пытаетесь вставить дубликаты (это может привести к сбою скрипта). Это произошло со мной, потому что скрипт показал мне переменные «trans_email / идент_генерал / электронная почта» и «trans_email / идент_поддержка / электронная почта», которые уже занесены в белый список в финальной версии патча.

Как использовать скрипт обновления

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

приложение / и т.д. / модули / Project_Config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Project_Config>
            <active>true</active>
            <codePool>local</codePool>
        </Project_Config>
    </modules>
</config>

Приложение / код / ​​местные / Project / Config / и т.д. / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Project_Config>
            <version>0.1.0</version>
        </Project_Config>
    </modules>
    <global>
        <resources>
            <project_config>
                <setup>
                    <module>Project_Config</module>
                    <class>Mage_Core_Model_Resource_Setup</class>
                </setup>
            </project_config>
        </resources>
    </global>
</config>

Приложение / код / ​​местные / Project / Config / данные / project_config / данных установки-0.1.0.php

(как указано выше)

Фабиан Шменглер
источник
1
Это хорошо сработало для моих пользовательских блоков. Я не совсем понимаю, как работает переменный белый список. Переменные в моих существующих пользовательских модулях не отображаются в белом списке, но работают.
Пай
1
блоки показывают, но БД не изменяется. странно
Клаудиу Крянгэ
просто чтобы прояснить мой комментарий выше относительно переменных, мы говорим о переменных белого списка, вызываемых в cms или файлах локали, т.е. в шаблонах электронной почты, использующих {config path =, а не в пользовательских переменных модуля, доступ к которым осуществляется в PHP с помощью Mage :: getStoreConfig ('my_var')? Пока что инструменты нашли блоки, которые не занесены в белый список, но не содержат переменных.
Пай

только {{config}}директивы нуждаются в белых списках. Код предназначен для проектов, а не для расширений, поэтому я предполагаю, что исправлен магазин, но расширения должны проверить версию Magento (или, лучше, проверить, существуют ли таблицы)
Фабиан Шменглер,

3
Обновился еще раз с более приятной проверкой благодаря @ mam08ixo gist.github.com/mam08ixo/3937df764da7a6816a1d
Фабиан Шменглер,

16

Вы можете добавить их вручную в бэкэнд Magento, выбрав Система> Разрешения> Переменные и Система> Разрешения> Блокирует после установки Magento 1.9.2.2.

Плагины, использующие пользовательские переменные блоков, должны будут добавить скрипт обновления данных с кодом, подобным показанному ниже.

if (Mage::getModel('admin/block')) {

    $installer = $this;
    $installer->startSetup();
    $connection = $installer->getConnection();

    $installer->getConnection()->insertMultiple(
        $installer->getTable('admin/permission_block'),
        array(
            array('block_name' => 'flexslider/view', 'is_allowed' => 1),
        )
    );

    $installer->endSetup();

}

1
Это будет работать только для редакции сообщества, я бы добавил проверку на CE и EE: if ((Mage :: getEdition () == Mage :: EDITION_COMMUNITY && version_compare (Mage :: getVersion (), '1.9.2.2', ' > = ')) || (Mage :: getEdition () == Mage :: EDITION_ENTERPRISE && version_compare (Mage :: getVersion (),' 1.14.2.2 ','> = ')) {
Владимир Керхофф,

1
как сказал @DmitryFurs, лучше проверить, существует ли функция , проверяя таблицы или наличие полей конфигурации, но не в версии
Антон С

Хорошие моменты Владимир и Антон. Я пытался использовать это, если ($ installer-> getConnection () -> isTableExists ($ installer-> getTable ('admin /missions_block'))) {...}, но это приводит к ошибке. Есть идеи о том, как проверить, существует ли таблица, и ничего не делать, если ее нет?
Solide
Я обновил свой ответ, вы можете использовать if (Mage :: getModel ('admin / block')) {...}
Solide
5

Вы можете найти новые таблицы после установки SUPEE-6788патча.

permission_variable

permission_block

И вы можете добавить некоторые переменные конфигурации или блоки в эти таблицы белого списка.

DmitryFurs
источник