APPSEC-1057 Cómo agregar variables o bloques a las tablas de la lista blanca

45

APPSEC-1057 (parte de SUPEE-6788) establece

Magento ahora incluye una lista blanca de bloques o directivas permitidas. Si un módulo o alguien usa variables como {{config path=”web/unsecure/base_url”}}y {{block type=rss/order_new}}en páginas o correos electrónicos de CMS, y las directivas no están en esta lista, deberá agregarlas con el script de instalación de la base de datos.

Las extensiones o el código personalizado que maneja el contenido (como las extensiones de blog) pueden verse afectados. Si su código usa algunas variables o bloques de configuración, debe crear un script de actualización de datos que agregue variables o bloques a las tablas de la lista blanca:

¿Cómo se incluyen en la lista blanca variables y bloques personalizados?

paj
fuente

Respuestas:

38

En aras de la exhaustividad, puede agregar manualmente bloques y variables a las listas blancas en Sistema> Permisos> Variables y Sistema> Permisos> Bloques . Los códigos que agregue allí están en el formulario web/unsecure/base_url(ruta de configuración) o rss/order_new(alias de clase de bloque).

Respuesta original

Mi script de actualización se ve así:

/*
 * 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();
    }
}

Reemplace $blockNamesy $variableNamescon el suyo. La siguiente herramienta ayuda a encontrar variables y bloques usados: https://github.com/peterjaap/magerun-addons

Cargar las variables / bloques primero asegura que no intentes insertar duplicados (esto podría bloquear el script). Esto me sucedió porque el script me mostró las variables "trans_email / ident_general / email" y "trans_email / ident_support / email" que ya están incluidas en la lista blanca en la versión final del parche.

Cómo usar el script de actualización

Colóquelo en un módulo personalizado como script de actualización de datos (los scripts de actualización de datos se ejecutan después del script de actualización normal, esto asegura que las tablas ya existan). Si todavía no tiene un módulo que usa para las actualizaciones de configuración, créelo de esta manera:

app / etc / modules / Project_Config.xml

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

app / code / local / Project / Config / etc / 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>

app / code / local / Project / Config / data / project_config / data-install-0.1.0.php

(como anteriormente)

Fabian Schmengler
fuente
1
Esto funcionó bien para mis bloques personalizados. No entiendo completamente cómo funciona la lista blanca variable. Las variables en mis módulos personalizados existentes no aparecen en la lista blanca, pero están funcionando.
paj
1
los bloques muestran, pero la base de datos no cambia. raro
Claudiu Creanga
solo para aclarar mi comentario anterior con respecto a las variables, ¿estamos hablando de variables de la lista blanca llamadas en cms o archivos de configuración regional, es decir, plantillas de correo electrónico que utilizan {config path = y no variables de módulo personalizadas a las que se accede en PHP con Mage :: getStoreConfig ('my_var')? Hasta ahora, las herramientas han encontrado bloques que no están en la lista blanca, pero que no tienen variables.
paj

solo las {{config}}directivas necesitan listas blancas. El código está destinado a proyectos, no a extensiones, por lo que asumo una tienda parcheada, pero las extensiones deben verificar la versión de Magento (o mejor, verificar si las tablas existen)
Fabian Schmengler

3
Actualizado nuevamente con un cheque más agradable gracias a @ mam08ixo gist.github.com/mam08ixo/3937df764da7a6816a1d
Fabian Schmengler

16

Puede agregarlos manualmente en el backend de Magento en Sistema> Permisos> Variables y Sistema> Permisos> Bloques una vez que se instala Magento 1.9.2.2.

Los complementos que usan variables personalizadas de bloques deberán agregar un script de actualización de datos con un código similar al que se muestra a continuación.

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
Esto solo funcionará para la edición comunitaria, agregaría la verificación en CE y 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 ','> = ')) {
Vladimir Kerkhoff

1
como dijo @DmitryFurs, mejor verifique si la función existe al marcar las tablas o la existencia de campos de configuración pero no en la versión
Anton S

Buen punto Vladimir y Anton. Intenté usar esto if ($ installer-> getConnection () -> isTableExists ($ installer-> getTable ('admin / permission_block'))) {...} pero resulta en un error. ¿Alguna idea sobre cómo verificar si la tabla existe y no hacer nada si no existe?
Solide
He actualizado mi respuesta, puedes usar if (Mage :: getModel ('admin / block')) {...}
Solide
5

Puede encontrar que hay tablas nuevas después de SUPEE-6788instalar el parche

permission_variable

permission_block

Y puede agregar algunas variables de configuración o bloques a estas tablas de la lista blanca.

DmitryFurs
fuente