desinfección de entrada / salida en php / codeigniter

5

He estado progresando en el aprendizaje de la seguridad de las aplicaciones web. En este momento estoy tratando de finalizar mi estrategia para desinfectar las entradas y salidas.

Antecedentes: los usuarios pueden enviar revisiones al sitio, y esas revisiones se muestran en ciertas vistas.

1) Publicar datos . Cuando publico datos (usando $ this- > input- > post ('revisar')), me preocupa usar el filtro XSS, ya que elimina los datos del usuario y no es posible recuperarlos, así que ' Estoy buscando otra forma de validar la entrada.

Resulta que para la validación de formularios, Codeigniter nos permite " funciones PHP nativas que permiten un parámetro . " Así que puedo usar strip_tags, htmlentities, htmlspecialchars, etc.

Pregunta: ¿Cuál de estas funciones recomendaría que usara para validar la entrada del usuario? (o XSS, si crees que es mejor)

2) Consultas de base de datos . Estoy usando el registro activo de CI para mis consultas, por lo que se escapan automáticamente (para que sepa que pensé y manejé esto)

3) Salida de datos . Hay varias vistas donde se muestra la salida. Sé que necesito escapar de la salida. Por lo general, se ve algo como esto:

<?php echo $review; ?>

Pregunta: ¿Simplemente agrego una función PHP a la salida, como a continuación, o hay algo más que deba hacer para evitar que se ejecute cualquier salida?

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

2 respuestas

3

Recomiendo leer los recursos que OWASP tiene disponibles. Este es un tema totalmente estándar, y hay mucho escrito en él.

Asegúrese de hacer la validación de entrada en el servidor. No confíe en que el cliente realice la validación de entrada, ya que se puede omitir el cliente.

Validación de entrada: la naturaleza de la validación de entrada que haga depende del tipo y rango esperado de valores posibles para el campo. Por lo general, terminará construyendo una lista blanca de caracteres permitidos y comprobando que la entrada solo contiene esos caracteres; o escribiendo una expresión regular que caracteriza las entradas válidas y la comparación con la expresión regular. Es probable que esto sea diferente para cada entrada, ya que debe depender del tipo y rango de valores esperado para esa entrada.

Debería combinar la validación de entrada con el escape de salida. La forma correcta de escape de salida depende de dónde se insertan los datos en la salida. Por ejemplo, si está interpolando datos en un documento HTML entre etiquetas, entonces use htmlspecialchars para escapar de los datos antes de insertarlos en el documento HTML (para evitar las secuencias de comandos entre sitios). Por otro lado, si está insertando una URL, también debe verificar que use uno de los conjuntos de protocolos incluidos en la lista blanca (por ejemplo, http :, https :; pero no javascript :).

    
respondido por el D.W. 13.05.2012 - 07:32
fuente
2

Con respecto a su #1 , siempre puede obtener el valor publicado y luego aplicar las funciones. Hay dos posibilidades que puedes usar (pero ciertamente hay más):

  1. Utilizando los filtros integrados en PHP, en su mayoría FILTER_SANITIZE_STRING que protegerá su cadena de caracteres con seguridad.
  2. Puede usar Purificador de HTML . Lo protegerá de nuevo sin XSS sin eliminar los datos de su usuario.

Ahora, realmente depende de lo que haga con los datos enviados. Si es solo para que una ID se verifique como un Entero, el filter_var con un indicador de validador será suficiente. Si no desea que su usuario envíe html para una revisión, buscaría un htmlspecialchars() , ya sea en el servidor lado (antes de agregar en la base de datos), o en el lado de la vista (cuando se muestra la cadena, también conocido como #3 ).

#2 : Lo hiciste correctamente. Nada que añadir;)

#3 : As @ D.W. respondí perfectamente, htmlspecialchars() debería ser el mejor para la salida HTML, y adaptar lo que se imprime con respecto a la salida (url, json, xml / html, etc.).

    
respondido por el Cyril N. 14.05.2012 - 10:43
fuente

Lea otras preguntas en las etiquetas