Vi bruger avancerede brugerdefinerede felter i vores firma, og nogle gange er vi nødt til at bruge shortcode i vores brugerdefinerede felter. I php-koden bruger vi derefter do_shortcode
fungerer for disse felter. Der er ingen grund til ikke at bruge det til de fleste felter, da det kan være, vi ønsker at tilføje kortkoder til et felt senere.
Vi ” bruger også PHP CodeSniffer med WordPress-kodningsstandardreglen. Når vi bruger echo do_shortcode
, er den undslippende advarsel væk. Så er det sikkert bare at bruge do_shortcode
eller har vi brug for f.eks. wp_kses_post
desuden?
Er der nogen bedste praksis med det?
Tak for ethvert råd
Kommentarer
- do_shortcode er ikke til at undslippe.
- Hm okay, men hvorfor viser codesniffer ikke nogen advarsel?
- Måske gør det ikke vis en advarsel, fordi gengivelsesfunktionen for kortkode skal være ansvarlig for at desinficere dens output. Men enhver streng kan sendes til funktionen, og hvis den ikke indeholder registrerede kortkoder, er jeg ' ret sikker på, at strengen slet ikke bliver ændret. Det er bestemt ikke en generisk sanitetsmetode. Kodesnifferen kan kun gøre så meget. Læs her om, hvordan data skal desinficeres korrekt. Der er mange funktioner, dem jeg bruger meget er esc_attr, sanitize_text_field, esc_url. codex.wordpress.org/…
Svar
WordPress kodningsstandarder sniffer behandler do_shortcode()
som en “autoskæret funktion”. Dette ser ud til at være blevet diskuteret i 2015 i disse GitHub-udgaver:
https://github.com/WordPress/WordPress-Coding-Standards/issues/167 https://github.com/WordPress/WordPress-Coding-Standards/issues/428
Den forklaring, der blev brugt, da den blev tilføjet til listen, var:
Jeg diskuterede dette med VIP-support (# 44195). Efter at have konfereret med et andet teammedlem sagde David, at det er unødvendigt, da vi undgår, hvor HTML-enheden udsendes (i kortkodens kode).
Men jeg er ikke sikker på, at jeg er enig med ræsonnementet. Hvis du brugte det sådan:
<?php echo do_shortcode( "[liveperson]" ); ?>
Hvor kortkoden er hårdkodet, det giver mening, fordi det eneste, der skal undslippes, er output fra kortkoden, som skal undslippes ved kortkaldets tilbagekald.
I din situation bruger du dog do_shortcode()
for at tillade eksekvering af kortkoder i brugerleveret tekst fra et brugerdefineret felt. Denne tekst behøver skal undgås, men do_shortcode()
undgår faktisk noget.
Så den sikre måde at håndtere felter som dette ville være at sætte teksten gennem wp_kses()
eller wp_kses_post()
, for at fjerne ikke-tilladte tags, og derefter sæt det gennem do_shortcode()
, så kortkoderne kan være ex ecuted uden at være undsluppet igen.
$text = get_field( "field_name" ); echo do_shortcode( wp_kses_post( $text ) );
Det vil ikke gøre nogen forskel i, hvad kodesnifferen rapporterer / ikke rapporterer, men i det mindste leverede brugeren tekst er desinficeret.
En begrænsning er, at den ikke fungerer, hvis du bruger esc_html()
, fordi det vil forstyrre kortkodeattributter. Denne sanering forhindrer ikke brugere i at indtaste ubalancerede tags, der kan påvirke layoutet, hvilket er en ting, der normalt undgår at hjælpe. For at løse dette problem kan du tilføje force_balance_tags()
:
$text = get_field( "field_name" ); echo do_shortcode( force_balance_tags( wp_kses_post( $text ) ) );