2012-10-10 8 views
10

Ho una semplice domanda: Quando è meglio disinfettare l'input dell'utente? E quale di queste è considerata la migliore pratica:Sanitizza l'input dell'utente in laravel

  1. Sanificare i dati prima di scrivere nel database.
  2. Salvare i dati grezzi e disinfettarli nella vista.

Per esempio utilizzare HTML::entities() e salvare risultato nel database. Oppure utilizzando i metodi HTML nelle viste perché in questo caso laravel utilizza per default HTML::entities(). O forse usando entrambi.

MODIFICA: Ho trovato l'esempio interessante http://forums.laravel.com/viewtopic.php?id=1789. Ci sono altri modi per risolvere questo?

+0

risposta rimosso in quanto non ha ancora si applica a XSS. Non c'è un modo duro o veloce, penso ... filtro il contenuto, legare i cookie agli indirizzi IP. La voce wiki ha un carico di buone informazioni http: //en.wikipedia.org/wiki/Cross-site_scripting –

+0

@DavidBarker, mi hai sbagliato. Tutto ciò di cui ho bisogno è di impedire che tag e javascript vengano eseguiti quando si mostra l'input dell'utente. – warmspringwinds

risposta

11

Direi che sono necessarie entrambe le posizioni, ma per motivi diversi. Quando i dati arrivano, è necessario convalidare i dati in base al dominio e rifiutare le richieste non conformi. Ad esempio, non ha senso consentire un tag (o testo per quella materia) se si prevede un numero. Per un parametro che rappresenta un anno, potresti anche voler controllare che sia all'interno di un intervallo. La sanitizzazione inizia con i campi di testo liberi. È ancora possibile eseguire una semplice convalida per caratteri imprevisti come 0 byte. IMHO è meglio memorizzare raw tramite safe sql (query parametrizzate) e quindi codificare correttamente per l'output. Ci sono due ragioni. Il primo è che se il tuo disinfettante ha un bug, cosa fai con tutti i dati nel tuo database? La risanitizzazione può avere conseguenze indesiderate. In secondo luogo si vuole fare fuga contestuale, per qualsiasi uscita che si sta utilizzando (JSON, HTML, attributi HTML ecc)

1

Dipende dall'input dell'utente. Se in genere si sta generando il codice che potrebbero fornire (ad esempio, forse è un sito che fornisce frammenti di codice), si risulterà sterilizzato sull'output. Dipende dal contesto. Se stai chiedendo un nome utente e stanno inserendo tag HTML, la tua convalida dovrebbe essere presa in considerazione e andare "no, non è bello, amico!"

Se è come nell'esempio che ho affermato in precedenza (frammenti di codice), quindi lasciatelo passare come RAW (ma assicuratevi di verificare che il database non si interrompa) e disinfetti l'output. Quando si utilizza PHP, è possibile utilizzare htmlentities($string).

9

Ho un articolo completo su input filtraggio in laravel, si potrebbe trovare utile http://usman.it/xss-filter-laravel/, qui è l'estratto da questo articolo:

Puoi fare un XSS globale da solo, se non hai una libreria per scrivere metodi comuni potresti aver bisogno di frequente allora ti chiedo di creare una nuova libreria Comune in applicazione/libreria. Mettere questi due metodi nella libreria comune:

/* 
* Method to strip tags globally. 
*/ 
public static function global_xss_clean() 
{ 
    // Recursive cleaning for array [] inputs, not just strings. 
    $sanitized = static::array_strip_tags(Input::get()); 
    Input::merge($sanitized); 
} 

public static function array_strip_tags($array) 
{ 
    $result = array(); 

    foreach ($array as $key => $value) { 
     // Don't allow tags on key either, maybe useful for dynamic forms. 
     $key = strip_tags($key); 

     // If the value is an array, we will just recurse back into the 
     // function to keep stripping the tags out of the array, 
     // otherwise we will set the stripped value. 
     if (is_array($value)) { 
      $result[$key] = static::array_strip_tags($value); 
     } else { 
      // I am using strip_tags(), you may use htmlentities(), 
      // also I am doing trim() here, you may remove it, if you wish. 
      $result[$key] = trim(strip_tags($value)); 
     } 
    } 

    return $result; 
} 

Poi inserire questo codice all'inizio del vostro filtro prima (in applicazione/routes.php):

//Our own method to defend XSS attacks globally. 
Common::global_xss_clean(); 
+0

Come evitare cose come 'foo 'onload = alert (document.cookie)'? – 735Tesla

3

Ho appena trovato questa domanda. Un altro modo per farlo è racchiudere l'output dinamico in parentesi quadre come questa {{{ $var }}} e blade sfuggirebbe alla stringa per te. In questo modo è possibile mantenere i personaggi potenzialmente pericolosi nel caso in cui siano importanti da qualche altra parte nel codice e visualizzarli come stringhe di escape.

+0

Non è necessario usare 'echo'. –

+0

@HasibMahmud Abbastanza corretto, lo aggiusterò – 735Tesla

0

che avevo trovato questo perché ero preoccupato per XSS in laravel, quindi questo è i pacchetti gvlatko

è facile:

per cancellare gli input = $ puliti = XSS :: pulito (ingresso: : get ('commento');

da utilizzare in vista = $ puliti = XSS :: pulito (ingresso :: il file ('profilo'), true);