APPSEC-1057如何将变量或块添加到白名单表


45

APPSEC-1057(SUPEE-6788的一部分)规定

Magento现在包括允许的块或指令的白名单。如果一个模块或任何用途的变量,比如{{config path=”web/unsecure/base_url”}}{{block type=rss/order_new}}CMS中的网页或电子邮件,而指令是不在此列表中,您需要将它们与你的数据库安装脚本添加。

处理内容的扩展名或自定义代码(例如博客扩展名)可能会受到影响。如果您的代码使用一些配置变量或块,则需要创建一个数据更新脚本,以将变量或块添加到白名单表中:

您如何将自定义变量和块列入白名单?

Answers:


38

为了完整起见,您可以在系统>权限>变量系统>权限>块下,将块和变量手动添加到白名单。您添加的代码的格式为web/unsecure/base_url(配置路径)或rss/order_new(块类别名)。

原始答案

我的升级脚本如下所示:

/*
 * Make sure the upgrade is not performed on installations without the tables
 * (i.e. unpatched shops).
 */
$adminVersion = Mage::getConfig()->getModuleConfig('Mage_Admin')->version;
if (version_compare($adminVersion, '1.6.1.2', '>=')) {

    $blockNames = array(
        'cms/block',
        'catalog/product_list',
        'germany/impressum',
        'page/html',
        'magesetup/imprint_field',
        'magesetup/imprint_content'
    );
    foreach ($blockNames as $blockName) {
        $whitelistBlock = Mage::getModel('admin/block')->load($blockName, 'block_name');
        $whitelistBlock->setData('block_name', $blockName);
        $whitelistBlock->setData('is_allowed', 1);
        $whitelistBlock->save();
    }

    $variableNames = array(
        'design/email/logo_alt',
        'design/email/logo_width',
        'design/email/logo_height',
    );

    foreach ($variableNames as $variableName) {
        $whitelistVar = Mage::getModel('admin/variable')->load($variableName, 'variable_name');
        $whitelistVar->setData('variable_name', $variableName);
        $whitelistVar->setData('is_allowed', 1);
        $whitelistVar->save();
    }
}

更换$blockNames$variableNames用自己的。以下工具有助于查找已使用的变量和块:https : //github.com/peterjaap/magerun-addons

首先加载变量/块,以确保您不尝试插入重复项(这会使脚本崩溃)。发生这种情况是因为脚本向我显示了变量“ trans_email / ident_general / email”和“ trans_email / ident_support / email”,它们已在最终补丁发行版中列入白名单。

如何使用升级脚本

将其作为数据升级脚本放置在自定义模块中(数据升级脚本在常规升级脚本之后运行,这确保表已存在)。如果您还没有用于配置更新的模块,请按以下方式创建它:

app / etc / modules / Project_Config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Project_Config>
            <active>true</active>
            <codePool>local</codePool>
        </Project_Config>
    </modules>
</config>

app / code / local / Project / Config / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Project_Config>
            <version>0.1.0</version>
        </Project_Config>
    </modules>
    <global>
        <resources>
            <project_config>
                <setup>
                    <module>Project_Config</module>
                    <class>Mage_Core_Model_Resource_Setup</class>
                </setup>
            </project_config>
        </resources>
    </global>
</config>

app / code / local / Project / Config / data / project_config / data-install-0.1.0.php

(如上)


1
这对于我的自定义块效果很好。我不完全了解可变白名单的工作方式。我现有的自定义模块中的变量没有出现在白名单中,但是可以正常工作。
paj 2015年

1
块显示,但数据库未更改。很奇怪
Claudiu Creanga 2015年

只是为了澄清我对变量的上述评论,我们是在谈论将在cms或语言环境文件中调用的变量列入白名单,即使用{config path =而不是在PHP中使用Mage :: getStoreConfig('my_var')访问的自定义模块变量的电子邮件模板吗?到目前为止,该工具已找到未列入白名单但没有变量的块。
paj 2015年

只有{{config}}指令需要白名单。该代码用于项目,而不用于扩展,因此,我假设商店打了补丁,但是扩展应检查Magento版本(或者最好检查表是否存在)
Fabian Schmengler 2015年


16

一旦安装了Magento 1.9.2.2,您就可以在Magento后端的“ 系统>权限>变量系统>权限>块”下手动添加它们。

使用块的自定义变量的插件将需要添加具有如下所示代码的数据升级脚本。

if (Mage::getModel('admin/block')) {

    $installer = $this;
    $installer->startSetup();
    $connection = $installer->getConnection();

    $installer->getConnection()->insertMultiple(
        $installer->getTable('admin/permission_block'),
        array(
            array('block_name' => 'flexslider/view', 'is_allowed' => 1),
        )
    );

    $installer->endSetup();

}

1
这仅适用于社区版,我会在CE和EE上添加检查:if(((Mage :: getEdition()== Mage :: EDITION_COMMUNITY && version_compare(Mage :: getVersion(),'1.9.2.2',' > ='))||((Mage :: getEdition()== Mage :: EDITION_ENTERPRISE && version_compare(Mage :: getVersion(),'1.14.2.2','> =')){
Vladimir Kerkhoff

1
正如@DmitryFurs所说,最好通过检查表或配置字段的存在来使功能是否存在,而不是版本上
Anton S

好点弗拉基米尔和安东。我尝试使用此if($ installer-> getConnection()-> isTableExists($ installer-> getTable('admin / permission_block'))){...}但这会导致错误。关于如何普遍检查表是否存在的任何想法,如果不存在,什么也不做?
固体

我已经更新了答案,可以使用if(Mage :: getModel('admin / block')){...}
Solide 2015年

5

SUPEE-6788安装补丁后,您会发现有新表

permission_variable

permission_block

您可以向这些白名单表添加一些配置变量或块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.