Quelle est la différence entre le filtre esc_html et le filtre attribute_escape?

8

Quelle est la différence exacte entre esc_htmlet attribute_escapefiltrer?

esc_html()utilise esc_html filteret esc_attr()utilise attribute_escape filter. Les deux codent <> & "'(inférieur à, supérieur à, esperluette, guillemet double, guillemet simple).

Je suis curieux de savoir ce qui les rend exactement différents en termes de sécurité (fuite).

djadmin
la source
eh bien, s'ils n'étaient pas différents, il ne serait pas nécessaire d'avoir les deux ... la question de l'OMI n'est tout simplement pas claire, c'est comme demander quelle est la différence entre les filtres the_content et the_excerpt
Mark Kaplun
1
Je pense que c'est ce qu'il demande, en quoi sont-ils différents et pourquoi?
Tom J Nowell
@TomJNowell, bien l'un est appelé pour échapper aux attributs et l'autre pour échapper au HTML général. Cela explique le pourquoi, et explique également le comment;) Où commencer une réponse ici, en expliquant la différence entre les caractères autorisés dans les attributs et le html général? cela semble un peu trop basique (mais c'est peut-être ce que l'OP demande, je suppose)
Mark Kaplun
2
Ce serait bien, mais un exemple de quelque chose esc_attrqui s'échappe esc_htmlne serait pas utile, après tout pourquoi ne pas l'utiliser esc_htmlpartout? Si c'est évident pour vous, cela peut ne pas sembler être une bonne question, mais il n'est pas évident pour le demandeur comment ces 2 fonctions diffèrent étant donné qu'elles échappent toutes les deux aux personnages attendus
Tom J Nowell

Réponses:

8

Il semblerait que hors de la boîte, il n'y a pas de différence

function esc_html( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in HTML.
     *
     * Text passed to esc_html() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.8.0
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in an HTML attribute.
     *
     * Text passed to esc_attr() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.0.6
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'attribute_escape', $safe_text, $text );
}

La seule différence entre les 2 fonctions est le filtre appliqué à la fin. WordPress n'ajoute rien à ces filtres, donc dans une installation WP standard, ce ne sont pas des opérations. Ils sont fournis dans le cas de bord que quelqu'un pourrait en avoir besoin.

Q & R rapide

Donc par défaut, ils sont identiques?

Oui! Les fonctions esc_attret esc_htmlont la même implémentation

Les filtres sont-ils identiques?

La seule différence est qu'ils ont des noms différents, ils fonctionnent de la même manière, ils sont utilisés de la même manière et aucun filtre n'est utilisé dans le noyau.

Les filtres font-ils quelque chose?

Non! Tout l'échappement se fait dans la fonction quand wp_check_invalid_utf8et _wp_specialcharssont appelés.

Les filtres ne font pas l'échappement, ils sont l'occasion pour les plugins de faire des vérifications et des traitements supplémentaires.

Y a-t-il des cas de bord?

Seulement si vous utilisez les filtres, dites que vous êtes connecté esc_htmlmais pas attribute_escape, ou vice versa. Pour une installation WP standard, les 2 fonctions sont identiques, sans différence.

Pourquoi attribute_escapeet non esc_attr?

Rétrocompatibilité. Il y avait une attribute_escapefonction, qui est maintenant marquée comme obsolète après l' esc_ajout des fonctions de style.

Pourquoi devrais-je utiliser ces filtres?

¯\_(ツ)_/¯ce serait une situation rare. Certaines personnes peuvent en abuser de la même manière que les API de traduction sont utilisées abusivement pour rechercher remplacer du texte. C'est déjà une mauvaise pratique car ces filtres sont souvent appelés une petite perte de vitesse est agrandie des milliers de fois

Mais considérez que si vous ne faites pas attention, vous pouvez compromettre la sécurité de ces fonctions en annulant l'échappement qu'elles ont ajouté ou en ajoutant du contenu non échappé à la fin. Pour cette raison, les filtres sont dangereux.

Dois-je m'inquiéter à ce sujet?

Non. Vous ne devez vous inquiéter que si vous avez utilisé ces filtres, qui en eux-mêmes auraient dû déclencher des alarmes rouges massives indiquant que quelque chose dans votre développement s'était mal passé.

Les fonctions esc_attret esc_htmlsont sûrs à utiliser et échappent au contenu. Vous avez une obligation éthique et morale de les utiliser si vous appréciez la sécurité de votre code

Est-ce à dire que je devrais simplement utiliser esc_html?

Non, l'évasion consiste à définir des attentes. Si vous attendez un attribut, utilisez esc_attr. Ce n'est pas parce qu'il est fonctionnellement le même pour le moment que cela ne changera pas à l'avenir avec une version de sécurité

Tom J Nowell
la source
Merci d'avoir répondu. J'ai peut-être besoin de reformuler ma question. Je suis plus intéressé à savoir s'il y a une différence dans l'implémentation de base des deux filtres mentionnés ci-dessus. Cela nous aiderait vraiment (les développeurs) à savoir comment l'échappement fonctionne dans les attributs et le HTML.
djadmin
Ces filtres ne sont pas utilisés par Core, ils sont fournis pour les plugins en cas de besoin. Cependant, je déconseille fortement de les utiliser pour des raisons de sécurité
Tom J Nowell
"Les filtres esc_html et attribute_escape sont donc très dangereux." Je ne comprends vraiment pas ce point. Si nous n'utilisons pas cela, alors comment sommes-nous censés échapper aux entrées de l'utilisateur pour empêcher XSS?
djadmin
Comme vous l'avez dit, ils passent à travers un filtre avant de sortir. Ma question initiale est de savoir comment ces deux filtres sont différents en termes de mise en œuvre. Je crois qu'il y aurait un cas de bord qui esc_htmlfiltrerait les fuites et attribute_escapene filtrerait pas ou vice versa.
djadmin
Ils ne le font pas. Les filtres sont fournis pour le code tiers et ne sont pas utilisés par Core. Core ne se connecte pas aux filtres et ne fait rien avec eux. Ces cas marginaux devraient être écrits par un développeur de thème ou de plugin, auquel cas ce serait évident car vous seriez la personne qui l'a écrit
Tom J Nowell