sanitizing input / output in php / codeigniter

5

Ho fatto dei progressi nell'apprendimento della sicurezza delle applicazioni web. In questo momento sto provando a finalizzare la mia strategia per la sanitizzazione dell'input e dell'output.

Sfondo: gli utenti possono inviare recensioni al sito e tali recensioni vengono visualizzate in determinate visualizzazioni.

1) Dati di pubblicazione . Quando pubblichi i dati (utilizzando $ this- > input- > post ('review')), sono preoccupato dell'utilizzo del filtro XSS, perché rimuove i dati dell'utente e non è possibile recuperarli, quindi I ' Sto cercando un altro modo per convalidare l'input.

Risulta che per la convalida del modulo, Codeigniter ci consente di " utilizzare funzioni PHP native che consentono un parametro . " Quindi posso usare strip_tags, htmlentities, htmlspecialchars, ecc.

Domanda: quale delle seguenti funzioni consiglieresti di utilizzare per convalidare l'input dell'utente? (o XSS, se pensi che sia meglio)

2) Query di database . Sto utilizzando il record attivo di CI per le mie query, quindi sono automaticamente sfuggiti (solo così sai che ho pensato e gestito questo)

3) Uscita dati . Ci sono diverse viste in cui viene visualizzato l'output. So che ho bisogno di sfuggire all'output. Di solito è simile a questo:

<?php echo $review; ?>

Domanda: Semplicemente aggiungo una funzione PHP all'output, come sotto, o c'è qualcos'altro che dovrei fare per evitare che l'output venga eseguito?

<?php echo htmlentities($review, ENT_QUOTES); ?>
    
posta chowwy 12.05.2012 - 21:30
fonte

2 risposte

3

Raccomando di leggere le risorse che OWASP ha a disposizione. Questo è un argomento totalmente standard, e c'è molto scritto su di esso.

Assicurati di eseguire la convalida dell'input sul server. Non fidarti del client per eseguire la convalida dell'input, poiché il client può essere ignorato.

Convalida dell'input: la natura della convalida dell'input dipende dal tipo e dalla gamma prevista di valori possibili per il campo. Di solito finirai per costruire una whitelist di caratteri consentiti e controllando che l'input contenga solo quei caratteri; o scrivendo un'espressione regolare che caratterizza gli input validi e verifica la regexp. Questo sarà probabilmente diverso per ogni input, perché deve dipendere dal tipo e dal range di valori atteso per quell'input.

Dovresti combinare la convalida dell'input con l'escaping dell'output. L'appropriata forma di escape dell'output dipende da dove vengono inseriti i dati nell'output. Ad esempio, se si interpongono dati in un documento HTML tra tag, utilizzare htmlspecialchars per evitare i dati prima di inserirli nel documento HTML (per evitare lo scripting cross-site). D'altra parte, se stai inserendo un URL, devi anche controllare che utilizzi uno dei set di protocolli autorizzati (ad es. Http :, https :; ma non javascript:).

    
risposta data 13.05.2012 - 07:32
fonte
2

Per quanto riguarda il tuo #1 , puoi sempre ottenere il valore inserito e applicare le funzioni dopo. Ci sono due possibilità che puoi usare (ma ce ne sono sicuramente di più):

  1. Utilizza i filtri incorporati in PHP, principalmente FILTER_SANITIZE_STRING che proteggerà la tua stringa di sicuro.
  2. Puoi utilizzare Depuratore HTML . Ti proteggerà nuovamente dall'XSS senza rimuovere i dati dell'utente.

Ora dipende molto da cosa fai con i dati inviati. Se è solo per un ID da verificare come numero intero, il filter_var con un flag di validatore sarà sufficiente. Se non vuoi che il tuo utente invii html per una recensione, vorrei fare un htmlspecialchars() , sul server lato (prima di aggiungere nel database), o sul lato della vista (quando si mostra la stringa, alias #3 ).

#2 : l'hai fatto correttamente. Nulla da aggiungere;)

#3 : come @ D.W. ha risposto perfettamente, htmlspecialchars() dovrebbe essere il migliore per l'output HTML e per adattare ciò che viene prodotto per quanto riguarda l'output (url, json, xml / html, ecc.)

    
risposta data 14.05.2012 - 10:43
fonte

Leggi altre domande sui tag