• 解決済 muro

    (@muromuro)


    wordpressのバージョンが4.2.3になってから、固定ページ上にあるinputタグのvalueの中にショートコードが使えなくなりました。
    そのショートコードは全く実行されず、デバッグモードをtrueにしている場合は以下のエラーメッセージも表示されています。

    Notice: Undefined index: input in /hogehoge/wp-includes/kses.php on line 853

    固定ページに書いたinputタグと、php側に書いたショートコードは以下のとおりです。

    <input type="text" value="[test]" />
    
    function shortcode_test(){
    }
    add_shortcode('test', 'shortcode_test');

    今回書いたショートコードはfunctionの中身が空ですが、中身があろうがなかろうが、どんな内容であろうが、inputで使用したときに限り、エラーになります。
    引数の有無も試してみましたが、どちらであってもエラーになります。
    また、ショートコードのfunctionを書く場所も、テーマ側のfunctions.phpとプラグイン側のphpどちらも試しましたが、これもどこであってもエラーになります。
    なお、他のプラグインは一切起動していません。
    使用中のテーマは自作のものですが、既存のテーマを親にした子テーマにはしておらず、functions.phpには上記のコード以外は記述していません。

    念のためバージョンを4.2.2に下げてやってみましたが、この場合は特に問題なくショートコードを実行できました。
    とにかくバージョン4.2.3になると、inputタグでショートコードが全く使えないという状況です。

    現在作成しているサイトは、これが使えないと非常に困るので、早急な解決を望みます。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • チケット[#33102]で報告されている問題ですか?(よく読んでないけどややこしそう……)

    トピック投稿者 muro

    (@muromuro)

    すみません。
    英語の方のフォーラムは見たことがなかったので、そのチケットには気づきませんでした。
    しかし、英語は得意ではないので、そのチケットと今回の件が同一の問題なのかどうか、すぐにはわかりません…。

    こんばんは。

    とりあえず、次のコードをテーマのfunctions.phpに追加してみてください。

    add_filter( 'wp_kses_allowed_html', 'my_wp_kses_allowed_html', 10, 2 );
    function my_wp_kses_allowed_html( $tags, $context ) {
    	$tags['input']['value'] = true;
    	return $tags;
    }

    今日ちょっと4.2.3のショートコード周りをながめていたのですが、いくつか
    変更されていたので、その影響だと思います。エラー箇所は4.2.3で新しく
    追加された関数のようです。

    トピック投稿者 muro

    (@muromuro)

    回答ありがとうございます。
    教えていただいたコードにより、inputの中でショートコードを使えるようになりました。
    しかし、なぜこのようなコードが必要になったのでしょうか?
    inputタグ内にショートコードを埋め込むことは、脆弱性に繋がるのでしょうか?

    一方、以下のようにhtmlを直接出力するようなコードは問題なく使用できました。

    [test]
    
    function shortcode_test(){
    	return "<input type='text' value='".$_GET["test"]."' />";
    }
    add_shortcode('test', 'shortcode_test');

    muro様

    ソースコードを眺めた感じだと、今回のショートコードの制限対応のポイントは次の3つだと思います。
    1.HTMLコメント内のショートコードを使用不可にした。
    2.HTML要素内の属性値のショートコードを標準では一部使用不可にした(input、select、optionなど)。
    3.HTML要素外(例えば行頭にあるショートコード)については特に制限していない。

    なぜ必要になったかについては、想像になっちゃいますが、次のことは言えると思います。
    1については、IEブラウザチェックをショートコードによって書き換えてしまう可能性を除外したかった。
    2.については、muro様の上記のコードがその要因の1つだといえるかもしれませんね。上記のコードでは$_GETパラメータの値をエスケープなしで出力していますが、これは脆弱性を含んでいます。少なくともesc_attr関数でエスケープしたほうがいいです。
    return "<input type='text' value='".esc_attr( $_GET["test"] )."' />";
    このような感じで、外部から操作できる値($_GETなどのリクエストパラメータやクッキー)を属性値として直接出力することをショートコードで制限したかったということではないでしょうか。

    ほかにも理由はありそうですが、ぱっと思いつくのはこんな感じです。

    モデレーター Takuro Hishikawa

    (@hissy)

    4.2.3で修正されたクロスサイトスクリプティング脆弱性の修正によるものです
    https://wordpress.org/news/2015/07/wordpress-4-2-3/

    トピック投稿者 muro

    (@muromuro)

    みなさんご回答ありがとうございます。
    inputでショートコードが使えなくなったのは脆弱性対策のためであり、バグではないということですね。
    今まで出来たことが急にできなくなったので、てっきり当初はバグだと思い込んでしまいました。
    また、制限を解除して使う場合は、ちゃんとエスケープして使わないと、危険が伴うということですね。
    ショートコードでない場合でも、エスケープには以降気をつけたいと思います。

    モデレーター Takuro Hishikawa

    (@hissy)

    一応、バグという認識ではないかと思いますが、すぐに解決しなさそうです。
    https://core.trac.wordpress.org/ticket/33134

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「バージョンが4.2.3になると、inputのvalueにショートコードが使えない」には新たに返信することはできません。