Cum să validezi corect datele din $_GET sau $_REQUEST folosind funcții WordPress?

12 sept. 2012, 19:17:16
Vizualizări: 18.7K
Voturi: 8

Lucrez la un plugin care necesită manipularea dinamică a conținutului afișat. Acest lucru depinde în totalitate de variabila curentă $_GET sau $_REQUEST.

În funcție de valoarea variabilei, va apela o anumită metodă a clasei pentru a procesa cererea utilizatorului și a afișa conținutul corespunzător.

Sunt perfect conștient de pagina Validare Date din WordPress Codex, dar nu sunt sigur care este cea mai bună abordare pentru scenariul meu, sau orice scenariu de sancționare a variabilelor $_GET sau $_REQUEST.

Cum pot sancționa folosind funcții WordPress variabilele $_GET sau $_REQUEST pentru un șir de caractere care va fi folosit pentru a apela o anumită metodă de clasă?

Ar putea fi exploatat sau să eșueze codul următor?:

public function display_admin_page(){
    if(is_admin() && isset($_GET['page'])){
        global $content;
        $page = sanitize_title($_GET['page']);
        $method_name = 'page_'.str_replace('-', '_', $page);
        if(method_exists('content', $method_name)){
            // Afișează pagina solicitată din clasa content
            $thePage = $content->$method_name();
        } else{
            $thePage = $content->error(404);    
        }
        echo $thePage;
    }
}
0
Toate răspunsurile la întrebare 4
1

WordPress nu oferă funcții specifice de validare a datelor pentru SUPERGLOBALS.

Eu folosesc funcția PHP filter_input apoi o escapez ca pe orice variabilă nesigură.

$url = filter_input( INPUT_GET, 'some_query_string', FILTER_VALIDATE_URL );

echo '<a href="'. esc_url( $url ). '">Click Me</a>';

Funcția PHP filter_input acceptă:

12 sept. 2012 19:33:57
Comentarii

@Chris_0, ce zici de cererile $_GET? De exemplu, filter_var( $_GET[ $item['name'] ], FILTER_SANITIZE_FULL_SPECIAL_CHARS ) Ar trebui implementat diferit?

Motivated Motivated
30 oct. 2022 10:12:17
2

Pentru exemplul tău specific:

Ai curățat datele din $_GET în mod adecvat (deși aș fi folosit sanitize_key în loc de sanitize_title -- nu pot spune că există o diferență mare, dar sanitize_title este destinat să fie folosit în URL-uri).

Funcția method_exists va returna true pentru metodele private și protejate, deci dacă un utilizator încearcă să apeleze o metodă privată sau protejată, aceasta va eșua fără a ajunge la eroarea 404. (Cu excepția cazului în care metoda display_admin_page se află în aceeași clasă.)

Aceasta ne aduce la potențiala problemă de securitate principală: că absolut oricine poate forța rularea oricărei metode publice din clasa ta. Dacă este posibil, este întotdeauna mai bine să specifici explicit ce poate fi acceptat. În acest fel, ai putea valida cu ceva de genul:

if ( !in_array( $_GET['page'], array( 'metoda_acceptata', 'alta_metoda_acceptata' ) ) )
     $content->error(404);
12 sept. 2012 22:22:47
Comentarii

Ai putea să elaborezi mai mult, te rog, despre teoria potențialei exploatări?

Michael Ecklund Michael Ecklund
13 sept. 2012 17:15:11

Desigur, este ceva la care trebuie să te gândești. Fiecare metodă publică din clasa ta poate fi forțată să ruleze de către oricine în orice moment. Asta nu înseamnă automat o exploatare, dar este o considerație. Există o metodă în clasa ta care șterge din baza ta de date? Există o metodă care afișează parolele utilizatorilor tăi? Vei adăuga vreodată alte metode despre care trebuie să fii îngrijorat? Și așa mai departe.

SeventhSteel SeventhSteel
14 sept. 2012 16:23:01
2

Recomand să folosești mysql_real_escape_string($_GET) pentru orice cerere GET. Este o funcționalitate foarte puternică în PHP.

Apoi poți folosi str_replace() pentru a înlocui orice caractere nedorite.

ACTUALIZARE 2023:

esc_sql() este soluția perfectă.

12 sept. 2012 19:26:06
Comentarii

Nu este funcția WordPress esc_sql() o alegere mai bună?

gillespieza gillespieza
10 feb. 2023 12:55:04

@gillespieza desigur că este, dar în 2012 acea funcție era mai bună. Este un răspuns de acum 11 ani :)

Ciprian Ciprian
10 feb. 2023 15:17:58
0

Sanitizarea variabilei $_GET este destul de specifică contextului. Depinde de ce valoare doriți și cum doriți să fie validată.

Nu există un răspuns universal la această întrebare. Este foarte specific contextului. De exemplu, ați putea scrie o funcție care elimină toate tag-urile și slash-urile din input, ceea ce este foarte sigur, dar ce se întâmplă dacă doriți să păstrați un tag p? Nu este nicio problemă acolo. Familia de funcții wp_kses() este un studiu interesant, dar nu este o soluție excelentă, deoarece ia în considerare contextul, nivelul utilizatorului și multe altele. De exemplu, ca administrator, puteți salva JavaScript în titlul și conținutul postării, dar ca utilizator cu rol inferior, nu puteți.

Dacă valoarea este o cantitate cunoscută, puteți verifica dacă in_array( $array_valid_strings ) și să fiți extra sigur în legătură cu acestea.

Cu toate acestea, există diferite grade de sanitizare, așa că este important să vă păstrați obiectivul final în minte. Aș consulta această listă și aș găsi funcția sau combinația de funcții care se potrivește nevoilor dumneavoastră. Mai exact, funcțiile sanitize_ ar trebui folosite aici, nu cele esc_. Sanitizarea și escaparea continuă să fie confundate...

În cazul meu, voi folosi sanitize_text_field() deoarece sanitizează un șir de caractere din inputul utilizatorului sau din baza de date.

  • Verifică UTF-8 invalid,
  • Convertește caracterele singulare < în entități
  • Elimină toate tag-urile
  • Elimină întreruperile de linie, tab-urile și spațiile în plus
  • Elimină octeții

Mult succes :).

P.S. Acest răspuns citează perspectivele a trei dezvoltatori diferiți (Josh, Michal, Kevin).

11 oct. 2016 21:19:29