2014-12-30 9 views
9

Mi chiedo come (se possibile) sia la protezione XSS fornita in Laravel. Non ho trovato nulla a riguardo nella documentazione.Come e dove può essere applicata la protezione XSS in Laravel?

Problema

Sto usando Eloquent'screate() metodo per inserire i dati nel database ($fillable/$guarded proprietà vengono impostate nei modelli). Come si è visto, posso liberamente mettere qualcosa di simile in input di testo di qualsiasi forma:

<script>alert('Hacking Sony in 3...2...')</script> 

e il valore verranno inseriti nel database. Quindi, quando echo viene visualizzato: viene visualizzato l'avviso.

Possibili soluzioni

Ora, laravel è un quadro molto bello, quindi vorrei assumere ci deve essere qualcosa per evitare XSS fuori dalla scatola. Tuttavia, non riesco a scoprire cosa sia.

Se ho torto, qual è il modo ottimale per gestire il problema?

  • Uso la convalida regex di fantasia per disabilitare caratteri specifici?
  • Devo usare mysql_real_escape_string() su ogni Input::get() che uso?
  • Do I strip_tags()?

View-livello di fuga non è sufficiente

So che posso usare Lama di triple curly brackets per sfuggire stringhe nelle viste, non è questo il punto, però. In primo luogo, ha molto più senso per me non lasciare entrare quei bastardi nel database.

Chiunque ha già riscontrato questo problema?

risposta

19

ha molto più senso per me di non lasciare che quei bastardi subdolo nel database nel primo posto.

In realtà, questo non è vero.

Il motivo per cui XSS viene gestito solo da blade è che gli attacchi XSS sono un problema di uscita . Non vi è alcun rischio per la sicurezza se si memorizza <script>alert('Hacking Sony in 3...2...')</script> nel database - è solo testo - non significa nulla.

Tuttavia, nel contesto dell'output HTML, il testo ha un significato e, pertanto, è il punto in cui deve verificarsi il filtro.

Inoltre, è possibile che l'attacco XSS possa essere un attacco riflesso, in cui i dati visualizzati non provengono dal database, ma da un'altra fonte. vale a dire un file caricato, url ecc. Se non si riesce a filtrare tutte le varie posizioni di input, si corre il rischio di perdere qualcosa.

Laravel ti incoraggia a sfuggire a all'uscita, indipendentemente da dove proviene. Dovresti solo visualizzare esplicitamente i dati non filtrati a causa di un motivo specifico e solo se sei sicuro che i dati provengano da una fonte attendibile (cioè dal tuo codice personale, mai dall'input dell'utente).

p.s. In Laravel 5 il valore predefinito di {{ }} sfugge a tutti gli output, il che evidenzia l'importanza di questo.

Edit: qui è una buona discussione con ulteriori punti su cui si dovrebbe filtrare in uscita, non Ingresso: html/XSS escape on input vs output

+0

Sono d'accordo che può essere un eccesso di manipolare ogni input prima di memorizzarlo. Ho, tuttavia, sentimenti contrastanti su questo approccio "solo uscita". Anche se '' è un nome utente valido, beh, non dovrebbe essere. Almeno in termini di input di testo stringhe come "

4

Per quanto ne so, la posizione "ufficiale" di Laravel è quella XSS prevention best practice is to escape output. Quindi, {{{ }}}.

Puoi supplemento l'escape attraverso ingresso servizi igienico-sanitari con Input::all(), strip_tags(), e array_map():

$input = array_map('strip_tags', \Input::all()); 
+1

Un modo per andare. Al momento uso anche 'array_map()' per pulire 'Input's. Continuo a pensare che '{{{}}}' sia l'ultima risorsa. – lesssugar

+0

@bishop puoi dare un esempio di come possiamo usare trip_tags() e array_map(). per evitare XXS – usama

+0

@usama ho aggiunto un esempio. – bishop

3

ho esaminato la protezione del laravel {{{...}}} contro gli attacchi XSS. Utilizza semplicemente la funzione htmlentities() nel modo seguente: htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false); Questo ti protegge da xss solo se lo utilizzi correttamente significa che non lo uso in alcuni tag HTML perché ciò comporterà possibilità di attacco XSS. Ad esempio:

$a = htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false); 
echo '<a href="'.$a.'">link</a>'; 

In questo caso, è vulnerabile a xss.

+0

avviso molto importante. quindi qual è il tuo consiglio? come prevenire tali vulnerabilità XSS? – alex

+1

@alex Una corretta escaping protegge dalla rottura del layout (e dall'esecuzione del javascript di hacker). Ma ci sono luoghi in cui il passaggio al contesto di javascript è legale (onclick, onerror, href) e "escaping" non possono impedirlo. È necessario convalidare e disinfettare i dati prima di inserirli in tali luoghi. Consiglio vivamente di leggere [QWASP XSS Prevention Cheat Sheet] (https://www.owasp.org/index.php/XSS_ (Cross_Site_Scripting) _Prevention_Cheat_Sheet) –

1

Inoltre filtro di ingresso prima della convalida come, prima di creare /app/Common/Utility.php

<?php 
namespace App\Common; 
use Illuminate\Support\Facades\Input; 

class Utility { 
    public static function stripXSS() 
    { 
     $sanitized = static::cleanArray(Input::get()); 
     Input::merge($sanitized); 
    } 
    public static function cleanArray($array) 
    { 
     $result = array(); 
     foreach ($array as $key => $value) { 
      $key = strip_tags($key); 
      if (is_array($value)) { 
       $result[$key] = static::cleanArray($value); 
      } else { 
       $result[$key] = trim(strip_tags($value)); // Remove trim() if you want to. 
      } 
     } 
     return $result; 
    } 
} 

e utilizzare nel vostro controller come questo

use App\Common\Utility; 
public function store() 
{ 
    Utility::stripXSS(); 
    // Remaining Codes 
} 

Questo codice pulirà il vostro input prima della convalida

1

Il pacchetto laravelgems/blade-escape estende Blade aggiungendo strategie di escape diverse ctives - @text, @attr, @css, @js, @param

Esempio:

<style> 
.userPrefix:before { content: "@css($content)"; } 
</style> 
<div> 
    <label class="userPrefix">@text($label)</label> 
    <input type="text" name="custom" value="@attr($value)"/> 
</div> 
<a href="/[email protected]($username)">Profile</a> 
<button onclick="callMyFunction('@js($username)');">Validate</button> 
<script> 
    var username = "@js($username)"; 
</script> 

leggere i loro README. XSS è molto complicato, ci sono molti contesti e approcci.

Test pagina - http://laragems.com/package/blade-escape/test

Problemi correlati