EC-CUBE Lab
produced by Cajiya
EC-CUBEに関するカスタマイズ方法やトラブルへの対処方法を発信

商品登録画面のフリーエリアでTwig構文を使用可能にするカスタマイズ方法

公開日: 2025年09月24日 | 更新日: 2025年11月02日
商品 EC-CUBE 4.2系 / Symfony 5.4 サービス/コントローラ拡張

要望や症状

商品登録画面のフリーエリアでTwig構文を使用した画像パスを入力すると、保存時に構文がHTMLエスケープされてしまい、意図した表示にならない問題が発生します。

エスケープの具体例

入力時の構文:

<img src="{{ asset('assets/img/product/hoge/hogehoge.png','user_data') }}" alt="hogehoge" />

保存後の構文:

<img src="%7B%7B%20asset('assets/img/product/hoge/hogehoge.png','user_data')%20%7D%7D" alt="hogehoge" />

問題が発生する条件

この問題は、商品登録画面のフリーエリアにTwig構文(asset()関数など)を含むHTMLを入力して「登録」ボタンを押した際に発生します。保存時にデータベースのdtb_productテーブルのfree_areaカラムで構文がエスケープされてしまいます。

なお、通常のTwig変数({{ BaseInfo.delivery_free_amount|number_format(0, '.', ',') }}など)については正常に保存され、表示時にも適切に動作します。

理由や原因

この問題の原因は、EC-CUBE 4系の商品フリーエリアでHTMLPurifierによるサニタイズ処理が実行される際に、Twig構文の二重波括弧({{}})がHTMLエスケープ処理の対象として認識されてしまうことにあります。

技術的な背景

ProductTypeクラスでは、free_areaフィールドに対して'purify_html' => trueがデフォルトで設定されています。HTMLPurifierはセキュリティ上の観点から、未知の構文や潜在的に危険と判断される記述をエスケープする仕組みになっているため、Twig構文も処理対象となってしまいます。

一方で、既存のTwig変数が正常に動作するのは、HTMLPurifierの設定や処理タイミングが異なることが理由として考えられます。

解決策

解決方法1:相対パスでの記述(推奨)

最も安全で確実な解決方法は、Twig構文を使用せず、直接相対パスを記述することです。この方法であれば、HTMLPurifierの処理に影響されることなく、確実に画像を表示できます。

<img src="html/user_data/assets/img/product/hoge/hoge.png" alt="hogehoge" />

解決方法2:HTMLPurifierの無効化(セキュリティリスクあり)

どうしてもTwig構文を使用したい場合は、CustomizeディレクトリでForm Extensionを作成してHTMLPurifierを無効化することで対応できます。ただし、この方法にはセキュリティ上のリスクが伴うため、十分に検討した上で実装してください。

Form Extension の使用

// app/Customize/Form/Extension/Admin/ProductTypeExtension.php
<?php

namespace Customize\Form\Extension\Admin;

use Eccube\Form\Type\Admin\ProductType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;

class ProductTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('freearea', TextareaType::class, [
            'label' => 'admin.product.freearea',
            'required' => false,
            'purify_html' => false,
        ]);
    }

    public static function getExtendedTypes(): iterable
    {
        return [ProductType::class];
    }
}

セキュリティに関する重要な注意事項

解決方法2を採用する場合は、以下のセキュリティリスクが存在することを理解した上で実装する必要があります。

  • XSS(クロスサイトスクリプティング)攻撃のリスクが高まります:悪意のあるスクリプトが実行される可能性があります
  • HTMLやJavaScriptの実行リスク:意図しないコードが実行される危険性があります
  • 管理権限の適切な管理が必須:管理画面へのアクセス権限を持つユーザーのみが編集可能であることを前提としています

これらのリスクを考慮し、可能な限り解決方法1(相対パス記述)を採用することを強く推奨します。

免責事項

本記事に掲載しているコードや手順は、執筆時点での情報および特定の環境下での動作確認に基づいています。 EC-CUBEのバージョン、サーバー環境、導入済みプラグインとの競合などにより、予期せぬ不具合が発生する可能性があります。

本記事の内容を実行した結果、生じた損害(データの消失、サイトの停止、機会損失など)について、当サイトおよび管理者は一切の責任を負いかねます。 実装にあたっては、必ずバックアップを取得し、検証環境(テスト環境)での動作確認を行った上で、ご自身の責任において実施してください。

この記事は参考になりましたか?

著者プロフィール: 株式会社カジヤ

当社はWeb業界の専門家として、培った経験や技術、自社事業を通して得た知見を土台に、 お客様の事業の成長を後押しすることを提供価値として活動する、Web事業の成長支援会社です。 EC-CUBE公式のパートナー制度「EC-CUBE インテグレートパートナー」に登録してしており、上位11%にあたる「ゴールドランク」に認定された実績があり、新しい通販サイトの構築から、カスタマイズ、リニューアルまで幅広く対応します。

商品 の関連記事

商品 データ不整合 EC-CUBE 4系全般
EC-CUBEで取り扱い終了商品の削除ができない理由と対応方法

EC-CUBEでは、取り扱いを終了した商品を削除したい場合に、削除ができない状態になることがあります...

👍 1 / 👎 0 2025年10月12日
商品 表示/テンプレート調整 EC-CUBE 4系全般
会員のみに商品価格を表示するカスタマイズ方法

EC-CUBEで会員専用サイトや卸売りサイトを構築する際、商品価格をログイン前は非表示にし、会員ログ...

👍 0 / 👎 0 2025年10月12日
商品 検索・絞り込み強化 EC-CUBE 4系全般
管理画面の商品一覧検索で、英字大文字小文字を区別しないようにするカスタマイズ方法

EC-CUBE 4系 の管理画面において、商品一覧の検索機能で英字の大文字小文字が区別される仕様とな...

👍 0 / 👎 0 2025年10月12日
商品 EC-CUBE 4.2系 / Symfony 5.4 Twig改修
商品画像の登録枚数の上限数を変更する方法

EC-CUBE 4.2系の管理画面で商品登録を行う際、商品画像が10枚までしか登録できない制限があり...

👍 0 / 👎 0 2025年10月12日
商品 EC-CUBE 4系全般
商品登録フォームのinputをtextareaに変更するカスタマイズ方法

商品登録時の入力欄がinputタグで表示されており、より多くのテキストを入力しやすいようにtexta...

👍 0 / 👎 0 2025年10月12日

EC-CUBE 4.2系 / Symfony 5.4 の関連記事

メール通知 メール送信不具合 EC-CUBE 4.2系 / Symfony 5.4
XServerでのメール送信設定における環境変数設定エラーの解消方法

XServerでメール送信を行う際に、MAILER_URL環境変数を設定してもメールが送信されない問...

👍 0 / 👎 0 2025年10月12日
商品 EC-CUBE 4.2系 / Symfony 5.4 Twig改修
商品画像の登録枚数の上限数を変更する方法

EC-CUBE 4.2系の管理画面で商品登録を行う際、商品画像が10枚までしか登録できない制限があり...

👍 0 / 👎 0 2025年10月12日
注文履歴(マイページ) EC-CUBE 4.2系 / Symfony 5.4
マイページの注文履歴に決済処理中の注文を表示させるカスタマイズ方法

EC-CUBEのマイページにおいて、お客様が決済処理中の注文を確認できないという要望があります。...

👍 0 / 👎 0 2025年09月23日
会員登録 EC-CUBE 4.2系 / Symfony 5.4 設定変更
会員パスワードの文字制限を変更する方法

EC-CUBE 4.2.0で会員パスワードの文字制限を変更したいという要望があります。 デフォ...

👍 0 / 👎 0 2025年09月23日
ログイン・ログアウト EC-CUBE 4.2系 / Symfony 5.4 設定変更
自動ログインの有効期限を1時間から変更する方法

EC-CUBE 4.2系では、会員ログイン時に「次回から自動的にログインする」をチェックして自動ログ...

👍 0 / 👎 0 2025年09月23日

サービス/コントローラ拡張 の関連記事

メール通知 通知/コミュニケーション EC-CUBE 4系全般
メール件名のショップ名を英語表記に変更する方法

EC-CUBE 4系で、メール件名の先頭に自動挿入される店舗名を英語表記に変更したい場合があります。...

👍 0 / 👎 0 2025年10月12日
マイページ全般 表示/テンプレート調整 EC-CUBE 4系全般
マイページにメール受信履歴ページをカスタマイズする方法

マイページに注文関連のメール履歴を一覧表示する専用ページを作成したいという要望があります。現在のEC...

👍 0 / 👎 0 2025年10月12日
商品 表示/テンプレート調整 EC-CUBE 4系全般
商品詳細ページに獲得予定ポイントを表示するカスタマイズ方法

商品詳細ページで獲得予定ポイントを表示したいケースがあります。...

👍 0 / 👎 0 2025年09月23日
会員登録 セキュリティ強化 EC-CUBE 4系全般
悪意のあるボットによる大量の会員登録を制限する方法

不正なbot等によって、大量の会員登録リクエストが送信されるケースがあります。これらの不正登録では基...

👍 0 / 👎 0 2025年09月23日