PLATAFORMA: PHP MySQL &PHP y mySQL: ¿Cuándo usar htmlentities exactamente?
Para mis fines de experimentación, he probado algunas de las inyecciones XSS a mí mismo en mi propio sitio web. Considere esta situación en la que tengo mi formulario textarea de entrada. Como este es un área de texto, puedo ingresar texto y todo tipo de caracteres (en inglés). Aquí están mis observaciones:
A). Si aplico solo strip_tags y mysql_real_escape_string y no uso htmlentities en mi entrada justo antes de insertar los datos en la base de datos, la consulta está rompiendo y me aparece un error que muestra la estructura de mi tabla, debido a la terminación anómala.
B). Si estoy aplicando strip_tags, mysql_real_escape_string y htmlentities en mi entrada justo antes de insertar los datos en la base de datos, la consulta NO está rompiendo y puedo insertar datos del área de texto en mi base de datos.
Por lo tanto, entiendo que las funciones se deben usar a toda costa, pero no se sabe exactamente cuándo se deben usar. Con lo anterior en mente, me gustaría saber:
¿Cuándo se deben usar htmlentities exactamente? ¿Debería usarse justo antes de insertar los datos en DB o de alguna manera obtener los datos en DB y luego aplicar htmlentities cuando estoy tratando de mostrar los datos del DB?
Si sigo el método descrito en el punto B) anterior (que creo que es la solución más obvia y eficiente en mi caso), aún tengo que aplicar htmlentities cuando intento mostrar los datos de la base de datos ? Si es así, ¿por qué? ¿Si no, porque no? Lo pregunto porque es muy confuso para mí después de haber pasado por el puesto en: http://shiflett.org/blog/2005/dec/google-xss-example
Luego está esta función una más llamada PHP: html_entity_decode. ¿Puedo usar eso para mostrar mis datos de DB (después de seguir mi procedimiento como se indica en el punto B) ya que htmlentities se aplicó en mi entrada? ¿Cuál debería preferir de html_entity_decode y htmlentities y cuándo?
previa de la página:
pensé que podría ayudar a añadir algunos detalles más específicos de una situación específica aquí. Considere que hay una página 'Vista previa'. Ahora cuando presento la entrada desde un área de texto, la página Vista previa recibe la entrada y la muestra html y, al mismo tiempo, una entrada oculta recoge esta entrada. Cuando se presiona el botón de enviar en el botón Vista previa, los datos de la entrada oculta se transfieren a una nueva página y esa página inserta los datos contenidos en la entrada oculta en la base de datos. Si no aplico htmlentities cuando el formulario se envía inicialmente (pero solo se aplican strip_tags y mysql_real_escape_string) y hay una entrada maliciosa en el área de texto, la entrada oculta se rompe y los últimos caracteres de la entrada oculta se ven visiblemente como " />
en la página , lo cual es indeseable Así que, teniendo esto en cuenta, tengo que hacer algo para preservar la integridad de la entrada oculta correctamente en la página de Vista previa y aún recopilar los datos en la entrada oculta para que no la rompa. ¿Cómo hago esto? Disculpa por el retraso en publicar esta información.
Gracias de antemano.
Un consejo: la mayoría de las veces, no debe usar htmlentities, sino htmlspecialchars. htmlentities convierte una tonelada de caracteres, mientras que htmlspecialchars solo convierte aquellos que DEBEN convertirse. –
@Michael Madsen: Gracias por el consejo. El formulario acepta todas las entradas que puedas ingresar usando un teclado basado en los EE. UU. Así que tuve la idea de que el uso de htmlentities lo haría más seguro, en caso de que alguien intente copiar y pegar manualmente algunos caracteres extraños de algún otro sitio web o de su propio sistema localmente. Así que opté por usar htmlentities. ¿Qué piensas? – Devner
No tiene sentido. Sí, los personajes extraños podrían verse ... bueno, raro en su sitio. Pero no estás evitando eso usando htmlentities, porque las entidades son solo una forma diferente de representar al mismo personaje. No tienen ningún significado especial en HTML, por lo que no hay ninguna ventaja en su traducción: el resultado final será el mismo, solo usará más bytes para mirar de esa manera. –