APPSEC-1057ホワイトリストテーブルに変数またはブロックを追加する方法


45

APPSEC-1057(SUPEE-6788の一部)状態

Magentoには、許可されるブロックまたはディレクティブのホワイトリストが含まれるようになりました。モジュールまたは誰かがCMSページや電子メール{{config path=”web/unsecure/base_url”}}などの 変数を使用{{block type=rss/order_new}}し、ディレクティブがこのリストにない場合は、データベースインストールスクリプトでそれらを追加する必要があります。

コンテンツを処理する拡張機能またはカスタムコード(ブログ拡張機能など)が影響を受ける可能性があります。コードでいくつかの構成変数またはブロックを使用する場合、変数またはブロックをホワイトリストテーブルに追加するデータ更新スクリプトを作成する必要があります。

カスタム変数とブロックをホワイトリストに登録するにはどうすればよいですか?

回答:


38

完全を期すために、[システム]> [権限]> [変数システム]> [権限]> [ブロック]でブロックと変数をホワイトリストに手動で追加できます。ここに追加するコードは、web/unsecure/base_url(config path)またはrss/order_new(block class alias)の形式です。

元の答え

アップグレードスクリプトは次のようになります。

/*
 * 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

1
ブロックは表示されますが、データベースは変更されません。奇妙な
クラウディクレアンガ

上記の変数に関するコメントを明確にするために、cmsまたはロケールファイルで呼び出される変数のホワイトリストについて説明します。つまり、Mage :: getStoreConfig( 'my_var')を使用してPHPでアクセスするカスタムモジュール変数ではなく、{config path =を使用したメールテンプレートですか?これまでのところ、ツールはホワイトリストに登録されていないブロックを見つけましたが、変数はありません。
PAJ

{{config}}ディレクティブのみがホワイトリストに登録する必要があります。コードは、私はパッチを当てた店を想定して、プロジェクトのためではなく、拡張のために意図されていますが、拡張子は、Magentoのバージョンを確認します(または、より良い、テーブルが存在するかどうかを確認)する必要があり
ファビアンSchmengler


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が述べたように、より良いあなたのチェック作る機能が存在する場合のテーブルや構成フィールドのexistanceをchecingことではなく、バージョンに
アントン・S

良い点ウラジミールとアントン。if($ installer-> getConnection()-> isTableExists($ installer-> getTable( 'admin / permission_block'))){...}を使用してみましたが、エラーになります。テーブルが存在するかどうかを確認し、存在しない場合は何もしない方法についてのアイデアはありますか?
-Solide

回答を更新しました。if(Mage :: getModel( 'admin / block')){...}
Solide

5

SUPEE-6788パッチのインストール後、新しいテーブルがあることがわかります。

permission_variable

permission_block

また、これらのホワイトリストテーブルにいくつかの構成変数またはブロックを追加できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.