APPSEC-1057 So fügen Sie Variablen oder Blöcke zu den White-List-Tabellen hinzu

45

APPSEC-1057 (Teil von SUPEE-6788) gibt an

Magento enthält jetzt eine Whitelist mit zulässigen Blöcken oder Anweisungen. Wenn ein Modul oder eine andere Person Variablen wie {{config path=”web/unsecure/base_url”}}und {{block type=rss/order_new}}in CMS-Seiten oder E-Mails verwendet und die Direktiven nicht in dieser Liste enthalten sind, müssen Sie sie mit Ihrem Datenbankinstallationsskript hinzufügen.

Erweiterungen oder benutzerdefinierter Code, der Inhalte verarbeitet (z. B. Blog-Erweiterungen), sind möglicherweise betroffen. Wenn Ihr Code einige Konfigurationsvariablen oder -blöcke verwendet, müssen Sie ein Datenaktualisierungsskript erstellen, das Variablen oder Blöcke zu den White-List-Tabellen hinzufügt:

Wie können Sie benutzerdefinierte Variablen und Blöcke auf die Whitelist setzen?

paj
quelle

Antworten:

38

Der Vollständigkeit halber können Sie Blöcke und Variablen manuell zu den Positivlisten unter System> Berechtigungen> Variablen und System> Berechtigungen> Blöcke hinzufügen . Die Codes, die Sie dort hinzufügen, befinden sich in der Form web/unsecure/base_url(Konfigurationspfad) oder rss/order_new(Blockklassenalias).

Ursprüngliche Antwort

Mein Upgrade-Skript sieht folgendermaßen aus:

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

Ersetzen Sie $blockNamesund $variableNamesmit Ihren Selbst. Das folgende Tool hilft bei der Suche nach verwendeten Variablen und Blöcken: https://github.com/peterjaap/magerun-addons

Wenn Sie zuerst die Variablen / Blöcke laden, stellen Sie sicher, dass Sie nicht versuchen, Duplikate einzufügen (dies würde das Skript zum Absturz bringen). Dies geschah mir, weil das Skript mir die Variablen "trans_email / ident_general / email" und "trans_email / ident_support / email" zeigte, die bereits in der endgültigen Patch-Version auf der Whitelist stehen.

Verwendung des Upgrade-Skripts

Platzieren Sie es in einem benutzerdefinierten Modul als Datenaktualisierungsskript (Datenaktualisierungsskripte werden nach dem normalen Aktualisierungsskript ausgeführt, um sicherzustellen, dass die Tabellen bereits vorhanden sind). Wenn Sie noch kein Modul haben, das Sie für Konfigurationsaktualisierungen verwenden, erstellen Sie es folgendermaßen:

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

(wie oben)

Fabian Schmengler
quelle
1
Dies funktionierte gut für meine benutzerdefinierten Blöcke. Ich verstehe nicht ganz, wie die variable Whitelist funktioniert. Variablen in meinen vorhandenen benutzerdefinierten Modulen werden nicht in der Whitelist angezeigt, funktionieren jedoch.
paj
1
Die Blöcke zeigen, aber die Datenbank wird nicht geändert. komisch
Claudiu Creanga
Nur um meinen obigen Kommentar zu Variablen zu verdeutlichen, handelt es sich um Whitelist-Variablen, die in cms- oder Gebietsschemadateien aufgerufen werden, z. B. E-Mail-Vorlagen, die {config path = verwenden, und nicht um benutzerdefinierte Modulvariablen, auf die in PHP mit Mage :: getStoreConfig ('my_var') zugegriffen wird. Bisher haben die Tools Blöcke gefunden, die keine Whitelist, aber keine Variablen enthalten.
paj

Nur {{config}}Direktiven benötigen eine Whitelist. Der Code ist für Projekte gedacht, nicht für Erweiterungen, daher gehe ich von einem gepatchten Shop aus, aber Erweiterungen sollten die Magento-Version überprüfen (oder besser, prüfen, ob die Tabellen vorhanden sind)
Fabian Schmengler

3
Nochmals aktualisiert mit einem besseren Check dank @ mam08ixo gist.github.com/mam08ixo/3937df764da7a6816a1d
Fabian Schmengler

16

Sie können diese manuell im Magento-Backend unter System> Berechtigungen> Variablen und System> Berechtigungen> Blöcke hinzufügen, sobald Magento 1.9.2.2 installiert ist.

Plugins, die benutzerdefinierte Variablen von Blöcken verwenden, müssen ein Datenaktualisierungsskript mit einem Code hinzufügen, der dem unten gezeigten ähnlich ist.

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
Dies funktioniert nur für die Community Edition. Ich würde die Prüfung für CE und EE hinzufügen: 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
Wie @DmitryFurs dort angegeben hat, sollten Sie überprüfen, ob eine Funktion vorhanden ist, indem Sie die Tabellen oder das Vorhandensein von Konfigurationsfeldern überprüfen, jedoch nicht die Version
Anton S

Guter Punkt Vladimir und Anton. Ich habe versucht, dies zu verwenden, wenn ($ installer-> getConnection () -> isTableExists ($ installer-> getTable ('admin / permission_block')) {...}, aber es führt zu einem Fehler. Haben Sie eine Idee, wie Sie poperly überprüfen können, ob die Tabelle vorhanden ist, und nichts tun, wenn dies nicht der Fall ist?
Solide
Ich habe meine Antwort aktualisiert, Sie können verwenden, wenn (Mage :: getModel ('admin / block')) {...}
Solide
5

Nach SUPEE-6788der Installation des Patches finden Sie neue Tabellen

permission_variable

permission_block

Außerdem können Sie diesen Whitelist-Tabellen einige Konfigurationsvariablen oder -blöcke hinzufügen.

DmitryFurs
quelle