wp_kses în WordPress

Securitate WordPress 1.0

Păstrează doar etichetele și atributele HTML permise și elimină restul (scripturi, atribute on*, protocoale nesigure).

Sintaxă
wp_kses( string $content, array[]|string $allowed_html, string[] $allowed_protocols = array() ): string
wp_kses_post( string $data ): string

Ce face wp_kses

wp_kses() filtrează un text HTML după o listă albă: rămân doar etichetele și atributele pe care le permiți, iar celelalte sunt eliminate. Textul dintre etichetele eliminate rămâne (de exemplu din <script>alert(1)</script> rămâne alert(1), ca text inofensiv). Adresele din atribute sunt verificate față de protocoalele permise, implicit cele din wp_allowed_protocols().

Lista permisă este un tablou în care cheia e numele etichetei, iar valoarea e un tablou cu atributele permise: array( 'a' => array( 'href' => true ), 'strong' => array() ). În loc de tablou poți da numele unui context din wp_kses_allowed_html(): 'post', 'data', 'strip' (elimină tot HTML-ul) sau 'entities'.

wp_kses_post() (din WordPress 2.9.0) este scurtătura pentru wp_kses( $data, 'post' ): permite etichetele acceptate în conținutul unui articol (paragrafe, titluri, liste, linkuri, imagini). Numele se referă la articole (post content), nu la $_POST. Ambele funcții se folosesc la afișare sau la salvarea HTML-ului primit de la utilizatori.

Parametri

Parametru Descriere
$content Textul HTML de filtrat.
$allowed_html Tablou cu etichetele și atributele permise sau numele unui context ('post', 'data', 'strip', 'entities').
$allowed_protocols Protocoalele permise în adrese. Implicit (tablou gol) se folosește wp_allowed_protocols().

Ce returnează

Textul filtrat, doar cu HTML-ul permis.

Exemple

Exemplul 1: Doar bold și linkuri într-o descriere

Permitem <strong> și <a> cu href; paragraful, scriptul și atributul onclick dispar, textul rămâne.

<?php
$descriere = '<p>Cafeneaua <strong>Ana</strong> din <a href="https://exemplu.ro" onclick="fura()">Iași</a></p><script>alert(1)</script>';

$permise = array(
    'strong' => array(),
    'a'      => array( 'href' => true ),
);
echo wp_kses( $descriere, $permise );

Ce afișează pagina

Cafeneaua <strong>Ana</strong> din <a href="https://exemplu.ro">Iași</a>alert(1)

Exemplul 2: Conținut de articol cu wp_kses_post()

wp_kses_post() păstrează titlul, paragraful și linkul, dar elimină atributul onmouseover.

<?php
$text = '<h3>Program</h3><p onmouseover="x()">Luni - vineri, 8 - 20. <a href="https://exemplu.ro/meniu">Vezi meniul</a></p>';
echo wp_kses_post( $text );

Ce afișează pagina

<h3>Program</h3><p>Luni - vineri, 8 - 20. <a href="https://exemplu.ro/meniu">Vezi meniul</a></p>

Greșeli frecvente

  • Să permiți atribute precum style sau on* „ca să meargă”: deschizi exact breșa pe care wp_kses() trebuia să o închidă.
  • Să scrii lista permisă cu atributele ca valori într-un tablou simplu (array( 'a' => array( 'href' ) )): atributele trebuie să fie chei, array( 'href' => true ).
  • wp_kses_post() pentru texte simple, fără HTML: e mai lent și mai permisiv decât e nevoie; folosește esc_html() sau sanitize_text_field().

Comenzi înrudite

  • esc_html: Escapează textul pentru afișare în HTML: transformă < > & și ghilimelele în entități, ca să nu fie interpretate ca cod.
  • sanitize_text_field: Curăță textul de pe o singură linie primit de la utilizator: elimină HTML-ul, rândurile noi, tab-urile și spațiile în plus.
  • esc_url: Curăță o adresă pentru afișare în href sau src: respinge protocoalele nepermise și codifică & ca &#038;.