2010-06-07 10 views
7

Sto facendo un controllo di sicurezza su un'applicazione php abbastanza grande e mi chiedevo dove dovrei includere la mia convalida dell'input dell'utente.Se la funzione o il chiamante sono responsabili della convalida dell'input?

Devo convalidare i dati, quindi inviare i dati puliti alle funzioni di back-end o devo fare affidamento su ciascuna funzione per eseguire la propria convalida? O anche entrambi?

Esiste uno standard o una best practice per questo genere di cose?

Attualmente l'app funziona in modo incoerente e mi piacerebbe rendere le cose più coerenti.

+0

http://symcbean.blogspot.co.uk/2017/07/validate-input-escape-output.html – symcbean

risposta

6

È consigliabile convalidare i dati dall'esterno il prima possibile. A seconda dell'architettura, la convalida del backend all'interno delle funzioni responsabili può essere un secondo passo, ma non dipendere dalla convalida del backend ma convalidare i dati quando entrano nell'applicazione.

I professionisti con convalida all'interno delle funzioni come complemento della convalida precedente è che è più semplice (e più sicuro) mantenere il sistema perché gli sviluppatori (più deboli) non riescono a rompere l'applicazione. Se hai un'applicazione con supporto per i plug-in, ad es. per i plug-in di terze parti, anche le funzioni di sicurezza sono un must.

+0

Un problema con questo è che quando l'applicazione quando viene alla tua applicazione è che potresti non sapere come viene utilizzata la variabile.Per questo motivo è generalmente meglio disinfettare immediatamente prima dell'uso, ma questo lo rende molto più semplice ** per la revisione peer basata sulla sicurezza. – rook

2

Penso che se si possibile fare entrambi, e il tempo/risorse non sono un problema, perché no?

2

Dipende dall'ambito/definizione dell'applicazione. Ma tradizionalmente, le tue funzioni sono usate in may places $ object-> doSomething() fa proprio questo. Facendo affidamento sulla convalida, prevedi la possibilità di eseguire Qualcosa() del tuo acccord PROPRIO, sai?

Troppo, se si mantiene la convalida al di fuori si può facilmente gestirlo. Non c'è bisogno di scovarlo in quella particolare funzione interna. Mantengalo OOP, ma più come

$ data = $ validator-> sanitizeSomething ($ data); $ oggetto-> doSomething ($ dati);

mantiene le regole di convalida separate e facili da maneggiare così come le funzioni interne.

Elaborare, supponiamo di avere un oggetto db che aggiunge un allineamento alla tabella:

class db { 
    function addRow($table, $associativeArray) { 
     // primitive i know, just an example 
    } 
} 

vorresti il ​​tuo convalida in là?

function addRow($table, $associativeArray) { 
    if(isset($assiciativeArray['description']) { 
     // validate 
    } 
} 

sarebbe sciocco - che ci si vuole che nel l'oggetto che si sta lavorando in

class product { 
    function update() { 
     if($this->validate()) { 
      $this->db->addRow($this->toArray()); // or something, you get the idea, ya? 
     } 
    } 
    function validate() { 
     if($this->description != "") { 
     return true; 
     } 
     return false; 
    } 
} 
8

Sia è la risposta migliore. La convalida dei dati dovrebbe avvenire in ogni funzione che gestirà i dati per evitare il problema di Hope Driven Development (HDD)

+0

Ho una forte simpatia per questo punto di vista! È davvero il modo giusto per farlo. È qui che PHP diventa un mal di testa con cui lavorare, perché la digitazione debole ti obbliga a creare i tuoi controlli solo per assicurarti che tutti gli argomenti della funzione siano il tipo giusto = ( –

+0

Ma ci deve essere un equilibrio. una funzione che prende solo un array. Quella classe se per un oggetto particolare, quella funzione un compito particolare.Se quindi lo mando una stringa e si aspetta un array, quello non è l'HDD - questo sono io che sono stupido. : l'applicazione è ben documentata? Esistono potenti metodi disponibili pubblicamente che incapsulano in modo elegante la funzionalità? –

2

Convalida sul backend è come schermare i passeggeri dopo essere saliti a bordo dell'aereo. L'intero punto di convalida è impedire l'iniezione di elementi che potrebbero soffocare la tua app. Quindi devi convalidare prima di entrare nel gate :)

+0

Seguendo questa analogia se non ti fidi delle persone che guardano al gate a fare sempre il loro lavoro correttamente ogni volta che è più sicuro fare un doppio -check prima che l'aereo decolli: p Ma sicuramente dovrebbe prendere input male prima piuttosto che dopo, ma per essere doppiamente sicuro controllare entrambi. – Davy8

Problemi correlati