2012-10-10 141 views
10

Tengo una pregunta simple: ¿Cuándo es mejor desinfectar la entrada del usuario? Y cuál de estos se considera la mejor práctica:Sanitizar la entrada del usuario en laravel

  1. Sanitize los datos antes de escribir en la base de datos.
  2. Guarde los datos sin formato y desinféctelos en la vista.

Por ejemplo, use HTML::entities() y guarde el resultado en la base de datos. O usando los métodos HTML en las vistas porque en este caso laravel usa de manera predeterminada HTML::entities(). O tal vez usando ambos.

EDITAR: Encontré el ejemplo interesante http://forums.laravel.com/viewtopic.php?id=1789. ¿Hay otras formas de resolver esto?

+0

respuesta retirado como se aplica a los que aún no ha XSS. No hay una manera dura o rápida, creo ... filtra el contenido, ata las cookies a las direcciones IP. La entrada del wiki tiene una carga de buena información http: //en.wikipedia.org/wiki/Cross-site_scripting –

+0

@DavidBarker, me has entendido mal. Todo lo que necesito es evitar que se ejecuten etiquetas y javascript al mostrar la entrada del usuario. – warmspringwinds

Respuesta

11

Yo diría que necesita ambas ubicaciones, pero por diferentes razones. Cuando ingresan datos, debe validar los datos de acuerdo con el dominio y rechazar las solicitudes que no cumplan. Como ejemplo, no tiene sentido permitir una etiqueta (o texto para el caso) si espera un número. Para un parámetro que representa un año, es posible que desee verificar que se encuentre dentro de algún rango. La desinfección se inicia en los campos de texto libre. Todavía puede hacer una validación simple para caracteres inesperados como 0 bytes. En mi humilde opinión, es mejor almacenar en bruto a través de SQL seguro (consultas parametrizadas) y luego codificar correctamente para la salida. Hay dos razones La primera es que si su sanitizante tiene un error, ¿qué hace con todos los datos en su base de datos? La resanitización puede tener consecuencias no deseadas. En segundo lugar usted quiere hacer el escape del contexto, por lo que la salida está utilizando (JSON, HTML, atributos HTML, etc.)

1

Depende de la entrada del usuario. Si generalmente va a generar código que pueden proporcionar (por ejemplo, tal vez sea un sitio que proporcione fragmentos de código), entonces desinfectará el resultado. Depende del contexto. Si está pidiendo un nombre de usuario y está ingresando etiquetas HTML, su validación debe ser retomada y activada "no, esto no es genial, amigo".

Si es como el ejemplo que mencioné anteriormente (fragmentos de código), déjela pasar como RAW (pero asegúrese de asegurarse de que la base de datos no se rompa) y desinfecte la salida. Al usar PHP, puede usar htmlentities($string).

9

Tengo un artículo completo sobre filtrado de entrada en laravel, es posible que sea de utilidad http://usman.it/xss-filter-laravel/, aquí está el extracto de este artículo:

Puede hacer una limpieza XSS global usted mismo, si no tiene una biblioteca para escribir métodos comunes que pueda necesitar con frecuencia, entonces le pido que cree una nueva biblioteca Común en la aplicación/biblioteca. Ponga estos dos métodos en la biblioteca común:

/* 
* 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; 
} 

luego poner este código en el comienzo de su filtro antes (en application/routes.php):

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

¿Cómo podría evitar cosas como 'foo" onload = alert (document.cookie) '? – 735Tesla

3

simplemente me encontré con esta pregunta. Otra forma de hacerlo es encerrar la salida dinámica en paréntesis triples como este {{{ $var }}} y la cuchilla escapará de la cuerda por usted. De esta forma, puede conservar los caracteres potencialmente peligrosos en caso de que sean importantes en otro lugar del código y mostrarlos como cadenas escapadas.

+0

No es necesario que use' echo'. –

+0

@HasibMahmud Bastante correcto, lo arreglaré – 735Tesla

0

que había encontrado esto porque yo estaba preocupado por XSS en laravel, así que esto es los paquetes gvlatko

es fácil:

Para borrar entradas = $ = limpiado Xss :: limpia (de entrada: : get ('comentario');

utilizar en las vistas = $ = limpiado Xss :: limpia (entrada :: archivo ('perfil'), TRUE);

Cuestiones relacionadas