Patch di sicurezza SUPEE-10752 - Possibili problemi?


14

È disponibile una nuova patch di sicurezza per Magento 1, che risolve 25 problemi di APPSEC

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

Quali problemi comuni devi fare attenzione quando applichi questa patch?

SUPEE-10752, Magento Commerce 1.14.3.9 e Open Source 1.9.3.9 contengono numerosi miglioramenti della sicurezza che aiutano a chiudere l'esecuzione di codice remoto (RCE) di utenti Admin autenticati, la falsificazione di richieste tra siti (CSRF) e altre vulnerabilità.

Le informazioni su tutte le modifiche nelle versioni 1.14.3.9 e 1.9.3.9 sono disponibili nelle note di rilascio di Magento Commerce e Magento Open Source.

Patch e aggiornamenti sono disponibili per le seguenti versioni di Magento:

Magento Commerce 1.9.0.0-1.14.3.9: SUPEE-10752 o aggiornamento a Magento Commerce 1.14.3.9.

Magento Open Source 1.5.0.0-1.9.3.9: SUPEE-10752 o aggiornamento a Magento Open Source 1.9.3.9.


Problema riscontrato qui di seguito - magento.stackexchange.com/questions/248229/…
Shrenik

Risposte:


19

Come menzionato da Documenti ufficiali di Magento :

I conflitti durante l'installazione della patch SUPEE-10752 sono causati molto spesso dall'installazione della versione 1 della patch precedente ( SUPEE-10570v1 ).

Assicurarsi di rimuovere SUPEE-10570v1 e installare SUPEE-10570v2 prima dell'installazione del nuovo SUPEE-10752.


11

I file seguenti vengono modificati / creati dopo l'applicazione della patch

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

Per EE Edition vengono aggiunti i file seguenti diversi da CE

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 / Amministratore / Modello / 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 / blocchi / Widget / griglia / colonna / 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 / Catalogo / CategoryController.php

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

app / code / core / Mage / Adminhtml / controller / Catalogo / 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 / Sistema / 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 / Catalogo / Modello / 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).'));
+                            }
+                        }

app / code / core / Mage / Catalogo / Modello / Resource / Categoria / Tree.php

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

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

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

Chiunque ignora il file onepage.php, aggiorna il file.

app / code / core / Mage / Checkout / Modello / Tipo / Onepage.php

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

Per la convalida della chiave aggiunta Verificare che il modulo del carrello abbia la chiave del modulo

app / code / core / Mage / Cassa / 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 / Modello / Session / Estratto / 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 / Cliente / 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 / clienti / Modello / Resource / Customer.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: handle di eccezione nel file cron.php

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

lib / Varien / Immagine / adattatore / Gd2.php

GD2: restituisce il tipo mime reale.

+        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

Se usi nginx invece di Apache, assicurati di aggiornare la configurazione per duplicare questa modifica.

+<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 / spedizione / 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 = '';
+}

I metodi di spedizione aggiunti / aggiornati di recente sono:

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

File di escape:

File frontend di prodotti scaricabili: chiunque utilizzi prodotti scaricabili, aggiorna i file nei file dei temi.

app / design / frontend / base / default / template / scaricabile / catalogo / prodotto / links.phtml

Controlla il codice

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

Sostituirlo con

<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 / scaricabile / cassa / carrello / item / default.phtml

Controlla il codice

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

Sostituirlo con

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

app / design / frontend / base / default / template / scaricabile / vendite / ordine / articoli / renderer / downloadable.phtml

Controlla il codice

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

Sostituirlo con

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

app / design / frontend / default / iphone / template / scaricabile / cassa / carrello / item / default.phtml

Controlla il codice

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

Sostituirlo con

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

app / design / frontend / default / iphone / template / scaricabile / checkout / onepage / review / item.phtml Verifica codice

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

Sostituirlo con

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

app / design / frontend / rwd / default / template / scaricabile / checkout / cart / item / default.phtml Verifica codice

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

Sostituirlo con

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

app / design / frontend / RWD / default / template / scaricabile / cassa / onepage / recensione / item.phtml

Controlla il codice

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

Sostituirlo con

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

app / design / frontend / RWD / default / template / scaricabile / vendite / ordine / articoli / renderer / downloadable.phtml

Controlla il codice

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

Sostituirlo con

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

Altri file Escapehtml:

app / code / core / Mage / Adminhtml / blocchi / Catalogo / Prodotti / Composite / Fieldset / Options.php

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

app / code / core / Mage / Adminhtml / blocchi / Catalogo / Prodotti / Modifica / Tab / Opzioni / Option.php

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

app / design / frontend / enterprise / default / template / cms / gerarchia / 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>

in app / code / core / Mage / Checkout / controller / CartController.php, in quale pagina del checkout vedi di solito l'errore Form-key?
Icona

1
Non vedo alcun errore chiave del modulo. se qualcuno sovrascrive il file predefinito / template / checkout / cart.phtml e il formkey mancante. passerà attraverso il reindirizzamento della home page e non per errore. è una lista di controllo. se si verifica un errore, controllare la chiave del modulo :). Grazie per le domande :)
Rama Chandran M

1
Non penso che sia molto utile pubblicare qui tutte le differenze di patch. Sono più interessato ai possibili problemi reali ...
ottobre

1
Grazie per il tuo commento. Penso che sia utile per gli altri perché è facile trovare quali sono i file modificati e quali sono le modifiche al codice di base. Esempio app / design / frontend / rwd / default / template / scaricabile / checkout / onepage / review / item.phtml supponiamo che sovrascriviamo il tuo tema basta cambiare il codice facilmente e anche più è come checklist.
Rama Chandran M

8

La modifica al filtermetodo di overload in Zend_Filter_PregReplaceè ingenua e presuppone che $this->_matchPatternsia sempre una stringa. Questa proprietà viene successivamente fornita come primo argomento a preg_replace. In realtà, un array è anche un argomento perfettamente valido. Questo fatto è effettivamente utilizzato da più Zend_Filterclassi principali (come Zend_Filter_Word_SeparatorToCamelCase). Quindi, qualsiasi estensione / ramo di codice che utilizza questo filtro o uno dei suoi derivati, con un argomento array per _matchPattern, inizierà a essere lanciato Warning: substr() expects parameter 1 to be a string, array given.

Un esempio approssimativo di ciò che probabilmente dovrebbe fare sarebbe qualcosa sulla falsariga di:

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

Anche se non ho ancora effettuato test approfonditi su questo.

EDIT: Vale la pena notare che, sebbene la soluzione proposta sopra dovrebbe prevenire gli errori, l'implementazione è tecnicamente ancora un po 'ingenua e soggetta a falsi positivi. Presuppone che il delimitatore regex che separa il pattern dai modificatori sia uguale a quello all'inizio della stringa. Tecnicamente questo non deve essere il caso poiché PHP supporta vari delimitatori di tipo parentesi. Pertanto, l'input valido {hello}isdeterminerà che i modificatori sono hello}is(anziché i modificatori effettivi di is) e quindi genererà un'eccezione, anche se il pattern in realtà non include il emodificatore.


5

1.7.0.2 Problema di versione: dopo aver installato la patch e vai a un checkout di una pagina (checkout Magento generico), ottieni questo errore

Errore di analisi: errore di sintassi, imprevisto

app / code / core / Mage / Checkout / Model / Type / Onepage.php sulla linea 691

Invertire la patch, l'errore scompare.

Guardando più a fondo in questa domanda, ho scoperto che la patch ha aggiunto la seguente riga al file onepage.php.

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

SOLUZIONE: grazie a @FabianSchmengler

AGGIORNAMENTO A PHP versione 5.4 e successive!


ho anche applicato la patch originale sarà $ passwordCreatedTime = $ this -> _ checkoutSession-> getData ('_ session_validator_data') ['session_expire_timestamp'] - Mage :: getSingleton ('core / cookie') -> getLifetime (); riga successiva (nuova riga creata / aggiunta) - Mage :: getSingleton ('core / cookie') -> getLifetime (); ha creato la causa del problema
Rama Chandran M,

@RamaChandranM Yep! Stai ricevendo lo stesso errore PARSE? Inoltre quale versione stai usando?
Icona

1
sì, controllerò un altro progetto e fornirò maggiori dettagli Ans :)
Rama Chandran M

2
@Icon c'era una patch per la compatibilità di PHP 5.4. Non ho toccato nessuna installazione 1.7 per molto tempo, ma mi aspetto che funzioni anche su 5.6, provalo.
Fabian Schmengler,

1
@icon puoi ignorare le notifiche di deprecazione per il momento, questo diventerà rilevante quando aggiorni a PHP 7
Fabian Schmengler,

2

problema conosciuto :-

Se il tuo codice personalizzato o estensione utilizza Zend/Filter/PregReplace.php con il modificatore e, ora restituirà un errore a causa di possibili problemi RCE.

Questa patch segue la sicurezza.

1) Modifica della password di convalida della sessione di amministrazione aggiuntiva

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

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

e poi

+    /**
+     * @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) Convalida dell'estensione del file

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 aggiunto per XSS

+++ 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) Espressione XPath per il controllo dell'aggiornamento del layout

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) Iniezione SQL autenticata durante il salvataggio di una categoria

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

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

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

+                $product->validate();

7) mimetipo 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) Password password cliente creata 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) Cambiamenti UPS

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;
+    }

File AGGIUNTI per 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`

Aggiunta impostazione per questa nuova funzionalità

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

+                            <backend_model>usa/shipping_carrier_ups_backend_freemethod</backend_model>

Linea 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) Classe Zend aggiunta

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

1> 1) Convalida del prodotto in bundle

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

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

12) Sessione di amministrazione in try catch in cron.php

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

2

Sembra che parte della patch sia htmlEscaping all "getLinksTitle ()". Ma hanno dimenticato i seguenti file (questo si basa su 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

2

La patch non funziona su Magento CE 1.8.0.0 vaniglia

Aggiornamento: soluzione aggiunta di seguito.

Problema:

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

Patch precedenti applicate:

  • 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

Soluzione

Risolto modificando il file patch. Sostituito il patch downloadable.phtmlcon quello del patch perv1.7.0.2 nel file patch originale, queste sono le righe 1854-1862.

Ciò è dovuto principalmente al rientro nel file. Poiché i cambiamenti per downloadable.phtmlin V1.7.0.2sono più rientrati.

Soluzione 2

Ho avuto un problema simile, ma sono stato in grado di risolvere il problema salvando nuovamente il file originale in un editor che ha forzato la fine della linea ad essere LF in stile Unix, non CRLF in stile Windows o CR CR


1

In riferimento a Matt Antley, forse non hanno incluso SUPEE-10570v2 per questo motivo

Magento è stato recentemente informato di un problema con entrambe le patch SUPEE-10570> e Magento versione 1.9.3.8/1.14.3.8 che potrebbe comportare l'impossibilità> dei clienti di completare il checkout quando provano a registrarsi durante il checkout. Magento ora fornisce una patch aggiornata (SUPEE-10570v2) che> non causa più questo problema. Si noti, tuttavia, che questa nuova patch non protegge più da due problemi di sicurezza relativi alla gestione di sessioni a basso rischio da cui è stata protetta la patch SUPEE-10570. https://magento.com/security/patches/supee-10570

Per quanto ne so il bug di checkout non era molto comune e quindi hanno deciso di rimanere con SUPEE-10570 che protegge dai due problemi di sicurezza a basso rischio ?!


+1 Questo è probabilmente il motivo, ma vale la pena notare che se gli utenti SUPEE-10570v2eseguono l' aggiornamento e devono fare domanda , dovranno applicarlo nuovamente.
Matt Antley,

Come affermato da Peter O'Callaghan, i cambiamenti da 10570v2 vengono ripristinati di 10752, quindi non è necessario includere il primo. Dato che non c'è 10570v2 per 1.9.3.9, non dovresti applicare nulla. L'intero ragionamento è debole: perché Magento dovrebbe mantenere il suo ramo 1.9.3.9 su una base diversa rispetto a tutti gli altri? Hanno anche detto che baseranno ogni futura release e patch su 10570v2.
pong

Grazie per i commenti Peter e Pong. Ho rimosso la mia risposta in quanto fuorviante, come affermato da entrambi. Non era mia intenzione, solo qualcosa a cui non ho pensato durante la scrittura ed è stato qualcosa che ho notato brevemente quando ho dato un'occhiata e ho SUPEE-10752saltato un po 'la pistola. Ancora una volta, grazie per i commenti.
Matt Antley,

1

La patch non funziona su Magento CE 1.6.0.0 vaniglia

Aggiornamento: soluzione aggiunta di seguito.

I problemi:

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.

Patch precedenti applicate:

  • 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

risolto

Ho risolto questo problema modificando il file patch. Ho sostituito gli hunk che hanno dato i problemi da quelli corrispondenti dalla patch per v1.5.1.0. Nel file patch originale si tratta delle righe 167-177 e 663-670.


1

In EE v1.14.2.4 dopo aver applicato SUPEE-10752, ho dovuto applicare anche la seguente patch per risolvere il problema in cui il checkout reindirizza alla homepage anziché alla pagina di successo:

File: 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;
         }

La correzione precedente si trova in https://magento.com/tech-resources/download in SUPEE-10570 > invalid_session_fix.patch (0 MB)


Fa lo stesso con CE 1.9.3.6 quando php è <5.5, grazie per la correzione
GunJan Mehta,

1

Ho riscontrato un problema dopo questa patch. Non riesco a impostare "Metodo gratuito" per "Tipo UPS" "United Parcel Service XML". Magento genera un errore quando viene selezionato un metodo qualsiasi nel menu a discesa "Metodo libero". Errore: " Campo" Aumenta metodo libero "ha valore errato. "

Qualcuno ha affrontato lo stesso problema e ottenuto la soluzione?

Grazie in anticipo!


0

Su 1.6, la patch ups.phtml è rotta. Si riferisce a $ storedOriginShipment, $ storedFreeShipment che hanno un refuso in 1.6 ($ stroredOriginShipment e $ stroredFreeShipment). Inoltre fa riferimento a $ storedUpsType che non esiste affatto in 1.6.


0

Abbiamo riscontrato un problema su 1.9.1.0 e 1.9.2.4 (non testato su altri). Non appare su tutti i nostri progetti, ma si è ripetuto su molti di essi. Pensiamo che potrebbe avere ripercussioni sui progetti in cui SUPEE-10570v1 è stato installato ad un certo punto.

Dopo aver applicato la patch, se un utente accede, vedrà perfettamente la pagina del suo account. Tuttavia, se provano a tornare a qualsiasi altra pagina del sito, la pagina smetterà di rispondere e vedranno uno schermo vuoto o un 502 Bad Gateway. Ciò è dovuto al fatto che PHP entra in un ciclo infinito e segfaulting o viene interrotto dalle sue impostazioni .ini.

Sono riuscito a scavare che il problema è una ricorsione infinita sulla riga che carica il $customerin \app\code\core\Mage\Customer\Helper\Data.php, getPasswordTimestamp().

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

Quando si osserva la traccia dello stack della ricorsione infinita, si ripete continuamente in questo. In qualche modo, sembra che ->load()finisce per chiamare ilgetPasswordTimestamp() metodo.

La soluzione alternativa fornita in /magento//a/235984/67252 funziona bene, ma vorrei sapere cosa sta succedendo.


0

Dopo aver applicato la patch SUPEE 10752, la registrazione e il checkout portano la pagina di successo alla homepage. Eventuali suggerimenti?


-1

Abbiamo visto una pagina vuota in / checkout / * dopo aver applicato SUPEE-10752 e compilato

versione: 1.9.1.0

Condizioni di attivazione: applicazione di SUPEE-10752 + abilita compilatore + login come cliente, quindi visita / checkout / *

Solo per chiarire: con il compilatore disattivato tutto è andato bene, con il compilatore attivato abbiamo potuto vedere solo una pagina del carrello vuota quando si è effettuato l'accesso senza alcuna voce di registro (anche dopo aver attivato tutti i registri possibili e la modalità sviluppatore).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.