¿Cuáles son las mejores prácticas para evitar ataques xss en un sitio PHP [cerrado]

Resuelto Rik Heywood asked hace 54 años • 20 respuestas

Tengo PHP configurado para que las comillas mágicas estén activadas y los registros globales estén desactivados.

Hago lo mejor que puedo para llamar siempre a htmlentities() para cualquier cosa que genere y que se derive de la entrada del usuario.

De vez en cuando también busco en mi base de datos elementos comunes utilizados en xss adjuntos, como...

<script

¿Qué más debería hacer y cómo puedo asegurarme de que las cosas que intento hacer siempre se hagan?

Rik Heywood avatar Jan 01 '70 08:01 Rik Heywood
Aceptado

Escapar de la entrada no es lo mejor que puede hacer para una prevención exitosa de XSS. También se debe escapar la salida. Si usa el motor de plantillas Smarty, puede usar |escape:'htmlall'el modificador para convertir todos los caracteres confidenciales en entidades HTML (yo uso mi propio |emodificador, que es un alias del anterior).

Mi enfoque para la seguridad de entrada/salida es:

  • almacenar la entrada del usuario no modificada (no se escapa HTML en la entrada, solo el escape compatible con DB se realiza a través de declaraciones preparadas por PDO)
  • escape en la salida, dependiendo del formato de salida que utilice (por ejemplo, HTML y JSON necesitan reglas de escape diferentes)
Michał Niedźwiedzki avatar Sep 16 '2008 11:09 Michał Niedźwiedzki

Soy de la opinión de que no se debe escapar nada durante la entrada, solo en la salida. Ya que (la mayoría de las veces) no puedes asumir que sabes hacia dónde van esos datos. Por ejemplo, si tiene un formulario que toma datos que luego aparecen en un correo electrónico que envía, necesita un escape diferente (de lo contrario, un usuario malintencionado podría reescribir los encabezados de su correo electrónico).

En otras palabras, sólo puedes escapar en el último momento en que los datos "abandonan" tu aplicación:

  • Elemento de lista
  • Escribir en un archivo XML, escapar para XML
  • Escribir en DB, escapar (para ese DBMS en particular)
  • Escribir correo electrónico, escapar de los correos electrónicos
  • etc.

Para abreviar:

  1. No sabes a dónde van tus datos
  2. En realidad, los datos podrían terminar en más de un lugar, necesitando diferentes mecanismos de escape, PERO NO AMBOS.
  3. Los datos que se escaparon para el objetivo equivocado realmente no son agradables. (Por ejemplo, recibir un correo electrónico con el asunto "Ir al bar de Tommy".)

° 3 ocurrirá si escapa de los datos en la capa de entrada (o necesita eliminarlos nuevamente, etc.).

PD: Apoyaré el consejo de no usar magic_quotes, ¡esas son pura maldad!

Jilles avatar Sep 16 '2008 21:09 Jilles

Hay muchas formas de hacer XSS (consulte http://ha.ckers.org/xss.html ) y es muy difícil de entender.

Personalmente delego esto al marco actual que estoy usando (Code Igniter, por ejemplo). Si bien no es perfecto, podría captar más de lo que logran mis rutinas hechas a mano.

Christian Studer avatar Sep 16 '2008 11:09 Christian Studer