web-dev-qa-db-fra.com

pourquoi esc_html () ne renvoie-t-il rien étant donné une chaîne contenant un caractère de haut bit?

Dans PHP 5.2, filter_var () supprime le texte. Dans WP, esc_html () désinfecte le texte. Le premier fonctionne avec un caractère de poids fort dans la chaîne de texte, par exemple. à, mais ce dernier ne le fait pas. esc_html semble manger totalement une chaîne contenant un caractère high-bit. Voici l'exemple, écrit comme un simple plugin 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();
?>

Voici la sortie:

original: bla bla
PHP désinfecté: bla à blah
WP désinfecté:

Je ne suis pas obsédé par l'utilisation de esc_html (). Mais si j'utilise plutôt filter_var (), la chaîne disparaît lorsque je l'ajoute à un champ personnalisé WP. D'une manière ou d'une autre WP l'assainissement tue la chaîne.

Je suis mystifié. Serait reconnaissant pour un indice.

2
BigToe

Peut-être parce que l'entité est un caractère non-UTF8?

Voici ce que esc_html() fait:

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 );
}

Si ce n'est pas le cas, alors il est filtré par _wp_specialchars(), ce qui permet un double encodage (par défaut, no) et toutes sortes de choses.

Pour référence:

1) esc_html()in source

2) _wp_specialchars()in source

2
Chip Bennett

L'utilisation de la fonction PHP filter_var () avec les filtres appropriés permet au texte désinfecté d'être inséré dans le champ méta. Ce qui se passe avec esc_html semble être un problème obscur de codage de caractères.

WordPress 3.2 nécessitera PHP 5.2. Ainsi, si vous rencontrez des problèmes avec la fonction WP esc_html (), le PHP 5.2 filter_var est une bonne alternative.

0
BigToe