V naší společnosti používáme pokročilá vlastní pole a někdy musíme ve vlastních polích použít zkrácený kód. V kódu php pak použijeme do_shortcode
funkce pro tato pole. Není důvod jej pro většinu polí nepoužívat, mohlo by se stát, že chceme do pole přidat zkrácené kódy později.
My “ také používáme PHP CodeSniffer s pravidlem WordPress Coding Standards. Kdykoli použijeme echo do_shortcode
, unikající varování zmizí. Je bezpečné pouze použít do_shortcode
nebo musíme použít např. wp_kses_post
navíc?
Existuje nějaký osvědčený postup?
Děkujeme za jakoukoli radu
Komentáře
- do_shortcode není k úniku.
- Hm, ok, ale proč codesniffer potom neukáže žádné varování?
- Možná to tak není zobrazit varování, protože funkce vykreslování krátkých kódů by měla být zodpovědná za sanitaci jeho výstupu. Ale do funkce lze předat jakýkoli řetězec, a pokud neobsahuje registrované zkrácené kódy, jsem si ' docela jistý, že řetězec nebude vůbec upraven. Rozhodně to není obecná sanitační metoda. Kódový sniffer dokáže jen tolik. Přečtěte si zde, jak správně dezinfikovat data. Existuje mnoho funkcí, ty, které hodně používám, jsou esc_attr, sanitize_text_field, esc_url. codex.wordpress.org/…
odpověď
WordPress Coding Standards sniffs zachází s do_shortcode()
jako s „autoescaped funkcí“. Zdá se, že to bylo diskutováno v roce 2015 v těchto vydáních GitHub:
https://github.com/WordPress/WordPress-Coding-Standards/issues/167 https://github.com/WordPress/WordPress-Coding-Standards/issues/428
Při přidání do seznamu bylo použito následující vysvětlení:
Diskutoval jsem o tom s podporou VIP (# 44195). David po konzultaci s jiným členem týmu prohlásil, že je to zbytečné, protože provádíme únik, kde je vydáván kód HTML (v kódu zkráceného kódu).
Ale nejsem si jistý, zda souhlasím s odůvodněním. Pokud jste to použili takto:
<?php echo do_shortcode( "[liveperson]" ); ?>
Kde je zkrácený kód pevně zakódován, dává to smysl, protože jedinou věcí, kterou je třeba uniknout, je výstup zkráceného kódu, kterému by mělo uniknout zpětné volání krátkého kódu.
V vaší situaci však používáte do_shortcode()
umožňující provádění zkrácených kódů v textu zadaném uživatelem z vlastního pole. Tento text je nutné uniknout, ale do_shortcode()
neprovádí žádný skutečný únik.
Takže bezpečným způsobem, jak zacházet s takovými poli, by bylo vložit text do wp_kses()
nebo wp_kses_post()
, chcete-li odebrat nepovolené značky, a poté jej protáhněte do_shortcode()
, aby mohly být zkrácené kódy ex vyloučen, aniž by byl znovu unikl.
$text = get_field( "field_name" ); echo do_shortcode( wp_kses_post( $text ) );
Nezmění to, co kódovací čichač dělá / nehlásí, ale alespoň text zadaný uživatelem je dezinfikováno.
Jedním omezením je, že nebude fungovat, pokud použijete esc_html()
, protože to bude v rozporu s atributy krátkého kódu. Tato sanitace také nezabrání uživatelům v zadávání nevyvážených značek, které by mohly ovlivnit rozložení, což je jedna věc, s níž únik normálně pomáhá. K řešení tohoto problému můžete přidat force_balance_tags()
:
$text = get_field( "field_name" ); echo do_shortcode( force_balance_tags( wp_kses_post( $text ) ) );