APPSEC-1057 Como adicionar variáveis ​​ou blocos às tabelas da lista branca

45

APPSEC-1057 (parte do SUPEE-6788) declara

O Magento agora inclui uma lista de permissões de blocos ou diretivas permitidas. Se um módulo ou alguém usa variáveis ​​como {{config path=”web/unsecure/base_url”}}e {{block type=rss/order_new}}em páginas ou e-mails do CMS, e as diretivas não constam dessa lista, você precisará adicioná-las ao script de instalação do banco de dados.

Extensões ou código personalizado que lida com conteúdo (como extensões de blog) podem ser afetados. Se o seu código usa algumas variáveis ​​ou blocos de configuração, você precisa criar um script de atualização de dados que adicione variáveis ​​ou blocos às tabelas da lista branca:

Como você lista e bloqueia variáveis ​​personalizadas?

paj
fonte

Respostas:

38

Para garantir a integridade, você pode adicionar manualmente blocos e variáveis ​​às listas brancas em Sistema> Permissões> Variáveis e Sistema> Permissões> Blocos . Os códigos que você adiciona estão no formato web/unsecure/base_url(caminho da configuração) ou rss/order_new(alias da classe de bloco).

Resposta original

Meu script de atualização fica assim:

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

Substitua $blockNamese $variableNamespor você mesmo. A ferramenta a seguir ajuda a encontrar variáveis ​​e blocos usados: https://github.com/peterjaap/magerun-addons

Carregar as variáveis ​​/ blocos primeiro garante que você não tente inserir duplicatas (isso poderia travar o script). Isso aconteceu comigo porque o script me mostrou as variáveis ​​"trans_email / ident_general / email" e "trans_email / ident_support / email" que já estão na lista de permissões na versão final do patch.

Como usar o script de atualização

Coloque-o em um módulo personalizado como script de atualização de dados (scripts de atualização de dados são executados após o script de atualização normal, isso garante que as tabelas já existam). Se você ainda não possui um módulo usado para atualizações de configuração, crie-o assim:

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

(como acima)

Fabian Schmengler
fonte
1
Isso funcionou bem para meus blocos personalizados. Não entendo completamente como a lista de permissões variáveis ​​funciona. Variáveis ​​nos meus módulos personalizados existentes não aparecem na lista de permissões, mas estão funcionando.
paj
1
os blocos são exibidos, mas o banco de dados não é alterado. estranho
Claudiu Creanga
apenas para esclarecer meu comentário acima sobre variáveis, estamos falando de variáveis ​​da lista de permissões chamadas em arquivos cms ou locale, ou seja, modelos de email usando {caminho de configuração = e não variáveis ​​de módulo personalizadas acessadas no PHP com Mage :: getStoreConfig ('my_var')? Até agora, as ferramentas encontraram blocos que não estão na lista de permissões, mas sem variáveis.
paj

somente as {{config}}diretivas precisam da lista de permissões. O código destina-se a projectos, não para extensões, assim que eu supor uma loja remendado, mas extensões devem verificar a versão Magento (ou melhor, verifique se existem as tabelas)
Fabian Schmengler

3
Atualizada novamente com uma verificação mais agradável, graças a @ mam08ixo gist.github.com/mam08ixo/3937df764da7a6816a1d
Fabian Schmengler 30/10/2015

16

Você pode adicioná-los manualmente no back-end do Magento em Sistema> Permissões> Variáveis e Sistema> Permissões> Blocos quando o Magento 1.9.2.2 estiver instalado.

Os plug-ins que usam variáveis ​​personalizadas de blocos precisarão adicionar um script de atualização de dados com código semelhante ao mostrado abaixo.

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
Isso só funcionará para a edição da comunidade; eu adicionaria a verificação no CE e no 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
como @DmitryFurs afirmou há melhor fazer a sua verificação , se existir recurso por checing as tabelas ou existência de campos de configuração, mas não na versão
Anton S

Bom ponto Vladimir e Anton. Eu tentei usar isso se ($ installer-> getConnection () -> isTableExists ($ installer-> getTable ('admin / permission_block')))) ... ... mas isso resulta em um erro. Alguma idéia de como verificar poperly se a tabela existe e não fazer nada se não existir?
Solide

Eu atualizei minha resposta, você pode usar o if (Mage :: getModel ('admin / block')) {...}
Solide
5

Você pode encontrar novas tabelas após a instalação do SUPEE-6788patch

permission_variable

permission_block

E você pode adicionar algumas variáveis ​​ou blocos de configuração a essas tabelas da lista de permissões.

DmitryFurs
fonte