Devons-nous désinfecter et valider leapply_filters()
comme dans les exemples ci-dessous?
absint( apply_filters( 'slug_excerpt_length', 35 ) );
wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );
esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );
Je pose cette question, parce que je n'ai jamais vu cela auparavant. En fait, nous ajoutons une validation pour éviter de casser quelque chose lorsque l'utilisateur ajoute quelque chose de mal dans le thème enfant.
Je me demande ce que vous en pensez.
Il y a une certaine confusion ici, car toutes ne sont pas de la validation, il en faut 2 autres pour comprendre ce qui est approprié:
La désinfection rend les choses propres et bien formés
Cela nettoie les données, par exemple rognage des espaces de fin, suppression des lettres dans un champ numérique, création d'un champ tout en minuscule, tout en minuscule, etc.
Par exemple. L'utilisateur a entré
" Banana "
, alors transformez-le en"Banana"
La désinfection est la première chose qui devrait arriver à entrée qui vient d’ailleurs, par exemple. lors du traitement d'un formulaire, désinfectez les données avant de les utiliser. La même chose de toutes les données provenant d'une connexion à distance, etc.
Les méthodes d'assainissement populaires incluent:
wp_kses
wp_strip_all_tags
etc.La validation vérifie si les choses sont valides
La validation vérifie que le numéro de téléphone saisi par l'utilisateur est en réalité un numéro de téléphone. C'est un chèque true
ou false
.
Par exemple. Le fruit que l'utilisateur a choisi est-il réellement un fruit?
Ceci devrait être fait sur input après la désinfection, et si la validation échoue, abandonnez, les méthodes de validation courantes incluent:
is_numeric
etc-2000000
Échapper rend les valeurs sûres pour la sortie, et applique des hypothèses
Evadez-vous tard, évadez-vous souvent.
Echapper ne parle pas beaucoup, mais imaginez-le en utilisant l'exemple du fruit d'en haut. S'échapper est comme un tapis roulant avec une découpe en forme de fruit. Vous obtenez toujours quelque chose de fruit en forme à la fin. Si un fruit passe à travers, il est intact, mais si un acteur malveillant passe à travers, une version en forme de fruit mutilé mais sans danger ressort à la fin.
S'échapper est donc une question de mise en application des hypothèses. Par exemple. dans une balise <a>
, l'attribut href
doit contenir une URL. Mais ce n'est peut-être pas le cas, échapper nous permet d'échanger le "devrait contenir" contre un "contiendra toujours", en nous fournissant une garantie. Cela évite que quelqu'un commence son URL avec "/>
et insère du code HTML arbitraire.
L'échappement doit toujours être effectué sur output , au plus tard, pour ne rien modifier. Echapper est également sensible au contexte. Vous utiliseriez esc_attr
pour échapper aux attributs HTML, mais s'il s'agit d'un attribut href
ou src
, nous utiliserions esc_url
pour indiquer qu'il s'agit d'une URL que nous avons l'intention de générer.
wp_kses
Vous pouvez désinfecter et valider plusieurs fois, mais vous ne devez échapper une fois qu'une valeur. Cela est dû au fait que le double échappement peut doubler le codage des valeurs et, dans certaines circonstances, permettre au contenu de s'échapper.
wp_kses_post
et wp_kses
sont également inhabituels en ce qu'ils peuvent être utilisés pour s'échapper, et pour désinfecter, et peuvent être utilisés plusieurs fois sur une valeur.
C'est un péché presque mortel qui peut presque annuler tout ce qui vous échappe. Une fois que quelque chose a été échappé, nous savons qu'il est sûr de le sortir, mais , si nous l'attribuons ensuite à une variable, qui sait ce qui pourrait lui arriver entre échappement et sortie. Si cette variable est modifiée, transmise à une fonction ou transmise via un filtre, ce n'est plus sans danger, son statut est un mystère. Nous pouvons y échapper mais maintenant nous avons échappé deux fois; nous avons donc peut-être rendu des données sécurisées dangereuses ou des données endommagées.
Devons-nous désinfecter et valider la
apply_filters()
comme dans les exemples ci-dessous?
Ça dépend du contexte
En entrée:
À la sortie du navigateur/demande/etc:
absint( apply_filters( 'slug_excerpt_length', 35 ) );
Nous savons maintenant que cette valeur est certainement un nombre, et un nombre positif également. Si nous préfixons cette instruction avec echo
, il s'agit d'une valeur échappée sûre. Sinon, ce n'est que la désinfection qui en a nettoyé la valeur.
wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );
Génial, c’est à la fois une désinfection et une évasion si nous l’envoyons immédiatement, mais si nous l’enregistrons dans une variable, c’est une désinfection.
esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );
Cela s'échappe et nécessite une instruction echo
. Si nous affectons cela à une variable, l'échappement est nul et nous introduisons une situation précaire.
Si la question est en revanche, devrions-nous vérifier deux fois les valeurs de retour des filtres? Oui, ce serait sage, mais trop prudent. Dans ce scénario, je m'attendrais à ce qu'il s'agisse de tester des filtres qui ne sont pas implémentés correctement, par exemple. renvoyer le texte où un nombre est attendu. Dans ce scénario, la validation est la seule option, échapper et la désinfection serait inapproprié.
the_content
, transmettez la valeur à travers wp_kses_post
, puis transmettez-la au filtre et obtenez immédiatement un écho, par ex. echo apply_filters( 'the_content', wp_kses_post( $dangerous ) );