サポート » 使い方全般 » echoをそのまま使用することについて xss対策

  • 解決済 moritatarou

    (@moritatarou)


    現在WPで作成したサイトにユーザーの「プロフィール情報」を記載しております。
    その際、その文章内で改行を行うために、「br」という文字をstr_replaceで「<br />」タグに書き換えて以下のように出力しております。

    <?php $str=get_the_author_description();$text = str_replace("br", "<br />", $str); echo $text ?>

    ですが、色々調べている内に、echoでそのまま出力することは、危険があるという事がわかり、esc_html等の処理を施したほうが良いということを知りました。
    しかし、文章をエスケープしてしまうと、同時にの改行がされなくなってしまいます。(テキストで「<br />」と表示されてしまいます。)

    セキュリティを対策しつつ上記のようなことができる上手い方法はないでしょうか?

    お知恵をお貸しください。よろしくお願い申し上げます。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • こういう方法は如何でしょうか?

    <?php $str=get_the_author_description();
      foreach( explode( "br", $str ) as $a ):
        print htmlspecialchars( $a );
        print "<br />";
      endforeach;
    ?>

    こんにちは

    Biographical Infoの項目は、許容されるhtml要素の種類は少ないですが、htmlを入力できます。

    a, abbr, acronym,  bblockquote code,  del,  em, q, strike

    なので、単純にesc_html()で処理することは、妥当ではないと思います。

    他の方法として、Biographical Infoに、p要素とbr要素を追加する例を書いておきます。

    functions.phpの最初(<?PHPの前)に追加してみてください。
    フィールドにp br要素が書けるようになると思います

    <?php
    add_filter( 'wp_kses_allowed_html', 'my_add_user_description_element' , 10, 2);
    
    function my_add_user_description_element( $tags,$context ) {
    
    	if( 'user_description' == $context || 'pre_user_description' == $context ) {
    
    		$tags['br'] = array();
    		$tags['p'] = array();
    		return $tags;
    	}
    	return $tags;
    }
    ?>

    nobitaさん、詳しい説明をありがとうございました。

    なので、単純にesc_html()で処理することは、妥当ではないと思います。

    ちゃんと調べずに書いてしまい申し訳ありませんでした。

    ghvstさま、nobitaさま

    ご回答ありがとうございました。
    どちらの方法も、私がやりたいと思っていたことが実装できました。

    なので、単純にesc_html()で処理することは、妥当ではないと思います。

    なるほど、Biographical Info内で<br />を許容するんですね!

    今回は、nobitaさまの方法で実装したいと思います。
    ありがとうございました。

    解決済み!

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「echoをそのまま使用することについて xss対策」には新たに返信することはできません。