Sicherheitspatch SUPEE-10752 - Mögliche Probleme?

14

Für Magento 1 ist ein neuer Sicherheitspatch verfügbar, der 25 APPSEC-Probleme behebt

https://magento.com/security/patches/supee-10752

Auf welche allgemeinen Probleme müssen Sie achten, wenn Sie diesen Patch anwenden?

SUPEE-10752, Magento Commerce 1.14.3.9 und Open Source 1.9.3.9 enthalten mehrere Sicherheitsverbesserungen, mit denen authentifizierte Remote-Codeausführung (RCE) von Admin-Benutzern, Cross-Site Request Forgery (CSRF) und andere Sicherheitsanfälligkeiten geschlossen werden können.

Informationen zu allen Änderungen in den Versionen 1.14.3.9 und 1.9.3.9 finden Sie in den Versionshinweisen zu Magento Commerce und Magento Open Source.

Patches und Upgrades sind für die folgenden Magento-Versionen verfügbar:

Magento Commerce 1.9.0.0-1.14.3.9: SUPEE-10752 oder Upgrade auf Magento Commerce 1.14.3.9.

Magento Open Source 1.5.0.0-1.9.3.9: SUPEE-10752 oder Upgrade auf Magento Open Source 1.9.3.9.

Luke Rodgers
quelle
Das hier beschriebene Problem wurde
behoben

Antworten:

19

Wie von Official Docs By Magento erwähnt :

Konflikte während der Installation des Patches SUPEE-10752 werden meist durch die Installation von Version 1 des vorherigen Patches ( SUPEE-10570v1) verursacht ) verursacht.

Bitte entfernen Sie SUPEE-10570v1 und installieren Sie SUPEE-10570v2, bevor Sie den neuen SUPEE-10752 installieren.

Meetanshi
quelle
11

Die folgenden Dateien werden nach dem Anwenden des Patches geändert / erstellt

app/code/core/Mage/Admin/Model/User.php
app/code/core/Mage/Adminhtml/Block/Catalog/Product/Composite/Fieldset/Options.php
app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php
app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Filter/Datetime.php
app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php
app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php
app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php
app/code/core/Mage/Adminhtml/controllers/Cms/Wysiwyg/ImagesController.php
app/code/core/Mage/Adminhtml/controllers/Cms/WysiwygController.php
app/code/core/Mage/Adminhtml/controllers/CustomerController.php
app/code/core/Mage/Adminhtml/controllers/System/StoreController.php
app/code/core/Mage/Catalog/Model/Product.php
app/code/core/Mage/Catalog/Model/Resource/Category/Tree.php
app/code/core/Mage/Checkout/Model/Api/Resource/Customer.php
app/code/core/Mage/Checkout/Model/Type/Onepage.php
app/code/core/Mage/Checkout/controllers/CartController.php
app/code/core/Mage/Core/Helper/Http.php
app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
app/code/core/Mage/Customer/Helper/Data.php
app/code/core/Mage/Customer/Model/Resource/Customer.php
app/code/core/Mage/Customer/controllers/AccountController.php
app/code/core/Mage/Log/Model/Visitor.php
app/code/core/Mage/Usa/Helper/Data.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract/Backend/Abstract.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Freemethod.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/OriginShipment.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Type.php
app/code/core/Mage/Usa/etc/system.xml
app/code/core/Zend/Filter/PregReplace.php
app/code/core/Zend/Validate/EmailAddress.php
app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option.phtml

app/design/adminhtml/default/default/template/system/shipping/ups.phtml
app/design/frontend/base/default/template/downloadable/catalog/product/links.phtml
app/design/frontend/base/default/template/downloadable/checkout/cart/item/default.phtml
app/design/frontend/base/default/template/downloadable/checkout/onepage/review/item.phtml
app/design/frontend/base/default/template/downloadable/sales/order/items/renderer/downloadable.phtml
app/design/frontend/rwd/default/template/downloadable/checkout/cart/item/default.phtml
app/design/frontend/rwd/default/template/downloadable/checkout/onepage/review/item.phtml
app/design/frontend/rwd/default/template/downloadable/sales/order/items/renderer/downloadable.phtml
app/locale/en_US/Mage_Catalog.csv
app/locale/en_US/Mage_Usa.csv
cron.php
js/tiny_mce/plugins/media/.htaccess
lib/Varien/Image/Adapter/Gd2.php

Für die EE Edition werden die folgenden Dateien mit Ausnahme von CE hinzugefügt

app/code/core/Enterprise/CatalogEvent/Block/Adminhtml/Event/Grid.php
app/code/core/Enterprise/GiftRegistry/Block/Adminhtml/Giftregistry/Edit/Attribute/Attribute.php
app/code/core/Enterprise/GiftRegistry/Model/Attribute/Processor.php
app/code/core/Enterprise/Invitation/Block/Adminhtml/Invitation/Grid.php
app/code/core/Enterprise/Logging/Block/Adminhtml/Details/Renderer/Diff.php
app/code/core/Enterprise/Reward/Block/Adminhtml/Customer/Edit/Tab/Reward/History/Grid/Column/Renderer/Reason.php
app/code/core/Enterprise/TargetRule/Model/Rule.php
app/code/core/Enterprise/TargetRule/controllers/Adminhtml/TargetruleController.php
app/design/adminhtml/default/default/template/enterprise/cms/page/revision/info.phtml

app/design/frontend/enterprise/default/template/cms/hierarchy/pagination.phtml
app/design/frontend/enterprise/iphone/template/downloadable/checkout/cart/item/default.phtml
app/design/frontend/enterprise/iphone/template/downloadable/checkout/onepage/review/item.phtml
app/design/frontend/rwd/enterprise/template/cms/hierarchy/pagination.phtml

app / code / core / Mage / Admin / Model / User.php

+            $sessionUser = $this->getSession()->getUser();
+            if ($sessionUser && $sessionUser->getId() == $this->getId()) {
+                $this->getSession()->setUserPasswordChanged(true);
+            }


+    /**
+     * @return Mage_Admin_Model_Session
+     */
+    protected function getSession()
+    {
+        return  Mage::getSingleton('admin/session');
+    }
+

app / code / core / Mage / Adminhtml / Blockieren / Widget / Gitter / Spalte / Filter / Datetime.php

                     $this->getLocale()->getDateTimeFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)
                 );
             }
-            return $value;
+            return $this->escapeHtml($value);
         }

-        return parent::getEscapedValue($index);
+        return $this->escapeHtml(parent::getEscapedValue($index));
     }
-
 }

app / code / core / Mage / Adminhtml / controller / Catalog / CategoryController.php

+            if (isset($data['general']['path'])) {
+                unset($data['general']['path']);
+            }

app / code / core / Mage / Adminhtml / controller / Catalog / ProductController.php

+                $product->validate();

app / code / core / Mage / Adminhtml / controller / Cms / Wysiwyg / ImagesController.php

+            $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

app / code / core / Mage / Adminhtml / controller / Cms / WysiwygController.php

+        $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

app / code / core / Mage / Adminhtml / controller / CustomerController.php

+                    $customer->setPasswordCreatedAt(time());

app / code / core / Mage / Adminhtml / controller / System / StoreController.php

+   /**
+     * Controller predispatch method
+     *
+     * @return Mage_Adminhtml_Controller_Action
+     */
+    public function preDispatch()
+    {
+        $this->_setForcedFormKeyActions(array('deleteWebsitePost', 'deleteGroupPost', 'deleteStorePost'));
+        return parent::preDispatch();
+    }

app / code / core / Mage / Katalog / Modell / Produkt.php

+                        if (!empty($option['file_extension'])) {
+                            $fileExtension = $option['file_extension'];
+                            if (0 !== strcmp($fileExtension, Mage::helper('core')->removeTags($fileExtension))) {
+                                Mage::throwException(Mage::helper('catalog')->__('Invalid custom option(s).'));
+                            }
+                        }

app / code / core / Mage / Catalog / Model / Resource / Category / Tree.php

+            if (!preg_match("#^[0-9\/]+$#", $item['path'])) {
+                $item['path'] = '';
+            }

app / code / core / Mage / Checkout / Model / API / Resource / Customer.php

+        $customer->setPasswordCreatedAt(time());

Wenn jemand die Datei onepage.php überschreibt, aktualisieren Sie diese bitte.

app / code / core / Mage / Checkout / Model / Type / Onepage.php

  +        $passwordCreatedTime = $this->_checkoutSession->getData('_session_validator_data')['session_expire_timestamp']
    +            - Mage::getSingleton('core/cookie')->getLifetime();
    +        $customer->setPasswordCreatedAt($passwordCreatedTime);

Zur Schlüsselüberprüfung hinzugefügt Bitte überprüfen Sie, ob in Ihrem Warenkorb ein Formularschlüssel vorhanden ist

app / code / core / Mage / Checkout / controller / CartController.php

+        if (!$this->_validateFormKey()) {
+            $this->_redirect('*/*/');
+            return;
+        }
+

app / code / core / Mage / Core / Helper / Http.php

-                if ($this->_getRequest()->getServer($var, false)) {
+                if ($var != 'REMOTE_ADDR' && $this->_getRequest()->getServer($var, false)) {

+        if (strpos($this->_remoteAddr, ',') !== false) {
+            $ipList = explode(',', $this->_remoteAddr);
+            $this->_remoteAddr = trim(reset($ipList));
+        }
+

app / code / core / mage / core / model / session / abstract / varien.php

+    const VALIDATOR_PASSWORD_CREATE_TIMESTAMP   = 'password_create_timestamp';

+    /**
+     * Use password creation timestamp in validator key
+     *
+     * @return bool
+     */
+    public function useValidateSessionPasswordTimestamp()
+    {
+        return true;
+    }
+

+        if ($this->useValidateSessionPasswordTimestamp()
+            && isset($validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP])
+            && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
+            && $validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP]
+            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] - $this->getCookie()->getLifetime()
+        ) {
+            return false;
+        }

+        if (isset($this->_data['visitor_data']['customer_id'])) {
+            $parts[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP] =
+                Mage::helper('customer')->getPasswordTimestamp($this->_data['visitor_data']['customer_id']);
+        }
+

app / code / core / Mage / Kunde / Helfer / Data.php

+    /**
+     * Get customer password creation timestamp or customer account creation timestamp
+     *
+     * @param $customerId
+     * @return int
+     */
+    public function getPasswordTimestamp($customerId)
+    {
+        /** @var $customer Mage_Customer_Model_Customer */
+        $customer = Mage::getModel('customer/customer')
+            ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
+            ->load((int)$customerId);
+        $passwordCreatedAt = $customer->getPasswordCreatedAt();
+
+        return is_null($passwordCreatedAt) ? $customer->getCreatedAtTimestamp() : $passwordCreatedAt;
+    }
+

app / code / core / Mage / Kunde / Modell / Ressource / Kunde.php

-        $customer->setPassword($newPassword);
+        $customer->setPassword($newPassword)->setPasswordCreatedAt(time());
+        $this->saveAttribute($customer, 'password_created_at');
app/code/core/Mage/Customer/controllers/AccountController.php

+                $customer->setPasswordCreatedAt(time());



-        if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {
+        if ($customer = $observer->getEvent()->getCustomer()) {

> app/code/core/Mage/Log/Model/Visitor.php

    -        if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {
    +        if ($customer = $observer->getEvent()->getCustomer()) {

app / code / core / Mage / Usa / Helper / Data.php

+
+    /**
+     * Validate ups type value
+     *
+     * @param $valueForCheck string ups type value for check
+     *
+     * @return bool
+     */
+    public function validateUpsType($valueForCheck) {
+        $result = false;
+        $sourceModel = Mage::getSingleton('usa/shipping_carrier_ups_source_type');
+        foreach ($sourceModel->toOptionArray() as $allowedValue) {
+            if (isset($allowedValue['value']) && $allowedValue['value'] == $valueForCheck) {
+                $result = true;
+                break;
+            }
+        }
+        return $result;
+    }
 }

cron.php

cron.php: Ausnahmebehandlung in der cron.php-Datei

-Mage::app('admin')->setUseSessionInUrl(false);
+try {
+    Mage::app('admin')->setUseSessionInUrl(false);
+} catch (Exception $e) {
+    Mage::printException($e);
+    exit;
+}

lib / Varien / Image / Adapter / Gd2.php

GD2: Gibt den echten MIME-Typ zurück.

+        header("Content-type: ".$this->getMimeTypeWithOutFileType());

+
+    /**
+     * Gives real mime-type with not considering file type field
+     *
+     * @return string
+     */
+    public function getMimeTypeWithOutFileType()
+    {
+        return $this->_fileMimeType;
+    }
 }

js / tiny_mce / plugins / media / .htaccess

Wenn Sie nginx anstelle von Apache verwenden, müssen Sie Ihre Konfiguration aktualisieren, um diese Änderung zu duplizieren.

+<IfModule mod_rewrite.c>
+    <Files moxieplayer.swf>
+        RewriteEngine on
+        RewriteCond %{QUERY_STRING} !^$
+        RewriteRule ^(.*)$ %{REQUEST_URI}? [R=301,L]
+    </Files>
+</IfModule>

app / design / adminhtml / default / default / template / system / shipping / ups.phtml

+if (!in_array($storedOriginShipment, array_keys($orShipArr))) {
+    $storedOriginShipment = '';
+}

+if ($storedFreeShipment != '' && !in_array($storedFreeShipment, array_keys($defShipArr))) {
+    $storedFreeShipment = '';
+}

+if (!Mage::helper('usa')->validateUpsType($storedUpsType)) {
+    $storedUpsType = '';
+}

Versandart neu hinzugefügte / aktualisierte Dateien sind:

app/code/core/Mage/Usa/Helper/Data.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract/Backend/Abstract.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Freemethod.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/OriginShipment.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Type.php

Escapehtml-Dateien:

Frontend-Dateien für herunterladbare Produkte: Wenn Sie herunterladbare Produkte verwenden, aktualisieren Sie bitte die Dateien in Ihren Designdateien.

app / design / frontend / base / default / template / downloadable / catalog / product / links.phtml

Code überprüfen

<dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo
    > $this->getLinksTitle() ?></label></dt>

Ersetzen mit

<dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo
    > $this->escapeHtml($this->getLinksTitle()); ?></label></dt>

app / design / frontend / base / default / template / downloadbar / checkout / cart / item / default.phtml

Code überprüfen

<dt><?php echo $this->getLinksTitle() ?></dt>

Ersetzen mit

 <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app / design / frontend / base / default / template / downloadable / sales / order / items / renderer / downloadable.phtml

Code überprüfen

<dt><?php echo $this->getLinksTitle() ?></dt>

Ersetzen mit

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app / design / frontend / default / iphone / template / downloadbar / checkout / cart / item / default.phtml

Code überprüfen

<dt><?php echo $this->getLinksTitle() ?></dt>

Ersetzen mit

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app / design / frontend / default / iphone / template / downloadbar / checkout / onepage / review / item.phtml Code überprüfen

`<dt><?php echo $this->getLinksTitle() ?></dt>`

Ersetzen mit

`<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>`

app / design / frontend / rwd / default / template / downloadbar / checkout / cart / item / default.phtml Code überprüfen

`<dt><?php echo $this->getLinksTitle() ?></dt>`

Ersetzen mit

`<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>`

app / design / frontend / rwd / default / template / downloadbar / checkout / onepage / review / item.phtml

Code überprüfen

<dt><?php echo $this->getLinksTitle() ?></dt>

Ersetzen mit

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app / design / frontend / rwd / default / template / downloadable / sales / order / items / renderer / downloadable.phtml

Code überprüfen

<dt><?php echo $this->getLinksTitle() ?></dt>

Ersetzen mit

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

Andere Escapehtml-Dateien:

app / code / core / Mage / Adminhtml / Block / Katalog / Produkt / Composite / Fieldset / Options.php

+        if (!empty($option['file_extension'])) {
+            $option['file_extension'] = $this->escapeHtml($option['file_extension']);
+        }

app / code / core / Mage / Adminhtml / Blockieren / Katalog / Produkt / Bearbeiten / Tab / Optionen / Option.php

-                    $value['file_extension'] = $option->getFileExtension();
+                    $value['file_extension'] = $this->escapeHtml($option->getFileExtension());

app / design / frontend / enterprise / default / template / cms / hierarchy / pagination.phtml

-    <li><a title="<?php echo $this->escapeHtml($node->getLabel())?>" href="<?php echo $node->getUrl()?>"><?php echo $this->getNodeLabel($node)?></a></li>

+    <li><a title="<?php echo $this->escapeHtml($node->getLabel())?>" href="<?php echo $node->getUrl()?>"><?php echo $this->escapeHtml($this->getNodeLabel($node)); ?></a></li>
Rama Chandran M
quelle
Auf welcher Seite in App / Code / Core / Mage / Checkout / Controllers / CartController.php sehen Sie normalerweise Form-Key-Fehler?
Icon
1
Ich sehe keinen Formularschlüsselfehler. Wenn jemand die Standarddatei / template / checkout / cart.phtml und den fehlenden Formularschlüssel überschreibt. Es wird durch Umleiten der Homepage nicht durch Fehler. Es ist eine Checkliste. Wenn ein Fehler auftritt, überprüfen Sie bitte den Formularschlüssel :). Vielen Dank für Ihre Fragen :)
Rama Chandran M
1
Ich denke nicht, dass es sehr nützlich ist, alle Patch-Unterschiede hier zu veröffentlichen. Ich bin mehr an tatsächlichen möglichen Problemen interessiert ...
7ochem
1
Danke für deinen Kommentar. Ich halte es für nützlich für andere, weil es einfach ist zu finden, welche Dateien geändert wurden und welche Änderungen am Kerncode vorgenommen wurden. Beispiel app / design / frontend / rwd / default / template / downloadable / checkout / onepage / review / item.phtml Nehmen wir an, wir überschreiben Ihr Thema, ändern Sie einfach den Code und es ist mehr wie eine Checkliste.
Rama Chandran M
8

Die Änderung der überladenen filterMethode in Zend_Filter_PregReplaceist naiv und setzt voraus, dass $this->_matchPatternes sich immer um eine Zeichenfolge handelt. Diese Eigenschaft wird anschließend als erstes Argument an übergeben preg_replace. In Wirklichkeit ist ein Array auch ein völlig gültiges Argument. Diese Tatsache wird tatsächlich von mehreren Zend_FilterKernklassen (wie z. B. Zend_Filter_Word_SeparatorToCamelCase) verwendet. Jede Erweiterung / Verzweigung von Code, die diesen Filter oder eine seiner Ableitungen mit einem Array-Argument für verwendet _matchPattern, wird ausgelöst Warning: substr() expects parameter 1 to be a string, array given.

Ein grobes Beispiel dafür, was es wahrscheinlich tun sollte, wäre etwas in der Art von:

/**
 * Perform regexp replacement as filter
 *
 * @param  string $value
 * @return string
 */
public function filter($value)
{
    if ($this->_matchPattern == null) {
        #require_once 'Zend/Filter/Exception.php';
        throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.');
    }

    $patterns = is_array($this->_matchPattern) ? $this->_matchPattern : array($this->_matchPattern);
    foreach ($patterns as $pattern) {
        if ($this->_containsEvalModifier($pattern)) {
            throw new Zend_Filter_Exception(get_class($this) . ' uses deprecated modifier "/e".');
        }
    }

    return preg_replace($this->_matchPattern, $this->_replacement, $value);
}

/**
 * Check if the modifiers contains the eval flag.
 *
 * @param  string $value
 * @return bool
 */
protected function _containsEvalModifier($pattern)
{
    $firstDelimiter = substr($pattern, 0, 1);
    $partsOfRegex = explode($firstDelimiter, $pattern);
    $modifiers = array_pop($partsOfRegex);

    return ($modifiers != str_replace('e', '', $modifiers));
}

Obwohl ich dies noch nicht gründlich getestet habe.

EDIT: Es ist erwähnenswert, dass die oben vorgeschlagene Lösung zwar die Fehler verhindern sollte, die Implementierung aber technisch noch ein bisschen naiv und anfällig für Fehlalarme ist. Es wird davon ausgegangen, dass das Regex-Trennzeichen, das das Muster von den Modifikatoren trennt, mit dem am Anfang der Zeichenfolge übereinstimmt. Technisch muss dies nicht der Fall sein, da PHP verschiedene Begrenzer für Klammern unterstützt. Daher bestimmt die gültige Eingabe {hello}is, welche Modifikatoren hello}is(und nicht die tatsächlichen Modifikatoren von is) sind, und löst daher eine Ausnahme aus, obwohl das Muster den eModifikator nicht tatsächlich enthält .

Peter O'Callaghan
quelle
5

1.7.0.2 Versionsproblem: Nachdem Sie den Patch installiert und eine Seite ausgecheckt haben (generische Magento-Prüfung), wird dieser Fehler angezeigt

Error: Syntax Error, unerwartet

app / code / core / Mage / Checkout / Model / Type / Onepage.php in Zeile 691

Beim Umkehren des Patches verschwindet der Fehler.

Ich habe mich eingehender mit dieser Frage befasst und festgestellt, dass der Patch der Datei onepage.php die folgende Zeile hinzugefügt hat.

$passwordCreatedTime = $this->_checkoutSession->getData('_session_validator_data')['session_expire_timestamp']
            - Mage::getSingleton('core/cookie')->getLifetime();
        $customer->setPasswordCreatedAt($passwordCreatedTime);

LÖSUNG: Danke an @FabianSchmengler

UPDATE AUF PHP Version 5.4 und höher!

Symbol
quelle
Ich habe auch das Patch-Original angewendet, es wird $ passwordCreatedTime = $ this -> _ checkoutSession-> getData ('_ session_validator_data') ['session_expire_timestamp'] - Mage :: getSingleton ('core / cookie') -> getLifetime (); nächste Zeile (neue Zeile erstellt / hinzugefügt) - Mage :: getSingleton ('core / cookie') -> getLifetime (); Ursache des Problems erstellt
Rama Chandran M
@RamaChandranM Ja! Erhalten Sie den gleichen PARSE-Fehler? Auch welche Version benutzt du?
Icon
1
Ja, ich werde ein anderes Projekt überprüfen und weitere Details bereitstellen. Ans :)
Rama Chandran M
2
@Icon Es gab einen Patch für die Kompatibilität mit PHP 5.4. Ich habe lange Zeit keine 1.7-Installation angerührt, aber ich würde erwarten, dass sie auch mit 5.6 funktioniert. Probieren Sie es aus.
Fabian Schmengler
1
@icon Sie können Verfallsmitteilungen vorerst ignorieren. Dies wird relevant, wenn Sie auf PHP 7
Fabian Schmengler,
2

bekanntes Problem :-

Wenn Ihr benutzerdefinierter Code oder Ihre benutzerdefinierte Erweiterung Zend/Filter/PregReplace.php mit dem Modifikator e verwendet, wird jetzt aufgrund möglicher RCE-Probleme ein Fehler zurückgegeben.

Dieser Patch folgt unter Sicherheit.

1) Zusätzliche Passwortänderung für die Validierung der Admin-Sitzung

+++ app/code/core/Mage/Admin/Model/User.php

+            $sessionUser = $this->getSession()->getUser();
+            if ($sessionUser && $sessionUser->getId() == $this->getId()) {
+                $this->getSession()->setUserPasswordChanged(true);
+            }

und dann

+    /**
+     * @return Mage_Admin_Model_Session
+     */
+    protected function getSession()
+    {
+        return  Mage::getSingleton('admin/session');
+    }
+

class Mage_Admin_Model_User

+        $oldPassword = $this->getPassword();
     $this->setId(null);
     $this->load($id);
+        $isUserPasswordChanged = $this->getSession()->getUserPasswordChanged();
+        if ($this->getPassword() !== $oldPassword && !$isUserPasswordChanged) {
+            $this->setId(null);
+        } elseif ($isUserPasswordChanged) {
+            $this->getSession()->setUserPasswordChanged(false);
+        }

2) Überprüfung der Dateierweiterung

app/code/core/Mage/Adminhtml/Block/Catalog/Product/Composite/Fieldset/Options.php

+        if (!empty($option['file_extension'])) {
+            $option['file_extension'] = $this->escapeHtml($option['file_extension']);
+        }

app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php

-                    $value['file_extension'] = $option->getFileExtension();
+                    $value['file_extension'] = $this->escapeHtml($option->getFileExtension());

app/code/core/Mage/Catalog/Model/Product.php

+                        if (!empty($option['file_extension'])) {
+                            $fileExtension = $option['file_extension'];
+                            if (0 !== strcmp($fileExtension, Mage::helper('core')->removeTags($fileExtension))) {
+                                Mage::throwException(Mage::helper('catalog')->__('Invalid custom option(s).'));
+                            }
+                        }

3) Escape Html für XSS hinzugefügt

+++ app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Filter/Datetime.php

-            return $value;
+            return $this->escapeHtml($value);
     }

-        return parent::getEscapedValue($index);
+        return $this->escapeHtml(parent::getEscapedValue($index));

app/design/frontend/base/default/template/downloadable/catalog/product/links.phtml

-        <dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo $this->getLinksTitle() ?></label></dt>
+        <dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo $this->escapeHtml($this->getLinksTitle()); ?></label></dt>

app/design/frontend/base/default/template/downloadable/checkout/cart/item/default.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/base/default/template/downloadable/checkout/onepage/review/item.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/base/default/template/downloadable/sales/order/items/renderer/downloadable.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/default/iphone/template/downloadable/checkout/onepage/review/item.phtml

-                <dt><?php echo $this->getLinksTitle() ?></dt>
+                <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/rwd/default/template/downloadable/checkout/cart/item/default.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/rwd/default/template/downloadable/checkout/onepage/review/item.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/rwd/default/template/downloadable/sales/order/items/renderer/downloadable.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

4) XPath-Ausdruck zur Überprüfung der Layoutaktualisierung

app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php

+    /**
+     * XPath expression for checking layout update
+     *
+     * @var array
+     */
+    protected $_disallowedXPathExpressions = array(
+        '*//template',
+        '*//@template',
+        '//*[@method=\'setTemplate\']',
+        '//*[@method=\'setDataUsingMethod\']//*[text() = \'template\']/../*'
+    );
+

Mage_Adminhtml_Model_LayoutUpdate_Validator

-        if ($templatePaths = $value->xpath('*//template | *//@template | //*[@method=\'setTemplate\']/*')) {
+        if ($templatePaths = $value->xpath($this->_getXpathValidationExpression())) {

Mage_Adminhtml_Model_LayoutUpdate_Validator

+    /**
+     * Returns xPath for validate incorrect path to template
+     *
+     * @return string xPath for validate incorrect path to template
+     */
+    protected function _getXpathValidationExpression() {
+        return implode(" | ", $this->_disallowedXPathExpressions);
+    }
+



+    /**
+     * Returns xPath for validate incorrect path to template
+     *
+     * @return string xPath for validate incorrect path to template
+     */
+    protected function _getXpathValidationExpression() {
+        return implode(" | ", $this->_disallowedXPathExpressions);
+    }
+

app/code/core/Mage/Catalog/Model/Resource/Category/Tree.php

+            if (!preg_match("#^[0-9\/]+$#", $item['path'])) {
+                $item['path'] = '';
+            }

5) Authentifizierte SQL-Injection beim Speichern einer Kategorie

app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController

+            if (isset($data['general']['path'])) {
+                unset($data['general']['path']);
+            }

6) Produktvalidierung app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php

+                $product->validate();

7) Mimetyp app/code/core/Mage/Adminhtml/controllers/Cms/Wysiwyg/ImagesController.php

+            $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

app/code/core/Mage/Adminhtml/controllers/Cms/WysiwygController.php

+        $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

lib/Varien/Image/Adapter/Gd2.php

-        header("Content-type: ".$this->getMimeType());
+        header("Content-type: ".$this->getMimeTypeWithOutFileType());


+
+    /**
+     * Gives real mime-type with not considering file type field
+     *
+     * @return string
+     */
+    public function getMimeTypeWithOutFileType()
+    {
+        return $this->_fileMimeType;
+    }

8) Kundenpasswort erstellt am app/code/core/Mage/Adminhtml/controllers/CustomerController.php

+                    $customer->setPasswordCreatedAt(time());

app/code/core/Mage/Checkout/Model/Api/Resource/Customer.php

+        $customer->setPasswordCreatedAt(time());

app/code/core/Mage/Checkout/Model/Type/Onepage.php

+        $passwordCreatedTime = $this->_checkoutSession->getData('_session_validator_data')['session_expire_timestamp']
+            - Mage::getSingleton('core/cookie')->getLifetime();
+        $customer->setPasswordCreatedAt($passwordCreatedTime);

app/code/core/Mage/Core/Model/Session/Abstract/Varien.php

+    const VALIDATOR_PASSWORD_CREATE_TIMESTAMP   = 'password_create_timestamp';


+    /**
+     * Use password creation timestamp in validator key
+     *
+     * @return bool
+     */
+    public function useValidateSessionPasswordTimestamp()
+    {
+        return true;
+    }


+        if ($this->useValidateSessionPasswordTimestamp()
+            && isset($validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP])
+            && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
+            && $validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP]
+            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] - $this->getCookie()->getLifetime()
+        ) {
+            return false;
+        }

app/code/core/Mage/Customer/Helper/Data.php

+    /**
+     * Get customer password creation timestamp or customer account creation timestamp
+     *
+     * @param $customerId
+     * @return int
+     */
+    public function getPasswordTimestamp($customerId)
+    {
+        /** @var $customer Mage_Customer_Model_Customer */
+        $customer = Mage::getModel('customer/customer')
+            ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
+            ->load((int)$customerId);
+        $passwordCreatedAt = $customer->getPasswordCreatedAt();
+
+        return is_null($passwordCreatedAt) ? $customer->getCreatedAtTimestamp() : $passwordCreatedAt;
+    }
+

app/code/core/Mage/Customer/Model/Resource/Customer.php

-        $customer->setPassword($newPassword);
+        $customer->setPassword($newPassword)->setPasswordCreatedAt(time());
     $this->saveAttribute($customer, 'password_hash');
+        $this->saveAttribute($customer, 'password_created_at');

app/code/core/Mage/Customer/controllers/AccountController.php

+                $customer->setPasswordCreatedAt(time());

Mage_Customer_AccountController

+            $customer->setPasswordCreatedAt(time());
         $customer->save();

``

+                $customer->setPasswordCreatedAt(time());

app/code/core/Mage/Log/Model/Visitor.php

-        if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {
+        if ($customer = $observer->getEvent()->getCustomer()) {

9) UPS Änderungen

app/code/core/Mage/Usa/Helper/Data.php

+
+    /**
+     * Validate ups type value
+     *
+     * @param $valueForCheck string ups type value for check
+     *
+     * @return bool
+     */
+    public function validateUpsType($valueForCheck) {
+        $result = false;
+        $sourceModel = Mage::getSingleton('usa/shipping_carrier_ups_source_type');
+        foreach ($sourceModel->toOptionArray() as $allowedValue) {
+            if (isset($allowedValue['value']) && $allowedValue['value'] == $valueForCheck) {
+                $result = true;
+                break;
+            }
+        }
+        return $result;
+    }

HINZUGEFÜGTE Dateien für UPS

`app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract/Backend/Abstract.php` 
`app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Freemethod.php`
`app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/OriginShipment.php`
`app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Type.php`

Einstellung für diese neue Funktionalität hinzugefügt

app/code/core/Mage/Usa/etc/system.xml

+                            <backend_model>usa/shipping_carrier_ups_backend_freemethod</backend_model>

Linie 843

+                            <backend_model>usa/shipping_carrier_ups_backend_originShipment</backend_model>

886

+                            <backend_model>usa/shipping_carrier_ups_backend_type</backend_model>

app/design/adminhtml/default/default/template/system/shipping/ups.phtml

+if (!in_array($storedOriginShipment, array_keys($orShipArr))) {
+    $storedOriginShipment = '';
+}
+if ($storedFreeShipment != '' && !in_array($storedFreeShipment, array_keys($defShipArr))) {
+    $storedFreeShipment = '';
+}
+if (!Mage::helper('usa')->validateUpsType($storedUpsType)) {
+    $storedUpsType = '';
+}
 ?>

10) Zend Klasse hinzugefügt

`app/code/core/Zend/Filter/PregReplace.php`
`app/code/core/Zend/Validate/EmailAddress.php`

1> 1) Produktvalidierung für das Bundle

app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option.phtml

+    <?php $_selection->setSku($this->escapeHtml($_selection->getSku())); ?>

12) Admin-Sitzung in try catch in cron.php

-Mage::app('admin')->setUseSessionInUrl(false);
+try {
+    Mage::app('admin')->setUseSessionInUrl(false);
+} catch (Exception $e) {
+    Mage::printException($e);
+    exit;
+}
Murtuza Zabuawala
quelle
2

Es sieht so aus, als ob ein Teil des Patches htmlEscaping all "getLinksTitle ()" ist. Sie haben jedoch die folgenden Dateien vergessen (diese basieren auf 1.8.1).

app/design/frontend/base/default/template/downloadable/checkout/multishipping/item/downloadable.phtml

app/design/frontend/base/default/template/downloadable/email/order/items/creditmemo/downloadable.phtml

app/design/frontend/base/default/template/downloadable/email/order/items/invoice/downloadable.phtml

app/design/frontend/base/default/template/downloadable/email/order/items/order/downloadable.phtml

app/design/frontend/base/default/template/downloadable/sales/order/creditmemo/items/renderer/downloadable.phtml

app/design/frontend/base/default/template/downloadable/sales/order/invoice/items/renderer/downloadable.phtml

app/design/frontend/default/iphone/template/downloadable/sales/order/creditmemo/items/renderer/downloadable.phtml

app/design/frontend/default/iphone/template/downloadable/sales/order/invoice/items/renderer/downloadable.phtml
René Schep
quelle
2

Patch funktioniert nicht auf Vanille Magento CE 1.8.0.0

Update: Lösung unten hinzugefügt.

Problem:

file app/design/frontend/base/default/template/downloadable/sales/order/items/renderer/downloadable.phtml
Hunk #1 FAILED at 54.

Angewandte frühere Patches:

  • APPSEC-212
  • SUPEE-2619
  • SUPEE-2725
  • SUPEE-3941
  • SUPEE-5344
  • SUPEE-5994
  • SUPEE-6237
  • SUPEE-6285
  • SUPEE-6482
  • SUPEE-6788
  • SUPEE-7405
  • SUPEE-7405v.1.1
  • SUPEE-7616
  • SUPEE-8167
  • SUPEE-8788v2
  • SUPEE-8967
  • SUPEE-9652
  • SUPEE-9767v2
  • SUPEE-10336
  • SUPEE-10266
  • SUPEE-10415
  • SUPEE-10570v2

Lösung

Behoben durch Bearbeiten der Patch-Datei. Der Patch für wurde downloadable.phtmldurch den Patch für v1.7.0.2in der ursprünglichen Patchdatei ersetzt. Dies sind die Zeilen 1854-1862.

Dies liegt hauptsächlich an der Einrückung in der Datei. Da haben sich die Änderungen für downloadable.phtmlin V1.7.0.2stärker eingerückt.

Lösung 2

Ich hatte ein ähnliches Problem, aber ich konnte es beheben, indem ich die Originaldatei in einem Editor erneut speicherte, der erzwang, dass das Zeilenende Unix-LFs und nicht Windows-CRLFs oder Mac-CRs waren

Jeroen Vermeulen - MageHost
quelle
1

In Bezug auf Matt Antley enthielten sie aus diesem Grund möglicherweise kein SUPEE-10570v2

Magento wurde kürzlich über ein Problem sowohl mit dem Patch SUPEE-10570> als auch mit der Magento-Version 1.9.3.8/1.14.3.8 informiert, das dazu führen kann, dass Kunden beim Versuch, sich beim Checkout zu registrieren, den Checkout nicht abschließen können. Magento stellt jetzt einen aktualisierten Patch (SUPEE-10570v2) zur Verfügung, der dieses Problem nicht mehr verursacht. Beachten Sie jedoch, dass dieser neue Patch nicht länger vor zwei Sicherheitsproblemen im Zusammenhang mit der Behandlung von Sitzungen mit geringem Risiko schützt, gegen die der Patch SUPEE-10570 geschützt ist. https://magento.com/security/patches/supee-10570

Soweit ich weiß, war der Checkout-Fehler nicht sehr häufig und so entschieden sie sich, bei SUPEE-10570 zu bleiben, was vor den beiden risikoarmen Sicherheitsproblemen schützt ?!

zlep
quelle
+1 Dies ist höchstwahrscheinlich der Grund dafür. Es ist jedoch zu beachten, dass Benutzer, die ein Upgrade durchführen und sich bewerben mussten, SUPEE-10570v2es erneut anwenden müssen.
Matt Antley
Wie Peter O'Callaghan feststellte, werden Änderungen von 10570v2 um 10752 zurückgesetzt, sodass die ersteren nicht berücksichtigt werden müssen. Da es für 1.9.3.9 kein 10570v2 gibt, sollten Sie nichts anwenden. Die ganze Argumentation ist schwach: Warum sollte Magento seinen 1.9.3.9-Zweig auf einer anderen Basis als alle anderen lassen? Sie sagten sogar, dass sie jede zukünftige Version und jeden zukünftigen Patch auf 10570v2 basieren werden.
Pong
Danke für die Kommentare Peter und Pong. Habe meine Antwort entfernt, da sie irreführend ist, wie von Ihnen beiden angegeben. Es war nicht meine Absicht, nur etwas, woran ich beim Schreiben nicht gedacht hatte, und etwas, das ich kurz bemerkte, als ich es mir ansah SUPEE-10752und ein wenig mit der Waffe sprang. Nochmals vielen Dank für die Kommentare.
Matt Antley
1

Patch funktioniert nicht auf Vanille Magento CE 1.6.0.0

Update: Lösung unten hinzugefügt.

Probleme:

file app/code/core/Mage/Admin/Model/User.php
Hunk #1 FAILED at 127.
...
file app/code/core/Mage/Customer/controllers/AccountController.php
Hunk #2 FAILED at 812.

Angewandte frühere Patches:

  • APPSEC-212
  • SUPEE-2631
  • SUPEE-2725
  • SUPEE-5344
  • SUPEE-5994
  • SUPEE-6237
  • SUPEE-6285
  • SUPEE-6482
  • SUPEE-6788
  • SUPEE-7405
  • SUPEE-7405v.1.1
  • SUPEE-8167
  • SUPEE-8788v2
  • SUPEE-8967
  • SUPEE-9652
  • SUPEE-9767v2
  • SUPEE-10266
  • SUPEE-10415
  • SUPEE-10570v2
  • SUPEE-10752

Gelöst

Ich habe dieses Problem durch Ändern der Patch-Datei behoben. Ich habe die Hunks, die die Probleme gaben, durch die entsprechenden aus dem Patch für v1.5.1.0 ersetzt. In der ursprünglichen Patch-Datei sind dies die Zeilen 167-177 und 663-670.

Jeroen Vermeulen - MageHost
quelle
1

In EE v1.14.2.4 musste ich nach der Anwendung von SUPEE-10752 auch den folgenden Patch anwenden, um das Problem zu beheben, bei dem der Checkout anstelle der Erfolgsseite auf die Homepage umgeleitet wird:

Datei: invalid_session_fix-2018-03-14-05-10-19.patch

diff --git a/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php b/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
index 59b3ea8..35155f1 100644
--- a/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
+++ b/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
@@ -485,7 +485,7 @@ class Mage_Core_Model_Session_Abstract_Varien extends Varien_Object
             && isset($validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP])
             && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
             && $validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP]
-            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] - $this->getCookie()->getLifetime()
+            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP]
         ) {
             return false;
         }

Das oben genannte Update finden Sie in https://magento.com/tech-resources/download unter SUPEE-10570 > invalid_session_fix.patch (0 MB).

Richard Feraro
quelle
Das Gleiche gilt für CE 1.9.3.6, wenn PHP <5.5 ist. Vielen Dank für die
Fehlerbehebung
1

Ich habe nach diesem Patch ein Problem festgestellt. Ich kann "Freie Methode" für "UPS-Typ" "United Parcel Service XML" nicht festlegen. Magento löst einen Fehler aus, wenn eine Methode in der Dropdown-Liste "Freie Methode" ausgewählt wird. Fehler: " Feld" Ups Free-Methode "hat falschen Wert. "

Hat jemand das gleiche Problem und hat die Lösung?

Danke im Voraus!

Manju Chauhan
quelle
0

Auf 1.6 ist der Patch ups.phtml defekt. Es bezieht sich auf $ savedOriginShipment, $ savedFreeShipment mit einem Tippfehler in 1.6 ($ stroredOriginShipment und $ stroredFreeShipment). Außerdem verweist es auf $ savedUpsType, das in 1.6 überhaupt nicht existiert.

Carsten
quelle
0

Wir haben ein Problem mit 1.9.1.0 und 1.9.2.4 festgestellt (haben es nicht auf anderen getestet). Es taucht nicht bei allen unseren Projekten auf, hat sich aber bei mehreren wiederholt. Wir glauben, dass dies irgendwann Auswirkungen auf die Projekte hat, in denen SUPEE-10570v1 installiert war.

Wenn sich ein Benutzer nach dem Anwenden des Patches anmeldet, wird seine Kontoseite einwandfrei angezeigt. Wenn sie jedoch versuchen, zu einer anderen Seite der Site zurückzukehren, reagiert die Seite nicht mehr und es wird entweder ein leerer Bildschirm oder ein 502 Bad Gateway angezeigt. Dies ist darauf zurückzuführen, dass PHP in eine Endlosschleife gerät und entweder durch die INI-Einstellungen von PHP einen Fehler verursacht oder gestoppt wird.

Ich habe zu graben geschaffen , dass das Problem auf der Linie , dass Belastungen , die eine unendliche Rekursion ist $customerin \app\code\core\Mage\Customer\Helper\Data.php, getPasswordTimestamp().

$customer = Mage::getModel('customer/customer')
        ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
        ->load((int)$customerId);

Wenn Sie die Stapelspur der unendlichen Rekursion betrachten, wird diese immer wieder wiederholt. Irgendwie scheint es ->load(), dass die getPasswordTimestamp()Methode am Ende aufgerufen wird.

Die Problemumgehung in /magento//a/235984/67252 funktioniert einwandfrei, aber ich möchte wissen, was passiert.

Jakkara
quelle
0

Nach dem Anwenden des Patches SUPEE 10752 führt "Registrieren" und "Auschecken" die Erfolgsseite zur Startseite. Irgendwelche Vorschläge?

Anurag Khandelwal
quelle
-1

Nach dem Anwenden von SUPEE-10752 und dem Kompilieren wurde unter / checkout / * eine leere Seite angezeigt

Version: 1.9.1.0

Auslösebedingungen: Anwendung von SUPEE-10752 + Compiler aktivieren + Anmeldung als Kunde, dann besuchen / checkout / *

Nur zur Verdeutlichung: Bei deaktiviertem Compiler lief alles gut, bei aktiviertem Compiler konnten wir nur dann eine leere Warenkorbseite sehen, wenn wir ohne Protokolleinträge angemeldet waren (auch wenn alle möglichen Protokolle und der Entwicklermodus aktiviert waren).

jun
quelle