Home » Articole » Articole » Calculatoare » Dezvoltarea web » WordPress » Validarea datelor în WordPress

Validarea datelor în WordPress

postat în: WordPress 0

Validarea datelor

Date care nu sunt de încredere pot proveni din mai multe surse (utilizatori, site-uri terțe, baza de date proprie!, …) și totul trebuie să fie validat atât la intrare cât și la ieșire.

Igienizarea la ieșire

Metoda de igienizare a datelor depinde de tipul de date și de contextul în care sunt folosite. Mai jos sunt câteva sarcini comune în WordPress și modul în care acestea ar trebui să fie igienizate.

Sfat: Este cel mai bine să se facă validarea la ieșire cât mai târziu posibil, în mod ideal, chiar când sunt la ieșire, spre deosebire de cele anterioare din script. În acest fel puteți fi întotdeauna fi sigur că datele dumneavoastră sunt validate în mod corespunzător și nu aveți nevoie să vă amintiți dacă variabila a fost validată anterior.

Numere întregi

intval( $int ) or (int) $int – În cazul în care ar trebui sa fie un întreg, se consideră unu.

absint( $int ) – Asigură că rezultatul este nenegativ.

HTML / XML

Rețineți că multe tipuri de documente XML (spre deosebire de documentele HTML) înțeleg doar câteva referiri la numele de caractere: apos, amp, gt, lt, quot. Când se afișează texte într-un astfel de document XML, asigurați-vă că filtrați orice text care conține entități ilegale prin funcția WordPress ent2ncr( $text ).

Fragmente HTML/XML

wp_kses( (string) $fragment, (array) $allowed_html, (array) $protocols = null ) – KSES Strips Evil Scripts. Toate HTML care nu sunt de încredere (text poștă, comentariu de text, etc.) ar trebui să fie executate prin wp_kses().

Pentru a evita să se treacă o serie de etichete HTML permise, puteți utiliza wp_kses_post( (string) $fragment ) pentru etichete care sunt permise în postări/pagini sau wp_kses_data( (string) $fragment ) pentru lista mica de etichete permise în comentarii.

Rețineți că sistemul kses poate fi consumator de resurse și, prin urmare, nu ar trebui să fi rulat ca un filtru de ieșire de igienizare direct, ci ca un filtru al datelor după ce au fost introduse și prelucrate, înainte de a fi salvate in baza de date. WordPress ruleaza kses pe filtru pre_comment_content, de exemplu, pentru a filtra HTML înainte de a salva comentariul.

wp_rel_nofollow( (string) $html ) – Adaugă un atribut „rel = ‘nofollow’” pentru orice link <a>.

wp_kses_allowed_html( (string) $context ) – Oferă o serie de tag-uri HTML permise pentru un anumit context. Valorile permise sunt entități post | strip | data | sau numele unui filtru de domeniu precum pre_user_description.

Noduri text

esc_html( $text ) (din 2.8) – Codifică < > & ” ‘ (mai mic de, mai mare de, ampersand, ghilimele duble, ghilimele simple). Identic cu esc_attr, cu excepția faptului că se aplică filtrul esc_html la ieșire.

eesc_html__ (din 2.8) – Traduce si codifică

esc_html_e (din 2.8) – Traduce, codifică, si permite ecouri

esc_textarea (din 3.1) – Codifică text pentru utilizare în interiorul unui element textarea.

sanitize_text_field (since 2.9.0) – Igienizează un șir de date introduse de utilizator sau de la baza de date.

Noduri atribut

esc_attr( $text ) (din 2.8) – Codifică < > & „” (mai mic de, mai mare de, ampersand, ghilimele duble, ghilimele simple). Identic cu esc_html, cu excepția faptului că se aplică filtrul attribute_escape la ieșire.

esc_attr__() – Traduce și codifică

esc_attr_e() – Traduce, codifică, și permite ecouri

JavaScript

esc_js( $text ) (din 2.8)

URL-uri

esc_url( $url, (array) $protocols = null ) (since 2.8) – Folosește întotdeauna esc_url când igienizează URL-uri (în nodurile text, noduri atribut sau oriunde altundeva). Respinge URL-uri care nu au una dintre protocoalele de pe lista albă (implicit http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed, și telnet), elimină caracterele nevalide, și îndepărtează caracterele periculoase. Înlocuiește clean_url(), care a fost depreciat în 3.0.

Această funcție codifică caractere ca entități HTML: se folosește la generarea unui document (X)HTML sau XML. Codifică ampersand (&) și ghilimele simple () ca referințe de entitate numerice (&#038, &#039).

esc_url_raw( $url, (array) $protocols = null ) (din 2.8) – Pentru introducerea unui URL în baza de date. Această funcție nu codifică caractere ca entități HTML: se folosește atunci când se stochează un URL sau în alte cazuri în care este nevoie de URL-ul non-codificat. Această funcționalitate poate fi replicată în funcția veche clean_url prin setarea $context la db.

urlencode( $scalar ) – Codifică pentru utilizarea în URL (ca parametru de interogare, de exemplu)

urlencode_deep( $array ) – Codifică toate elementele de matrice.

Baza de date

$wpdb->insert( $table, (array) $data )$data trebuie să fie nesalvat (funcția îl va salva pentru tine). Key sunt coloane, Values sunt valori.

$wpdb->update( $table, (array) $data, (array) $where )$data trebuie să fie nesalvat. Keys sunt coloane, Values sunt valori. $where trebuie să fie nesalvat. Condițiile WHERE multiple sunt operate AND împreună.

$wpdb->update(
‘my_table’,
array( ‘status’ => $untrusted_status, ‘title’ => $untrusted_title ),
array( ‘id’ => 123 )
);

$wpdb->prepare( $format, (scalar) $value1, (scalar) $value2, … )$format este un string format ca sprintf(). Înțelege doar %s, %d și %f, dintre care niciunul nu trebuie să fie închise în ghilimele.

$wpdb->get_var( $wpdb->prepare(
„SELECT something FROM table WHERE foo = %s and status = %d”,
$name, // un șir nesalvat (funcția va face igienizarea pentru tine)
$status // un întreg care nu este de încredere (funcția va face igienizarea pentru tine)
) );

esc_sql( $sql ) – Salvează un singur șir sau o matrice de șiruri pentru a fi utilizate într-o interogare SQL. Ajută addslashes(). $wpdb->prepare este în general preferat, deoarece corectează câteva erori de formatare comune.

$wpdb->escape( $text ) – Depreciat de la 3.6. Utilizați esc_sql() sau $wpdb->prepare() în loc.

$wpdb->escape_by_ref( &$text ) – Nici o valoare de returnare. Având în vedere că parametrul este trecut prin referință, textul este modificat direct, astfel încât nu este nevoie să i se atribuie nicio valoare returnată.

$wpdb->esc_like( $text ) – Igienizează $text pentru utilizare într-o expresie LIKE a unei interogări SQL. Va trebui în continuare să fie salvată SQL (cu una dintre funcțiile de mai sus).

like_escape( $string ) – Depreciat de la 4.0. Utilizați $wpdb->esc_like() în loc.

Sistemul de fișiere

validate_file( (string) $filename, (array) $allowed_files = „” ) – Utilizat pentru a preveni atacurile traversale de director, sau pentru a testa un nume de fișier pe o listă albă. Returnează 0 dacă $filename reprezintă o cale relativă validă. După validare, trebuie să trateze $filename ca o cale relativă (de exemplu, trebuie să îi adăugați o cale absolută), deoarece ceva de genul /etc/hosts se va valida cu această funcție. Returnează un număr întreg mai mare decât zero în cazul în care calea dată conține .., ./, sau :, sau nu este în lista albă $allowed_files. Fii atent la interpretările booleane ale rezultatului, deoarece false(0) indică faptul că numele fișierului a trecut de validare, în timp ce true(>0) indică un eșec.

Antete HTTP

Atacurile de divizare a antetului sunt enervante, deoarece acestea sunt dependente de clientul HTTP. WordPress nu are nevoie să includă conținut generat de utilizator în antetele HTTP dar, atunci când o face, WordPress folosește de obicei liste albe pentru majoritatea antetelor sale HTTP.

WordPress utilizează conținut generat de utilizator în antete HTTP Location, și oferă igienizare pentru acestea.

wp_redirect($location, $status = 302) – Un mod sigur de a redirecționa la orice adresă URL. Asigură că antetul HTTP Location rezultat este legitim.

wp_safe_redirect($location, $status = 302) – Chiar mai sigur. Permite numai redirecționări către domenii de pe lista albă.

Validarea de intrare

Multe dintre funcțiile de mai su sunt utile pentru validarea de intrare. În plus, WordPress foloseste următoarele funcții.

Slug

sanitize_title( $title ) – Utilizat în slug la postări, de exemplu,

sanitize_user( $username, $strict = false ) – Folosește $strict atunci când se crează un nou utilizator (deși ar trebui să utilizați API pentru asta).

HTML

balanceTags( $html ) or force_balance_tags( $html ) – Încearcă să se asigure că etichetele HTML sunt echilibrate, astfel încât este transmis XML valid.

tag_escape( $html_tag_name ) – Igienizează un nume de etichetă HTML (nu salvează nimic, în ciuda numelui funcției).

sanitize_html_class( $class, $fallback ) – Igienizează un num de clasă html pentru a se asigura că conține doar caractere valide. Aduce șirul până la A-Z, a-z, 0-9, ‘-‘ dacă din aceasta rezultă un șir gol, atunci va returna valoarea alternativă furnizată.

E-mail

is_email( $email_address ) – Returnează boolean false dacă este invalid, sau $email_address dacă este valid.

Matrice

array_map( ‘absint’, $array ) – Asigură că toate elementele sunt numere întregi nenegative. Înlocuiește apelul invers ‘absint‘ cu tot ce este adecvat pentru datele tale. array_map() este o funcție de bază PHP care ruleaza elementele de matrice printr-o funcție de apel invers arbitrar, în acest exemplu, absint().

Alte

Câteva alte funcții care pot fi utile pentru a igieniza introducerea de date:

  • sanitize_email()
  • sanitize_file_name()
  • sanitize_html_class()
  • sanitize_key()
  • sanitize_mime_type()
  • sanitize_option()
  • sanitize_sql_orderby()
  • sanitize_text_field()
  • sanitize_title_for_query()
  • sanitize_title_with_dashes()
  • sanitize_user()
  • sanitize_meta()
  • sanitize_term()
  • sanitize_term_field()

Filozofiile validării

Există mai multe filosofii diferite despre cum ar trebui să fie făcută validarea. Fiecare este potrivită pentru diferite scenarii.

Lista albă

Accept date numai dintr-o listă finită de valori cunoscute și de încredere.

Atunci când se compară datele care nu sunt de încredere față de lista albă, este important să vă asigurați că este utilizat tipul de verificare strictă. În caz contrar, un atacator ar putea manipula intrarea într-un mod care va trece de lista albă având în continuare un efect rău intenționat.

Operator de comparare

$untrusted_input = ‘1 malicious string’;  // va evalua la întregul 1 în timpul comparării

if ( 1 === $untrusted_input ) {  // == ar fi evaluat la adevarat, dar === la fals
echo ‘<p>Valid data’;
} else {
wp_die( ‘Invalid data’ );
}

in_array()

$untrusted_input = ‘1 malicious string’; // va evalua la întreg 1 în timpul comparării
$safe_values = array( 1, 5, 7 );

if ( in_array( $untrusted_input, $safe_values, true ) ) { //  `true` permite tipul de verificare strictă
echo ‘<p>Valid data’;
} else {
wp_die( ‘Invalid data’ );
}

switch()

$untrusted_input = ‘1 malicious string’; // Va evalua la întregul 1 în timpul comparării

switch ( true ) {
case 1 === $untrusted_input: // face propriile tale comparări strice în loc să se bazeze pe compararea switch()
echo ‘<p>Valid data’;
break;

default:
wp_die( ‘Invalid data’ );
}

Lista neagră

Respinge date din lista finită de valori nesigure cunoscute. Acest lucru este foarte rar o idee bună.

Detectarea formatului

Testează pentru a vedea dacă datele sunt în formatul corect. Le acceptă doar dacă sunt.

if ( ! ctype_alnum( $data ) ) {
wp_die( „Format incorect” );
}

if ( preg_match( „/[^0-9.-]/”, $data ) ) {
wp_die( „Format incorect” );
}

Corectarea formatului

Accepta mai orice date, dar elimina sau modifică piesele periculoase.

$trusted_integer = (int) $untrusted_integer;
$trusted_alpha = preg_replace( ‘/[^a-z]/i’, „”, $untrusted_alpha );
$trusted_slug = sanitize_title( $untrusted_slug );

Traducere din wordpress.org

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *