web-dev-qa-db-ja.com

上位ビット文字を含む文字列を指定してもesc_html()が何も返さないのはなぜですか?

PHP 5.2では、filter_var()はテキストをサニタイズします。 WPでは、esc_html()はテキストをサニタイズします。前者は、テキスト文字列内の上位ビット文字で機能します。あ、でも後者は違います。 esc_htmlは、ハイビット文字を含む文字列を完全に食べているようです。これは、単純なWPプラグインとして書かれた例です。

<?php
/*
Plugin Name: bugz tester
*/
class bugz_tester { 
    function __construct() {
        if ( ! is_admin() )
            return;

        add_action('admin_menu', array(&$this,'admin_page'));   
    }

    function admin_page() { 
        add_options_page('Bugz tester', 'bugz', 'edit_posts', 'bugz_sheet', array(&$this,'test_page'));
    }


    function test_page() {    
        ?>
        <div class="wrap">
        <?php
        $ts = 'blah à blah';
        echo "original: " . $ts . "<br/>" ;
        echo  "PHP sanitized: " . $this->sanitize_txt( $ts ) . "<br/>" ;
        echo  "WP sanitized: " . esc_html( $ts ) . "<br/>";               
        die();
        ?>
        </div>
        <?php
    }

    function sanitize_txt ( $text ) {
        $san_text = filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_STRIP_LOW ) ;
        return $san_text;
    }   

}
new bugz_tester();
?>

これが出力です。

原文:blah blah
PHPがサニタイズされました:blahàblah
WPはサニタイズした:

私はesc_html()の使用に夢中になっていません。しかし、代わりにfilter_var()を使用すると、WPカスタムフィールドに追加すると文字列は消えます。どういうわけかWP公衆衛生はひもを殺しています。

私は謎です。手がかりをいただければ幸いです。

2
BigToe

おそらく、エンティティがUTF8以外の文字なのでしょうか。

これがesc_html()の動作です。

function esc_html( $text ) {
      $safe_text = wp_check_invalid_utf8( $text );
      $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
      return apply_filters( 'esc_html', $safe_text, $text );
}

そうでなければ、それは_wp_specialchars()によってフィルタリングされたときにサニタイズされます。

参考のため:

1)ソース内のesc_html()

2)ソース内の_wp_specialchars()

2
Chip Bennett

PHPのfilter_var()関数を適切なフィルタ とともに使用すると、サニタイズされたテキストをメタフィールドに挿入できます。 esc_htmlで起こっていることは、あいまいな文字コーディングの問題のようです。

WordPress 3.2ではPHP 5.2が必要になります。そのため、WP esc_html()関数で問題が発生した場合は、PHP 5.2 filter_varが適切な選択肢です。

0
BigToe