APPSEC-1057 Comment ajouter des variables ou des blocs aux tableaux de la liste blanche

45

APPSEC-1057 (partie de SUPEE-6788) déclare

Magento inclut maintenant une liste blanche de blocs ou de directives autorisés. Si un module ou une personne utilise des variables telles que {{config path=”web/unsecure/base_url”}}et {{block type=rss/order_new}}dans des pages ou des courriers électroniques du système de gestion de contenu, et que les directives ne figurent pas dans cette liste, vous devrez les ajouter à l'aide de votre script d'installation de base de données.

Les extensions ou le code personnalisé qui gère le contenu (comme les extensions de blog) peuvent être affectés. Si votre code utilise des variables ou des blocs de configuration, vous devez créer un script de mise à jour des données qui ajoute des variables ou des blocs aux tables de la liste blanche:

Comment la liste blanche des variables et des blocs personnalisés?

paj
la source

Réponses:

38

Par souci d'exhaustivité, vous pouvez ajouter manuellement des blocs et des variables aux listes blanches sous Système> Autorisations> Variables et Système> Autorisations> Blocs . Les codes que vous ajoutez sont sous la forme web/unsecure/base_url(chemin de configuration) ou rss/order_new(alias de classe de bloc).

Réponse originale

Mon script de mise à niveau ressemble à ceci:

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

Remplacez $blockNameset $variableNamespar les vôtres. L'outil suivant aide à trouver les variables et les blocs utilisés: https://github.com/peterjaap/magerun-addons

Le chargement des variables / blocs en premier s'assure que vous n'essayez pas d'insérer des doublons (cela planterait le script). Cela m'est arrivé parce que le script m'a montré les variables "trans_email / ident_general / email" et "trans_email / ident_support / email" qui figurent déjà dans la liste blanche de la version finale du correctif.

Comment utiliser le script de mise à niveau

Placez-le dans un module personnalisé en tant que script de mise à niveau des données (les scripts de mise à niveau des données sont exécutés après un script de mise à niveau normal, ce qui garantit que les tables existent déjà). Si vous n'avez pas encore de module que vous utilisez pour les mises à jour de configuration, créez-le comme ceci:

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

(comme ci-dessus)

Fabian Schmengler
la source
1
Cela a bien fonctionné pour mes blocs personnalisés. Je ne comprends pas bien comment fonctionne la liste blanche variable. Les variables de mes modules personnalisés existants n'apparaissent pas dans la liste blanche, mais fonctionnent.
mercredi
1
les blocs montrent, mais la base de données n'est pas modifiée. bizarre
Claudiu Creanga
Juste pour clarifier mon commentaire ci-dessus concernant les variables, parlons-nous de variables de liste blanche appelées dans les fichiers cms ou locale, c.-à-d. des modèles de courrier électronique utilisant {chemin de configuration = et non des variables de module personnalisées accessibles en PHP avec Mage :: getStoreConfig ('my_var')? Jusqu'à présent, les outils ont trouvé des blocs qui ne figurent pas dans la liste blanche, mais pas de variables.
mercredi

seules les {{config}}directives nécessitent une liste blanche. Le code est destiné aux projets, pas aux extensions, donc je suppose un shop corrigé, mais les extensions devraient vérifier la version de Magento (ou mieux, vérifiez si les tables existent)
Fabian Schmengler

3
Mis à jour à nouveau avec un chèque plus joli grâce à @ mam08ixo gist.github.com/mam08ixo/3937df764da7a6816a1d
Fabian Schmengler

16

Vous pouvez les ajouter manuellement dans le backend de Magento sous Système> Autorisations> Variables et Système> Autorisations> Blocs une fois Magento 1.9.2.2 installé.

Les plug-ins qui utilisent des variables personnalisées de blocs devront ajouter un script de mise à niveau des données avec un code similaire à celui présenté ci-dessous.

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
Cela ne fonctionnera que pour l'édition communautaire, j'ajouterais le contrôle sur CE et 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
comme @DmitryFurs a déclaré qu'il valait mieux vérifier si une fonctionnalité existe en vérifiant les tables ou l'existence de champs de configuration, mais pas sur la version
Anton S

Bon point Vladimir et Anton. J'ai essayé d'utiliser ceci si ($ installer-> getConnection () -> isTableExists ($ installer-> getTable ('admin / permission_block'))) {)} mais il en résulte une erreur. Toute idée sur la façon de vérifier poperly si la table existe et ne fait rien si elle ne fonctionne pas?
Solide
J'ai mis à jour ma réponse, vous pouvez utiliser if (Mage :: getModel ('admin / block')) {...}
Solide
5

Vous pouvez trouver de nouvelles tables après l' SUPEE-6788installation du correctif

permission_variable

permission_block

Et vous pouvez ajouter des variables de configuration ou des blocs à ces tables de liste blanche.

DmitryFurs
la source