basercms icon indicating copy to clipboard operation
basercms copied to clipboard

【カスタムコンテンツ】getFieldValueメソッドの戻り値がh()でエスケープされているため、許可タグが指定できない問題

Open katokaisya opened this issue 7 months ago • 5 comments

概要

カスタムコンテンツ プラグイン BcCcTextHelper BcCcTextareaHelper にて、$optionsが指定できるのに強制的に h()でエスケープした値を返してしまうため、 改行タグや強調タグなどが使用できないです。 該当ソース

BcCcTextHelper

    public function get($fieldValue, CustomLink $link, array $options = [])
    {
        return h($fieldValue);
    }

BcCcTextareaHelper

    public function get($fieldValue, CustomLink $link, array $options = [])
    {
        return nl2br(h($fieldValue));
    }

baserCMS version : 5.1.6

備考

$options = array_merge([
    'escape' => true,
], $options);

等として、 'escape' => false,も指定できるようにしたいです。

katokaisya avatar May 01 '25 12:05 katokaisya

@katokaisya タグを使いたい場合は、Wysiwygを利用するという運用ではまずいですか?

ryuring avatar May 02 '25 01:05 ryuring

@ryuring ありがとうございます。 Wisiwigが多くなりすぎると厳しくなる状況や、1行ニュースなどに強調タグを入れたいときなど、色々厳しい状況も想定できるため、 できれば、getメソッド内のオプションで対応できるとありがたいです。

@seto1 こちら、optionsがあって、使用されていない状態です。

以下のような実装方法であれば、セキュリティ的に問題なさそうですが、いかがでしょうか?

BcCcTextHelper

public function get($fieldValue, CustomLink $link, array $options = [])
{
    $options = array_merge([
        'escape' => true,
    ], $options);

    if ($options['escape'] === false) {
        return $fieldValue;
    }
    return h($fieldValue);
}

BcCcTextareaHelper

public function get($fieldValue, CustomLink $link, array $options = [])
{
    $options = array_merge([
        'escape' => true,
    ], $options);

    if ($options['escape'] === false) {
        return nl2br($fieldValue);
    }
    return nl2br(h($fieldValue));
}

katokaisya avatar May 02 '25 08:05 katokaisya

データの取得と出力が別の関数に分かれていると便利ですね。 BcBaserHelperとかだと、getTitle関数とtitle関数に取得と表示で分かれてますよね。 https://github.com/baserproject/basercms/blob/5.1.x/plugins/baser-core/src/View/Helper/BcBaserHelper.php#L1098 個人的にはエスケープなしのgetのみ提供して各々ビューで出力のタイミングでエスケープしてもらうでもいいと思いますけど。

というかissueの詳細に記載されているコードを見ていて気がついたんですが、この関数の存在意義が謎ですね。

public function get($fieldValue, CustomLink $link, array $options = [])
{
    return h($fieldValue);
}

単に渡された値をエスケープしてるだけなので何もgetしてないですね。 この関数自体がいらないんじゃないかって気がします。

seto1 avatar May 07 '25 07:05 seto1

さらにコード見たら、各項目のHelperのgetは、CustomContentHelper->getFieldValueから呼び出される前提なんですね。 そして項目によっては変換処理が行われてたりしますね。 切り替えできると便利なので、提案通りにescapeオプション追加がいいんじゃないでしょうか。

seto1 avatar May 07 '25 07:05 seto1

@seto1 確認ありがとうございます @katokaisya 瀬戸さんのレビューも通ったので実装お願いしますー

ryuring avatar May 08 '25 07:05 ryuring