【カスタムコンテンツ】getFieldValueメソッドの戻り値がh()でエスケープされているため、許可タグが指定できない問題
概要
カスタムコンテンツ プラグイン 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 タグを使いたい場合は、Wysiwygを利用するという運用ではまずいですか?
@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));
}
データの取得と出力が別の関数に分かれていると便利ですね。 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してないですね。 この関数自体がいらないんじゃないかって気がします。
さらにコード見たら、各項目のHelperのgetは、CustomContentHelper->getFieldValueから呼び出される前提なんですね。 そして項目によっては変換処理が行われてたりしますね。 切り替えできると便利なので、提案通りにescapeオプション追加がいいんじゃないでしょうか。
@seto1 確認ありがとうございます @katokaisya 瀬戸さんのレビューも通ったので実装お願いしますー