Remplacer la fonction PHP htmlentities ? (Créer un compte)

  • Statut : non résolu
15 sujets de 1 à 15 (sur un total de 77)
  • Auteur
    Messages
  • #497580
    luciole135
    Participant
    Maître WordPress
    13751 contributions

    Ma configuration WP actuelle
    – Version de WordPress :
    – Version de PHP/MySQL :
    – Thème utilisé :
    – Extensions en place :
    – Nom de l’hebergeur :
    – Adresse du site :

    Problème(s) rencontré(s) :
    Bonjour,

    Pour le plugin que je tente de mettre à niveau côté “sécurité“, je pense sauf erreur que je dois remplacer la fonction PHP htmlentities par une fonction WordPress, mais laquelle ?
    http://php.net/manual/en/function.htmlentities.php

    Est-ce esc_html( $text ) (since 2.8)
    Encodes < > & ” ‘ (less than, greater than, ampersand, double quote, single quote). Very similar to esc_attr.
    esc_html__ (since 2.8)
    Translates and encodes
    esc_html_e (since 2.8)
    Translates, encodes, and echoes
    données ici :
    http://codex.wordpress.org/Data_Validation

    Le code du plugin (qui est maintenant très vieux et que je tente de remettre à jour) est le suivant :

    $referrer = (isset($_SERVER[‘HTTP_REFERER’]) ? htmlentities($_SERVER[‘HTTP_REFERER’]) : ”);
    $userAgent = (isset($_SERVER[‘HTTP_USER_AGENT’]) ? htmlentities($_SERVER[‘HTTP_USER_AGENT’]) : ”);
    $urlRequested = (isset($_SERVER[“REQUEST_URI”]) ? $_SERVER[“REQUEST_URI”] : ”);

    Je cherche mais je dois dire que cela me dépasse un peu beaucoup même.

    Les développeurs de WordPress doivent certainement penser que ceux qui font les plugins sont très calés, ce qui n’est pas mon cas, car leur explications de la sécurisation des plugins est vraiment extrêmemnent sommaire, on voudrait que personne ni arrive, on ne ferait pas autrement…

    #782477
    Guy
    Participant
    Maître WordPress
    14830 contributions

    je crois, mais pas certains que esc_attr (ou esc_html qui est très proche) se sert de htmlentities et rajoute des tests du type utf8 ou des caractères spéciaux, j’ai pris l’habitude pour WP de me servir de esc_attr à la place de htmlentities, mais je ne connais pas depuis assez longtemps pour avoir vraiment un avis autorisé.

    #782478
    luciole135
    Participant
    Maître WordPress
    13751 contributions

    Ah merci de la réponse, je vois que je ne suis pas le seul dans le doute, cela me rassure !

    Merci 🙂

    Attendons d’autres avis éclairés…

    #782479
    xknown
    Membre
    Chevalier WordPress
    119 contributions

    L’usage de ces fonctions dépend du contexte. Je vais prendre comme exemple la variable $referrer du code que vous avez fourni.

    Si vous allez écrire sa valeur dans un attribut html, utilisez esc_attr (escape attribute)

    <a href="bla bla" title="bla bla: “>lien</a>

    Si vous allez écrire sa valeur dans l’attribut href ou src, utilisez esc_url (escape url)

    <a href="” title=”bla bla”>lien</a>

    Si vous allez écrire sa valeur dans une valise textarea, utilisez esc_textarea

    <textarea></textarea>

    Pour les autres cas, esc_html

    <a href="bla bla" title="bla bla"></a>

    #782480
    Guy
    Participant
    Maître WordPress
    14830 contributions

    @xknown, on avait plus ou moins compris ça 🙂 et j’avais répondu en me servant d’esc_attr comme exemple, on aurait pu rajouter les fonction affichant directement comme esc_attr_e, etc…

    La question était plutôt de savoir pourquoi se servir de ces fonctions davantage que de htmlentities ou des fonctions d’encodage/decodage de PHP.

    #782481
    xknown
    Membre
    Chevalier WordPress
    119 contributions

    Oh, je n’avais pas bien compris !
    La principale différence est que esc_html n'”encode” pas deux fois le texte s’il est déjà encodé. Par exemple esc_html(‘&’) retourne “&” et htmlentities(‘&’) retourne “&amp;”.

    #782482
    luciole135
    Participant
    Maître WordPress
    13751 contributions
    xknown wrote:
    L’usage de ces fonctions dépend du contexte. Je vais prendre comme exemple la variable $referrer du code que vous avez fourni.

    Si vous allez écrire sa valeur dans un attribut html, utilisez esc_attr (escape attribute)

    Si vous allez écrire sa valeur dans l’attribut href ou src, utilisez esc_url (escape url)

    Pour les autres cas, esc_html

    Je suis vraiment dépassé par l’analyse des URL (c’est aussi pour ça que je n’ai pas changé cette partie du plugin), je ne savais même pas qu’il y avait des attributs html, href et src !

    Je vais me renseigner sur ces attributs.

    En fait cette valeur “referrer” est stockée telle quelle dans la Base de données pour donner à l’administrateur les liens cliquables de ceux qui sont venus sur son site, ce que le concepteur a appelé “Referrer”.

    C’est par exemple ceci :
    http://www.google.fr/search?q=comment+rouler&hl=fr&prmd=ivns&ei=yNohTtKAFY2k-gbBx8yZAw&start=20&sa=N

    Donc, si je ne me trompe pas, je dois pour la variable $referrer mettre esc_attr

    Mais pour l’agent qui est stocké tel que dans la BD (il stocke l’OS et le navigateur tel que fournit par le client) et qui ressemble à ça :

    Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

    Je vais mettre esc_textarea, si je ne me trompe pas.

    Je me trompe ou pas ?

    #782483
    xknown
    Membre
    Chevalier WordPress
    119 contributions
    luciole135 wrote:
    Je suis vraiment dépassé par l’analyse des URL (c’est aussi pour ça que je n’ai pas changé cette partie du plugin), je ne savais même pas qu’il y avait des attributs html, href et src !

    Je vais me renseigner sur ces attributs.

    L’attribut “html” n’existe pas, c’était juste pour faire réference aux autres attributs que l’on trouve dans les valises html.

    En fait cette valeur “referrer” est stockée telle quelle dans la Base de données pour donner à l’administrateur les liens cliquables de ceux qui sont venus sur son site, ce que le concepteur a appelé “Referrer”.

    Donc, si je ne me trompe pas, je dois pour la variable $referrer mettre esc_attr

    Mais pour l’agent qui est stocké tel que dans la BD (il stocke l’OS et le navigateur tel que fournit par le client) et qui ressemble à ça :

    Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

    Je vais mettre esc_textarea, si je ne me trompe pas.

    Je me trompe ou pas ?

    Vous devez decider cela au moment de l’affichage. Si l’administrateur doit cliquer sur la valeur de $referrer, alors il faut utiliser esc_url (dans la plus part des cas, il faut utiliser esc_url pour écrire des urls).

    Pour l’autre cas, c’est probablement esc_html.

    #782484
    Guy
    Participant
    Maître WordPress
    14830 contributions

    ok, cela évite le double encodage, c’est bien, je crois aussi qu’il y a un contrôle du jeu de caractère et des caractères spéciaux.

    @luciole: tu avais donné dans ton message original un lien vers la page des validation de données, tout est expliqué à ce niveau là, il y a aussi les validations pour l’inscription en base et les fonctions de validation des slugs. C’était exactement le lien qu’il fallait donner.

    Pour le $referrer il faut que tu utilises esc_url, le esc_textarea est uniquement pour les textes dans les text area. Si cela doit être stocké dans la base, tu te sers de esc_url_raw au moment de l’enregistrement.
    Pour $agent , tu prends esc_html (dans ce que j’ai vu esc_html et esc_attr sont très semblables, ce qui est d’ailleurs confirmé dans le codex)

    Les attributs html, href et src dont parlait xknown, ce sont les attributs et balises HTML classiques.

    #782485
    luciole135
    Participant
    Maître WordPress
    13751 contributions

    merci beaucoup à tous les deux !

    🙂

    p.s : je ne sais même plus où j’avais trouvé ce lien, j’ouvre tellement d’onglets quand je fais une recherche que je finis par m’y perdre, c’était lequel ?

    #782486
    Guy
    Participant
    Maître WordPress
    14830 contributions
    #782487
    luciole135
    Participant
    Maître WordPress
    13751 contributions
    Guy wrote:
    Pour le $referrer il faut que tu utilises esc_url, le esc_textarea est uniquement pour les textes dans les text area. Si cela doit être stocké dans la base, tu te sers de esc_url_raw au moment de l’enregistrement.
    Pour $agent , tu prends esc_html (dans ce que j’ai vu esc_html et esc_attr sont très semblables, ce qui est d’ailleurs confirmé dans le codex)

    Les attributs html, href et src dont parlait xknown, ce sont les attributs et balises HTML classiques.

    Lors du stockage le concepteur a fait ceci :

    $result = $wpdb->insert( $table_name, array(…referrer => mysql_real_escape_string($referrer)),

    Déjà, j’ai remplacé son $wpdb->query(INSERT TO….) par la fonction de WordPress pensant ainsi sécuriser un peu plus, mais en fait il faut en plus que je remplace :
    referrer => mysql_real_escape_string($referrer)
    par
    referrer => esc_url_raw($referrer) puisque c’est l’enregistrement.

    Et à la lecture, je met donc
    $referrer = (isset($_SERVER) ? esc_url($_SERVER) : ”);

    Oui, le lien des datas validations de WordPress, j’ai passé l’après midi à le lire et je dois dire que cela ne m’a pas du tout éclairé !

    Maintenant, je vais m’y replonger…

    #782488
    Guy
    Participant
    Maître WordPress
    14830 contributions

    C’est exactement cela si on se fie à la documentation, je n’ai jamais utilisé esc_url_raw, il faudrait peut être que tu affiches le résultat des deux fonctions (esc_url_raw et mysql_real_escape_string) pour pouvoir les comparer.

    #782489
    xknown
    Membre
    Chevalier WordPress
    119 contributions

    Les fonctions esc_url_raw et mysql_real_escape_string sont completement différentes !
    La première sert à s’assurer que le paramètre donnée est une url (lors de la sauvegarde à la BD), la deuxième sert à éviter des attaques d’inyection de SQL.
    Pour bien faire les choses, il faudrait normalement utiliser $safe_referrer = $wpdb->escape( esc_url_raw( $referrer ) ); si la rêquete est faite avec $wpdb->query(“insert into … values (‘$safe_referrer’) “). Par contre, si vous employez correctement $wpdb->insert/$wpdb->update, il n’y a pas besoin d’utiliser $wpdb->escape.
    Je ne sais pas si vous avez regardé la présentation que je vous avez recommandé ?

    #782490
    luciole135
    Participant
    Maître WordPress
    13751 contributions
    xknown wrote:
    Les fonctions esc_url_raw et mysql_real_escape_string sont completement différentes !
    La première sert à s’assurer que le paramètre donnée est une url (lors de la sauvegarde à la BD), la deuxième sert à éviter des attaques d’inyection de SQL.
    Pour bien faire les choses, il faudrait normalement utiliser $safe_referrer = $wpdb->escape( esc_url_raw( $referrer ) ); lors de sauvegarder cette valeur si vous la rêquete est faite avec $wpdb->query(“insert into … values (‘$safe_referrer’) “). Par contre, si vous employez correctement $wpdb->insert/$wpdb->update, il n’y a pas besoin d’utiliser $wpdb->escape.

    Ben, ne dois pas bien faire les chose, car quand je fais un $wpdb->show_errors();, cela affiche une erreur, pourtant, je crois avoir respecté la syntaxe exacte de $wpdb->insert

    le code, j’espère qu’il apparaitra en entier, cette fois-ci :

    $result = $wpdb->insert( $table_name, array(date => $vdate, time => $vtime, ip => $ipAddress, urlrequested => mysql_real_escape_string($urlRequested), agent => mysql_real_escape_string(strip_tags($userAgent)) , referrer => mysql_real_escape_string($referrer), search => mysql_real_escape_string(strip_tags($search_phrase)), nation => luc_Domain($ipAddress) ,os => mysql_real_escape_string($os), browser => mysql_real_escape_string($browser), searchengine => $searchengine ,spider => $spider, feed => $feed, user => $userdata->user_login, timestamp => $timestamp),

    Bon, ca veut pas tout mettre :
    $result = $wpdb->insert( $table_name, array(date => $vdate, time => $vtime, ip => $ipAddress, urlrequested => mysql_real_escape_string($urlRequested), agent => mysql_real_escape_string(strip_tags($userAgent)) , referrer => mysql_real_escape_string($referrer), search => mysql_real_escape_string(strip_tags($search_phrase)), nation => luc_Domain($ipAddress) ,os => mysql_real_escape_string($os), browser => mysql_real_escape_string($browser), searchengine => $searchengine ,spider => $spider, feed => $feed, user => $userdata->user_login, timestamp => $timestamp),array(‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’ ));

15 sujets de 1 à 15 (sur un total de 77)
  • Vous devez être connecté pour répondre à ce sujet.