Патч безпеки SUPEE-10752 - Можливі проблеми?


14

Новий виправлення безпеки для Magento 1 вирішує 25 проблем APPSEC

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

На які найпоширеніші проблеми ви повинні стежити, застосовуючи цей патч?

SUPEE-10752, Magento Commerce 1.14.3.9 та Open Source 1.9.3.9 містять декілька покращень безпеки, які допомагають закрити автентифіковане виконання віддаленого коду користувача адміністратора (RCE), підробку запитів між веб-сайтами (CSRF) та інші вразливості.

Інформація про всі зміни у версіях 1.14.3.9 та 1.9.3.9 доступна у примітках до випусків Magento Commerce та Magento Open Source.

Виправлення та оновлення доступні для наступних версій Magento:

Magento Commerce 1.9.0.0-1.14.3.9: SUPEE-10752 або оновлення до Magento Commerce 1.14.3.9.

Magento Open Source 1.5.0.0-1.9.3.9: SUPEE-10752 або оновлення до Magento Open Source 1.9.3.9.


Тут викладено детальне питання - magento.stackexchange.com/questions/248229/…
Shrenik

Відповіді:


19

Як згадували офіційні документи від Magento :

Конфлікти під час встановлення виправлення SUPEE-10752 найчастіше викликані встановленням версії 1 попереднього патча ( SUPEE-10570v1 ).

Будь ласка, видаліть SUPEE-10570v1 та встановіть SUPEE-10570v2 перед встановленням нового SUPEE-10752.


11

Наведені нижче файли змінюються / створюються після виправлення патчу

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

Для видання EE наведені нижче файли додаються, крім 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 / 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 / Block / Widget / Grid / Column / 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));
     }
-
 }

додаток / код / ​​core / Mage / Adminhtml / контролери / Каталог / CategoryController.php

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

додаток / код / ​​core / Mage / Adminhtml / контролери / Каталог / ProductController.php

+                $product->validate();

додаток / код / ​​core / Mage / Adminhtml / контролери / Cms / Wysiwyg / ImagesController.php

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

додаток / код / ​​core / Mage / Adminhtml / контролери / Cms / WysiwygController.php

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

додаток / код / ​​core / Mage / Adminhtml / контролери / CustomerController.php

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

додаток / код / ​​core / Mage / Adminhtml / контролери / 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 / Каталог / Модель / 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 / Каталог / Модель / Ресурс / Категорія / Tree.php

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

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

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

Будь-хто переорієнтує файл onepage.php, будь ласка, оновіть його.

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 / Checkout / контролери / 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 / Клієнт / помічник / 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;
+    }
+

додаток / код / ​​core / Mage / Клієнт / Модель / Ресурс / 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: обробка виключення у файлі cron.php

-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: повернути реальний тип mime.

+        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 / плагіни / медіа / .htaccess

Якщо ви використовуєте nginx замість Apache, переконайтеся, що ви оновили свою конфігурацію для дублювання цієї зміни.

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

app / design / adminhtml / за замовчуванням / за замовчуванням / шаблон / система / доставка / 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 = '';
+}

Нещодавно додані / оновлені файли способу доставки:

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:

Файли фронтального завантаження продукту: кожен, хто використовує завантажуваний продукт, будь ласка, оновіть файли у файлах тем.

додаток / дизайн / frontend / base / default / шаблон / завантажуваний / каталог / продукт / 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>

додаток / дизайн / frontend / base / default / шаблон / завантажуваний / checkout / cart / item / default.phtml

Перевірте код

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

Замінити

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

додаток / дизайн / frontend / base / default / шаблон / завантажуваний / продаж / замовлення / items / renderer / downloadable.phtml

Перевірте код

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

Замінити

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

додаток / дизайн / frontend / за замовчуванням / iphone / шаблон / завантажуваний / замовлення / кошик / item / default.phtml

Перевірте код

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

Замінити

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

додаток / дизайн / frontend / за замовчуванням / iphone / шаблон / завантажуваний / замовлення / одна сторінка / огляд / item.phtml Перевірте код

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

Замінити

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

app / design / frontend / rwd / default / шаблон / завантажуваний / checkout / cart / item / default.phtml Перевірте код

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

Замінити

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

додаток / дизайн / frontend / rwd / за замовчуванням / шаблон / завантажуваний / замовлення / одна сторінка / огляд / item.phtml

Перевірте код

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

Замінити

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

додаток / дизайн / frontend / rwd / за замовчуванням / шаблон / завантажуваний / продаж / замовлення / предмети / рендерінг / downloadable.phtml

Перевірте код

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

Замінити

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

Інші файли Escapehtml:

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

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

додаток / дизайн / frontend / підприємство / за замовчуванням / шаблон / cms / ієрархія / 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>

в додатку / код / ​​core / Mage / Checkout / контролери / CartController.php, на якій сторінці під замовлення ви зазвичай бачите помилку форм-ключа?
Ікона

1
Я не бачу жодної помилки ключа форми. якщо хтось переосмислює файл за замовчуванням / template / checkout / cart.phtml та пропущений formkey. це буде через переадресацію домашньої сторінки, а не через помилку. це контрольний список. якщо сталася помилка, перевірте ключ форми :). Дякуємо за запитання :)
Rama Chandran M

1
Я не думаю, що тут дуже корисно розміщувати всі патчі. Мене більше цікавлять актуальні можливі питання ...
7ochem

1
Дякуємо за ваш коментар. Я вважаю, що це корисно для інших, тому що легко знайти, які файли змінені та які основні зміни коду. Приклад програми / дизайн / frontend / rwd / за замовчуванням / шаблон / завантажуваний / замовлення / одна сторінка / огляд / item.phtml припустимо, що ми перекриваємо вашу тему, просто змінимо код easiy і це більше схоже на контрольний список.
Рама Чандран М

8

Модифікація перевантаженого filterметоду в Zend_Filter_PregReplaceнаївна і передбачає, що $this->_matchPatternце завжди рядок. Потім ця властивість надається як перший аргумент preg_replace. Насправді масив - це також цілком коректний аргумент. Цей факт фактично використовується декількома основними Zend_Filterкласами (наприклад, Zend_Filter_Word_SeparatorToCamelCase). Тож будь-яке розширення / гілка коду, що використовує цей фільтр або одну з його похідних, з аргументом масиву для _matchPattern, почне кидати Warning: substr() expects parameter 1 to be a string, array given.

Грубим прикладом того, що він, мабуть, повинен бути, є щось таке:

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

Хоча я ще не провів ретельного тестування цього.

EDIT: Варто зазначити, що хоча запропоноване вище рішення повинно запобігати помилкам, впровадження технічно все ще трохи наївне і схильне до помилкових позитивних результатів. Він передбачає, що роздільник шрифту, що розділяє візерунок від модифікаторів, такий самий, як і на початку рядка. Технічно це не повинно бути так, оскільки PHP підтримує різні роздільники стилів дужок. Тому дійсний вхід {hello}isвизначатиме модифікатори hello}is(а не фактичні модифікатори is) і, таким чином, викине виняток, навіть якщо шаблон фактично не включає eмодифікатор.


5

1.7.0.2 Випуск версії: Після встановлення виправлення та переходу на одну сторінку оформлення замовлення (загальна Magento checkout) отримайте цю помилку

Помилка розбору: помилка синтаксису, несподівана

app / code / core / Mage / Checkout / Model / Type / Onepage.php на лінії 691

Повертаючи виправлення, помилка зникає.

Заглянувши глибше в це питання, я виявив, що патч додав наступний рядок у файл onepage.php.

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

РІШЕННЯ: Дякуємо @FabianSchmengler

ОНОВЛЕННЯ ДО PHP версії 5.4 і вище!


Я також застосував оригінал патчу, це буде $ passwordCreateTime = $ this -> _ checkoutSession-> getData ('_ session_validator_data') ['session_expire_timestamp'] - Mage :: getSingleton ('core / cookie') -> getLifetime (); наступний рядок (новий рядок створений / доданий) - Mage :: getSingleton ('core / cookie') -> getLifetime (); створив причину проблеми
Рама Чандран M

@RamaChandranM Так! Ви отримуєте таку ж помилку PARSE? Також яку версію ви використовуєте?
Ікона

1
так, я перевірю ще один проект та надам детальніше Ans :)
Rama Chandran M

2
@Icon з'явився патч для сумісності PHP 5.4. Я довго не торкався жодної інсталяції 1.7, але очікував би, що вона працює і на 5.6, спробуйте.
Фабіан Шменглер

1
@icon ви можете ігнорувати повідомлення про депрекацію на даний момент, це стане актуальним, коли ви оновите до PHP 7
Fabian Schmengler

2

відоме питання: -

Якщо використовується власний код або розширення Zend/Filter/PregReplace.ph p з модифікатором e, тепер він поверне помилку через можливі проблеми з RCE.

Цей патч випливає нижче з безпеки.

1) Додаткова зміна пароля перевірки сеансу адміністратора

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

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) Перевірка розширення файлу

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) Для XSS додано Escape Html

+++ 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 для перевірки оновлення верстки

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) Автентифікована ін'єкція SQL при збереженні категорії

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

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

6) Перевірка продукту app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php

+                $product->validate();

7) міметип 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) Створено пароль клієнта 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) Зміни ДБЖ

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

Додані файли для ДБЖ

`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

+                            <backend_model>usa/shipping_carrier_ups_backend_freemethod</backend_model>

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

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

1> 1) Валідація продукту

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

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

12) Сеанс адміністратора у спробі ловити в cron.php

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

2

Схоже, що частиною виправлення є htmlEscaping все "getLinksTitle ()". Але вони забули наступні файли (це засновано на 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

Патч не працює на ванільному Magento CE 1.8.0.0

Оновлення: Додано рішення нижче.

Проблема:

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

Застосовувані попередні патчі:

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

Рішення

Виправлено шляхом редагування файлу патча. Замінений патч downloadable.phtmlна патч для для v1.7.0.2в оригінальному файлі патча це рядки 1854-1862.

В основному це пов'язано з відступом у файлі. Оскільки зміни для downloadable.phtmlв V1.7.0.2є більш відступними.

Рішення 2

У мене виникла подібна проблема, але мені вдалося виправити повторне збереження оригінального файлу в редакторі, який вимушений рядок закінчується LF стилю Unix, а не CRLF стилем Windows або Mac CR


1

Стосовно Метта Ентлі, можливо, вони не включали SUPEE-10570v2 через це

Magento нещодавно повідомили про проблему з патчем SUPEE-10570> та Magento версіями 1.9.3.8/1.14.3.8, що може призвести до неможливості клієнтів заповнити замовлення при спробі зареєструватися під час оформлення замовлення. Magento тепер надає оновлений патч (SUPEE-10570v2), який> більше не викликає цю проблему. Однак зауважте, що цей новий патч більше не захищає від двох проблем з безпекою, пов’язаних з обробкою сеансу, з якими захищений патч SUPEE-10570. https://magento.com/security/patches/supee-10570

Наскільки я знаю, помилка в касі була не дуже поширеною, і тому вони вирішили залишитися з SUPEE-10570, який захищає від двох проблем безпеки низького ризику ?!


+1 Це, швидше за все, причина цього, все ж варто зазначити, що якщо користувачі оновлюються та повинні були застосувати, SUPEE-10570v2то їм доведеться повторно застосувати його.
Метт Ентлі

Як заявив Пітер О'Каллаган, зміни з 10570v2 скасовуються на 10752, тому не потрібно включати перші. Оскільки для 1.9.3.9 немає 10570v2, ви нічого не повинні застосовувати. Цілі міркування слабкі: чому Magento повинен зберігати свою гілку 1.9.3.9 на іншій базі, ніж усі інші? Вони навіть сказали, що будуватимуть кожен майбутній випуск та виправлення на 10570v2.
понг

Дякуємо за коментарі Пітер і понг. Вилучили мою відповідь, оскільки вона вводить в оману, як заявили ви обоє. Це не було моїм наміром, просто те, про що я не замислювався, коли писав це, і це було те, що я коротко помітив, коли дивився SUPEE-10752і трохи стрибнув пістолет. Ще раз дякую за коментарі.
Метт Ентлі

1

Патч не працює на ванільному Magento CE 1.6.0.0

Оновлення: Додано рішення нижче.

Проблеми:

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.

Застосовувані попередні патчі:

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

Вирішено

Я вирішив цю проблему, змінивши файл виправлення. Я замінив ханків, які давали проблеми на відповідні з патча для v1.5.1.0. У вихідному файлі виправлення це рядки 167-177 та 663-670.


1

У EE v1.14.2.4 після застосування SUPEE-10752 мені довелося застосувати наступний патч, щоб також виправити проблему, коли каса перенаправляє на головну сторінку замість сторінки успіху:

Файл: 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;
         }

Вищенаведене виправлення знайдено в https://magento.com/tech-resources/download під SUPEE-10570 > invalid_session_fix.patch (0 MB)


Це також робиться з CE 1.9.3.6, коли php <5.5, спасибі за виправлення
GunJan Mehta

1

Я зіткнувся з проблемою після цього виправлення. Я не можу встановити "Безкоштовний метод" для "Тип UPS" "Об'єднана посилка служби XML". Magento видає помилку, коли будь-який метод обраний у спадному меню "Безкоштовний метод". Помилка: " Поле" Безкоштовний метод "має неправильне значення. "

Хтось стикався з тим же питанням і отримав рішення?

Спасибі заздалегідь!


0

На 1.6 патч ups.phtml порушено. Він посилається на $ storageOriginShipment, $ storageFreeShipment, які мають помилку в 1,6 ($ stroredOriginShipment і $ stroredFreeShipment). Крім того, він посилається на $ storageUpsType, який взагалі не існує в 1.6.


0

Ми зіткнулися з проблемою на 1.9.1.0 та 1.9.2.4 (не перевірені на інших). Він з'являється не у всіх наших проектах, але він повторився на кількох з них. Ми думаємо, що це може вплинути на проекти, в які в якийсь момент був встановлений SUPEE-10570v1.

Після застосування виправлення, якщо користувач увійде, він побачить сторінку свого облікового запису ідеально. Однак якщо вони спробують повернутися на будь-яку іншу сторінку на сайті, сторінка перестане відповідати, і вони побачать або порожній екран, або 502 Bad Gateway. Це пов’язано з тим, що PHP потрапляє в нескінченний цикл, або або відшаровується, або зупиняється своїми налаштуваннями .ini.

Я зумів розкопати , що проблема є нескінченною рекурсією на лінії , яка завантажує $customerв \app\code\core\Mage\Customer\Helper\Data.php, getPasswordTimestamp().

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

Дивлячись на стек стеження нескінченної рекурсії, він постійно перетворюється на це знову і знову. Так чи інакше, здається, ->load()кінець викликаєgetPasswordTimestamp() метод.

Вирішення проблеми, наведене в /magento//a/235984/67252, працює чудово, але я хотів би знати, що відбувається.


0

Після застосування патча SUPEE 10752 Реєстрація та оформлення замовлення переносять сторінку успіху на головну сторінку. Будь-які пропозиції?


-1

Ми побачили порожню сторінку в / checkout / * після застосування SUPEE-10752 та компіляції

версія: 1.9.1.0

Умови запуску: застосувати SUPEE-10752 + включити компілятор + логін як клієнт, а потім відвідати / замовити / *

Просто для уточнення: з деактивованим компілятором все пішло добре, при активованому компіляторі ми бачили лише порожню сторінку кошика при вході в систему без записів журналу (навіть після активації всіх можливих журналів та режиму розробника).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.