SUPEE-6788 und Block-Direktiven - neues Berechtigungskonzept

Soeben habe ich den ersten Shop mit dem neuen Patch SUPEE-6788 ausgestattet. Insgesamt also um die 60 geänderte Dateien in die Versionskontrolle aufgenommen, Seite neu geladen und schon war das erste Problem zu erkennen: Auf der Startseite fehlten Inhalte.

Grund dafür ist ein erweitertes Berechtigungs-/Sicherheitskonzept für Block-Direktiven. Was das ist? Das ist die Möglichkeit, in einem Block, einer E-Mail oder auf einer CMS-Seite per Anweisung in geschweiften Klammern neue Blöcke zu erstellen. Manche Magento-Themes bauen ja auch diese Art und Weise das Ganze Design zusammen und sind somit mehr oder weniger schwer von dieser Änderung betroffen.

Beispiel:

{{block type="carousel/carousel" block_id="slider" template="webguys/carousel/carousel.phtml"}}

Dieser Block wird nun ohne eine manuelle Erweiterung der Berechtigungen nicht mehr erstellt. Keine Fehlermeldung, nichts. Er wird praktisch einfach ignoriert. Möchte man diesen Blocktyp erlauben, besucht man einfach die neue Admin-Konfigurationsseite unter System -> Berechtigungen -> Blocks.

Leider ist diese Eingabemaske nicht besonders intuitiv (für nicht-Entwickler). Daher am besten die Blöcke, welcher der Kunde benutzen soll, am besten direkt vorher pflegen.

SUPEE-6788_Block-Permissions

Die entsprechende Prüfung findet neuerdings an dieser Stelle statt:
app/code/core/Mage/Core/Model/Email/Template/Filter.php:171

if (isset($blockParameters['type'])) {
    if ($this->_permissionBlock->isTypeAllowed($blockParameters['type'])) {
        $type = $blockParameters['type'];
        $block = $layout->createBlock($type, null, $blockParameters);
    }
}

Wichtig: Dieses Konzept greift nicht nur bei CMS-Seiten und CMS-Blöcken, sondern eben auch bei E-Mails. Bedeutet, dass MageSetup (ehemals GermanSetup) nach der Installation nicht mehr laufen wird, wenn die Berechtigungen nicht manuell in die Tabelle aufgenommen werden. Da dann im schlimmsten Fall plötzlich ein Shop ohne Widerrufsbelehrung oder AGB online steht, ist das natürlich ein gefundenes Fressen für den ein oder anderen Anwalt, welcher sich auf Abmahnungen spezialisiert hat. Hier ist besondere Vorsicht geboten und bedeutet, dass nach der Installation alles sehr genau geprüft werden sollte.

Fazit

Wieder einmal ändert ein Patch einen wichtigen Teil der uns Entwickler viel Zeit beim Patchen abverlangt. Bei den Admin-Routen wurde glücklicherweise ein Kompatibilitätsmodus eingeführt. Bevor man am Ende viel Arbeit hat, sollte man seine Webseite vor dem Patch nach entsprechenden Blöcken durchsuchen. Zum Beispiel mit:

SELECT * FROM `cms_block` WHERE `content` LIKE '%{{block%';
SELECT * FROM `cms_page` WHERE `content` LIKE '%{{block%';
SELECT * FROM `core_email_template` WHERE `template_text` LIKE '%{{block%';

Viel Erfolg beim Patchen!



Ein Beitrag von Matthias Kleine
Matthias's avatar

Matthias Kleine hatte Mitte 2012 die ersten Kontakte mit Magento - dies geschah durch die Anstellung bei der code-x GmbH als Softwareentwickler. Seit dem bildet er sich ständig im Bereich eCommerce fort, schreibt eigene Extensions und stellt diese gerne auch als OpenSource-Projekte auf GitHub zur Verfügung. Seit Ende 2013 wird Matthias auch im Verzeichnis der zertifizierten Magento-Entwickler gelistet. @klein0r

Alle Beiträge von Matthias

Kommentare
Peseta3 am

Ich hab da im Fishing Tamplate auch so ein slider Banner, nur was muß ich für berechtigungen eingeben damit dieser nach dem Patch wieder funktioniert?

Peseta3 am

hab die Antwort schon selber gefunden: einfach installieren und wenigstens der Zugriff auf die neuen Berechtungen funktioniert wieder.

https://www.magentocommerce.com/magento-connect/static-blocks-everywhere.html

Peseta3 am

Was mach ich nur wenn Ich unter System -> Berechtigungen -> Blocks. nur eine fehlermeldung erscheint.

SQLSTATE[42S02]: Base table or view not found: 1146 Table '41163m31181_2.permission_block' doesn't exist

Trace:

0 /web/1/000/041/163/147921/htdocs/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array) 1 /web/1/000/041/163/147921/htdocs/lib/Zend/Db/Statement.php(300): Varien_Db_Statement_Pdo_Mysql->_execute(Array) 2 /web/1/000/041/163/147921/htdocs/lib/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array) 3 /web/1/000/041/163/147921/htdocs/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT COUNT(*)...', Array) 4 /web/1/000/041/163/147921/htdocs/lib/Varien/Db/Adapter/Pdo/Mysql.php(419): Zend_Db_Adapter_Pdo_Abstract->query('SELECT COUNT(*)...', Array) 5 /web/1/000/041/163/147921/htdocs/lib/Zend/Db/Adapter/Abstract.php(825): Varien_Db_Adapter_Pdo_Mysql->query(Object(Varien_Db_Select), Array) 6 /web/1/000/041/163/147921/htdocs/lib/Varien/Data/Collection/Db.php(225): Zend_Db_Adapter_Abstract->fetchOne(Object(Varien_Db_Select), Array) 7 /web/1/000/041/163/147921/htdocs/lib/Varien/Data/Collection.php(225): Varien_Data_Collection_Db->getSize() 8 /web/1/000/041/163/147921/htdocs/lib/Varien/Data/Collection.php(211): Varien_Data_Collection->getLastPageNumber() 9 /web/1/000/041/163/147921/htdocs/lib/Varien/Data/Collection/Db.php(522): Varien_Data_Collection->getCurPage() 10 /web/1/000/041/163/147921/htdocs/lib/Varien/Data/Collection/Db.php(569): Varien_Data_Collection_Db->_renderLimit() 11 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(533): Varien_Data_Collection_Db->load() 12 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Permissions/Block/Grid.php(55): Mage_Adminhtml_Block_Widget_Grid->_prepareCollection() 13 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(626): Mage_Adminhtml_Block_Permissions_Block_Grid->_prepareCollection() 14 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(632): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid() 15 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(862): Mage_Adminhtml_Block_Widget_Grid->_beforeToHtml() 16 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml() 17 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('grid', true) 18 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(77): Mage_Core_Block_Abstract->getChildHtml('grid') 19 /web/1/000/041/163/147921/htdocs/app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml() 20 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/web/1/000/041/...') 21 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') 22 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() 23 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() 24 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Widget/Container.php(308): Mage_Adminhtml_Block_Template->_toHtml() 25 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Permissions/Block.php(55): Mage_Adminhtml_Block_Widget_Container->_toHtml() 26 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Permissions_Block->_toHtml() 27 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml() 28 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml() 29 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml() 30 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('content', true) 31 /web/1/000/041/163/147921/htdocs/app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content') 32 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/web/1/000/041/...') 33 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') 34 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() 35 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() 36 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml() 37 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml() 38 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput() 39 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Adminhtml/controllers/Permissions/BlockController.php(62): Mage_Core_Controller_Varien_Action->renderLayout() 40 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Adminhtml_Permissions_BlockController->indexAction() 41 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('index') 42 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) 43 /web/1/000/041/163/147921/htdocs/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch() 44 /web/1/000/041/163/147921/htdocs/app/Mage.php(683): Mage_Core_Model_App->run(Array) 45 /web/1/000/041/163/147921/htdocs/index.php(88): Mage::run('', 'store') 46 {main}
Matthias Kleine am

Am besten einmal die Seite im Backend nach Block-Direktiven durchsuchen. Alles andere wäre jetzt Raterei.

Natalie am

Also auf allen anderen Seiten kann ich die Blöcke sehen, nur auf der Startseite nicht, komplett den ganzen Inhalt nicht, auch kein Text.

Kann mir jemmand helfen?

Natalie am

cms/block ist dort aufgelistet und wird auch auf allen anderen Seiten angezeigt, außer home. Ich habe Version 1.9.2 und verwende neues madison island template von magento. Kann mir jemand einen Tipp geben? Das ist wirklich nur auf der startseite

Matthias Kleine am

Wahrscheinlich, dass cms/block nicht in permission_block steht.

Natalie am

Bei wird komplett der ganze Inhalt der Home Seite nicht angezeit? Was könnte der Fehler sein? Bitte um Hilfe

Warum das neue Security-Patch SUPEE-6788 von Magento dringend eingespielt werden sollte | CYBERDAY GmbH Blog am

[…] http://www.webguys.de/magento/supee-6788-und-block-direktiven-neues-berechtigungskonzept/ […]

Timo am

Entschuldigung, ich habe den Artikel in der Eile wohl mehr überflogen. Die Lösung ist es, in den Berechtigungen nachzusehen, nicht im Block selbst.

Timo am

Ich habe mich riesig gefreut, diesen Artikel gefunden zu haben. Leider kann ich bei mir im Bearbeitungsmodus der statischen Blöcke kein Dropdown für "is allowed" finden. Einzig aktivieren kann ich den Block, was aber schon der Fall ist. Zudem habe ich auch keine "Block Details" sondern sondern "Allgemeine Informationen" mit den Feldern "Blocktitel", "Interner Bezeichner", "Status" und "Inhalt".

Suche ich an der falschen Stelle?

Markus Freise am

Danke, liebe Webguys. Arsch gerettet!

Peter am

{{conf übrigens auch.

Matthias Kleine am

Richtig - das habe ich im Artikel ganz vergessen zu erwähnen... ist aber das gleiche Prinzip.

Peter am

Uhm, was hat es denn mit den Variables auf sich? Werden jetzt nicht nur {{block, sondern auch {{var geprüft?

wsdk am

Meiner Meinung nach muss diese Funktion mit einem Text Editor geschrieben worden sein. Bei mir fehlte auf Grund der undefined Variable $block gleich die ganze Homepage und nicht nur einzelne Blöcke.

Code Qualtiät ist meiner Meinung nach mangelhaft. Man kann doch ein isset() verwenden, wenn man Variablen nicht explizit definiert.


        if (isset($blockParameters['type'])) {
            if ($this->_permissionBlock->isTypeAllowed($blockParameters['type'])) {
                $type = $blockParameters['type'];
                $block = $layout->createBlock($type, null, $blockParameters);
            }
        } elseif (isset($blockParameters['id'])) {
            $block = $layout->createBlock('cms/block');
            if ($block) {
                $block->setBlockId($blockParameters['id']);
            }
        }

        if ($block) { 
            $block->setBlockParams($blockParameters);
            foreach ($blockParameters as $k => $v) {
                if (in_array($k, $skipParams)) {
                    continue;
                }
                $block->setDataUsingMethod($k, $v);
            }
        }

        if (!$block) { 
            return '';
        }

Jede gute IDE zeigt diesen Fehler an und gibt einen Hinweis.

Peter O'Callaghan am

You know what, ignore me, Chrome translating your article messes with the order of the query.

Peter O'Callaghan am

OK, that was wrong too, you get the point though, there's a typo :)

Peter O'Callaghan am

I believe your last query should be SELECT * FROM core_email_template WHERE template_text LIKE '%{{block%'

Jsoef am

Danke für den Artikel, hat mir geholfen das Problem mit meinen CMS-Blocks zu lösen. LG Josef

Dein Kommentar