creo una serie de otras respuestas se perdió la cuestión obvia ...
está usando el mysql_real_escape_string en el contenido introducido (como usted debe si no se usa comandos preparados).
Su problema es con la salida.
El problema actual es que llama a html_entity_decode. Con solo tiras, es necesario restaurar el texto original. html_entity_decode es lo que está arruinando tus presupuestos, etc., ya que los está cambiando. De hecho, desea generar el html, no solo texto sin formato (que es cuando usaría html_entities, etc.). Está decodificando algo que quiere codificar.
Si solo desea que aparezca la versión de texto, puede usar las entidades. Si le preocupan las etiquetas incorrectas, use etiquetas adhesivas y permita solo las etiquetas que desee (como b, i, etc.).
Finalmente, recuerde codificar y decodificar en el orden correcto. si ejecutó mysql_real_escape_String (htmlentities ($ str)), entonces necesita ejecutar html_entity_decode (stripslashes ($ str)). El orden de las operaciones es importante.
ACTUALIZACIÓN: No me di cuenta de que html_entity_decode también elimina las barras. No estaba claramente documentado en esa página, y simplemente nunca lo atrapé. Aun así, lo ejecutaré automáticamente, ya que la mayoría de html que presento quiero dejarlos como entidades, e incluso cuando no lo hago, prefiero tomar esa decisión fuera de mi clase de db, caso por caso. De esa manera, sé que las barras se han ido.
Parece que el póster original está ejecutando htmlentities (o su programa de entrada, como tinymce lo está haciendo por él), y quiere volver al contenido. Entonces, html_entity_decode ($ Str) debería ser todo lo que se requiere.
Si el usuario puede controlar $ cadena, entonces esta es una vulnerabilidad XSS. – rook