Configurație tipică $allowed pentru wp_kses
Am o casetă de text personalizată pentru postări pe care vreau să o sanitizez folosind wp_kses
înainte de a actualiza meta datele postării.
Am căutat exemple de setări comune pentru $allowed
, dar am găsit doar acest exemplu:
$allowed = array(
'a' => array( // permite doar tag-uri a
'href' => array() // iar aceste ancore pot avea doar atributul href
)
);
Care este o configurație tipică pentru wp_kses
$allowed
? Poate cineva să ofere un exemplu de ce filtrează în mod normal?

Nu aș fi de acord cu soluția postată de @JaredCobb, wp_kses()
este mult mai flexibilă decât metoda prezentată de el. Poate elimina atributele nedorite din tag-uri fără a distruge tag-urile în sine. De exemplu, dacă utilizatorul introduce <strong class='foo'>
, wp_kses()
ar returna <strong>
dacă nu ai permis clasa, în timp ce strip_tags()
ar elimina complet <strong>
.
@redconservatory: Atributele pe care vei dori să le folosești sunt următoarele:
$args = array(
//formatare
'strong' => array(),
'em' => array(),
'b' => array(),
'i' => array(),
//link-uri
'a' => array(
'href' => array()
)
);
Aceasta va permite bold și italic fără atribute, precum și tag-uri de anchor cu atributul href
...și nimic altceva. Folosește principiul listei albe, despre care @jaredcobb a menționat corect că este cea mai bună abordare aici.

Nu poți specifica în strip_tags ce etichete sunt permise? http://php.net/manual/en/function.strip-tags.php

Totuși, acum înțeleg mai bine de ce wp_kses este mai bun, văzând cum elimină clasele nedorite...

Probabil nu m-am exprimat clar... Dar da, wp_kses
oferă mai mult control decât opțiunile native din PHP. Cred că am menționat asta. Am folosit și cuvântul "atribute". Spuneam că depinde de cazul tău specific. Cineva care încearcă să protejeze datele sale de toate etichetele ar fi mai bine să folosească strip_tags, după părerea mea, dar e mai mult o preferință personală. Noroc.

Aș începe cu același array $allowedtags
pe care WordPress îl folosește pentru comentarii. Puteți găsi acest array în fișierul [directorul wordpress]/wp-includes/kses.php
. Acestea par a fi setări implicite rezonabile și un punct de plecare bun. Iată array-ul lor...
$allowedtags = array(
'a' => array(
'href' => true,
'title' => true,
),
'abbr' => array(
'title' => true,
),
'acronym' => array(
'title' => true,
),
'b' => array(),
'blockquote' => array(
'cite' => true,
),
'cite' => array(),
'code' => array(),
'del' => array(
'datetime' => true,
),
'em' => array(),
'i' => array(),
'q' => array(
'cite' => true,
),
'strike' => array(),
'strong' => array(),
);
Eu NU aș folosi funcția PHP strip_tags
ca înlocuitor pentru wp_kses
.
Nu ar trebui să folosești niciodată strip_tags pentru a filtra conținutul de la un utilizator necunoscut!
Am creat un videoclip rapid care explică De ce wp_kses() din WordPress este mai bun decât strip_tags() din PHP pentru securitate.

Iată. Acest lucru funcționează atât în WordPress, cât și în afara acestuia.
<?php
$str = ' I am <strong>stronger</strong> and cooler every single day <aaaaa>. ';
echo orbisius_html_util::strip_tags($str);
/**
* Clasă utilitară pentru HTML
* @author Svetoslav Marinov (SLAVI) | http://orbisius.com
*/
class orbisius_html_util {
/**
* Folosește wp_kses din WordPress pentru a curăța unele tag-uri HTML dar permite unele atribute
* utilizare: orbisius_html_util::strip_tags($str);
* folosește wp_kses() din WordPress
* @param str $buffer string buffer
* @return str text curățat
*/
public static function strip_tags($buffer) {
static $default_attribs = array(
'id' => array(),
'class' => array(),
'title' => array(),
'style' => array(),
'data' => array(),
'data-mce-id' => array(),
'data-mce-style' => array(),
'data-mce-bogus' => array(),
);
$allowed_tags = array(
'div' => $default_attribs,
'span' => $default_attribs,
'p' => $default_attribs,
'a' => array_merge( $default_attribs, array(
'href' => array(),
'target' => array('_blank', '_top'),
) ),
'u' => $default_attribs,
'i' => $default_attribs,
'q' => $default_attribs,
'b' => $default_attribs,
'ul' => $default_attribs,
'ol' => $default_attribs,
'li' => $default_attribs,
'br' => $default_attribs,
'hr' => $default_attribs,
'strong' => $default_attribs,
'blockquote' => $default_attribs,
'del' => $default_attribs,
'strike' => $default_attribs,
'em' => $default_attribs,
'code' => $default_attribs,
);
if (function_exists('wp_kses')) { // WP este prezent
$buffer = wp_kses($buffer, $allowed_tags);
} else {
$tags = array();
foreach (array_keys($allowed_tags) as $tag) {
$tags[] = "<$tag>";
}
$buffer = strip_tags($buffer, join('', $tags));
}
$buffer = trim($buffer);
return $buffer;
}
}

Bună ziua, domnule Svetoslav, este încă sigur acest lucru în zilele noastre? Am căutat o metodă simplă, dar sigură, pentru a curăța input-ul utilizatorilor în backoffice-ul meu (nu Wordpress). Vreau doar să permit utilizarea formatării HTML de bază, precum cele prezente în codul dumneavoastră, <b>, <I>, <u>. Credeți că pot folosi acest lucru ca strip_tags($_POST['myDoc']) sau credeți că ar trebui să fac altceva pentru a fi sigur? Vă mulțumesc pentru ajutor!

Salut, folosește codul meu. Acesta verifică dacă rulează în contextul WordPress și va folosi funcția WP, în caz contrar va folosi strip_tags din php. De asemenea, este mai bine să folosești $_REQUEST în loc de $_POST deoarece la un moment dat poți transmite date ca parametru GET.

mulțumesc pentru răspuns :-). Mă confrunt acum cu o problemă... dacă lipesc HTML formatat sau, de exemplu, un cod din Sublime Text 3, cea mai mare parte a textului lipsește, trebuie să fie un cod formatat ascuns care strică scriptul.

Poate fi, în prezent curăț codul HTML cum am menționat în răspunsul de mai sus, caut caractere precum \n, \r și altele, dar problema persistă :-(. Curățarea datelor copiate poate fi o problemă majoră, acum câțiva ani foloseam copierea în textedit pentru a curăța șirurile copiate, dar nu pot să mă aștept ca utilizatorii mei să facă la fel.

Am folosit wp_kses
doar atunci când am avut nevoie în mod specific să permit/filtrez atributele tag-urilor HTML (de exemplu, vreau să permit doar tag-ul <image>
cu atributul src=""
, dar nu vreau să permită atributul href=""
sau style=""
sau orice altceva pe tag-ul de imagine). În acest caz, wp_kses
este util pentru că (după cum poți vedea în exemplul tău) poți filtra foarte specific. Totuși, am folosit rar wp_kses
pentru că consider că câteva funcții PHP native (menționate mai jos) își fac treaba și sunt mai ușor de înțeles când revizuiesc codul după câteva luni.
Dacă vrei să elimini complet tag-urile HTML (cu excepția câtorva permise), atunci mereu folosesc strip_tags
. Poți transmite un șir de caractere cu tag-uri permise (cum ar fi <p> <br> <strong>
) sau orice alte tag-uri inofensive. Acest lucru permite utilizatorului să aibă un anumit control asupra formatării, dacă acest lucru este relevant pentru cazul tău de utilizare. Îmi place strip_tags
pentru că adoptă o abordare de tip whitelist la sanitizarea datelor. (Adică totul este eliminat, cu excepția a ceea ce ai permis în mod explicit).
Dacă scopul tău este să le permiți să introducă orice HTML în conținut, dar vrei doar să afișezi textul așa cum l-au introdus (ca în cazul exemplelor de cod), atunci folosește htmlspecialchars
. Aceasta va converti caracterele HTML în omoloagele lor codate, astfel încât să le poți afișa în siguranță pe pagină.
Poate întâlni cod care folosește str_replace
pentru a „căuta” tag-uri rele cum ar fi <script> sau altele. Nu recomand această abordare pentru că adoptă o metodă de tip blacklist la sanitizarea datelor și trebuie să te asiguri constant că lista ta de elemente interzise este actualizată.
Ca să rezum, depinde de ce folosești metabox-urile. Dacă vrei să te protejezi împotriva intrărilor utilizatorilor (care ar putea fi rău intenționați), recomand strip_tags
și să permiți doar câteva tag-uri inofensive. Dacă ai un motiv întemeiat să controlezi în detaliu tag-urile și atributele specifice ale conținutului utilizatorului, folosește wp_kses
.

Nu face wp_kses()
tot ceea ce face strip_tags()
și chiar mai mult? Sunt de acord cu păstrarea lucrurilor simple, dar cred că există și un argument pentru a nu "surprinde" pe nimeni. wp_kses()
este "modul WordPress", iar din moment ce scriem cod WordPress, există un argument că este probabil alegerea mai bună. În plus, dacă la un moment dat în viitor vom dori să permitem anumite combinații de tag-uri/atribute, folosirea wp_kses()
de la început nu necesită o refactorizare.

De asemenea, poți folosi funcția wp_kses_post
care este utilizată pentru conținutul postărilor și necesită doar datele ca parametru.
Mai multe informații aici: http://codex.wordpress.org/Function_Reference/wp_kses_post

@Svetoslav Marinov
Am adăugat acest cod imediat după $buffer = trim($buffer);
$string_limpa = array(
'<div><p><\/div>' => '<br>',
'<div><br><\/div>'=> '<br>',
'<div align="left"><br><\/div>' => '<br>',
'<div align="center"><br><\/div>' => '<br>',
'<div align="right"><br><\/div>' => '<br>',
'<div style="text-align: left;"><br><\/div>' => '<br>',
'<div style="text-align: center;"><br><\/div>' => '<br>',
'<div style="text-align: right;"><br><\/div>' => '<br>',
'<div style="text-align: justify;"><br><\/div>' => '<br>',
'class="Apple-style-span"' => '<br>',
'<p><br></p>' => '<br>',
'<p><b></p>' => '<br>',
'<p><i></p>' => '<br>',
'<p><u></p>' => '<br>',
'\r' => '<br>',
'\n' => '<br>',
'\t' => ' ',
'\0' => ' ',
'\x0B' => '<br>',
'<p style="text-align: center;"><br></p>' => '<br>'
);
return strtr($buffer, $string_limpa);
pentru a încerca să curăț HTML-ul și să evit caracterele ascunse copiate care strică codul, dar nu funcționează, curăță HTML-ul, dar caracterele ascunse rămân.
