¿Cómo generar HTML de forma segura desde un programa PHP?

2 minutos de lectura

avatar de usuario de user198729
usuario198729

Al hacer este trabajo en PHP, uno puede encontrarse con este tipo de problema:

<span title="<?php echo $variable;?>">...

El problema es que si $variable contiene comillas dobles, debe cambiarlo a \"

Y esa no es toda la historia todavía:

<span title="<?php echo $variable;?>">...

En este caso, necesitamos cambiar las comillas simples a \'pero deje las comillas dobles como están.

Además, los valores de las variables pueden contener corchetes angulares que interferirán con HTML.

Entonces, ¿cómo podemos escapar de forma segura de la salida de HTML?

Avatar de usuario de Dominic Rodger
dominic rodriguez

Siempre desea codificar en HTML las cosas dentro de los atributos HTML, lo que puede hacer con htmlspecialchars:

<span title="<?php echo htmlspecialchars($variable); ?>">

Probablemente desee configurar el segundo parámetro ($quote_style) a ENT_QUOTES.

El único riesgo potencial es que $variable puede que ya esté codificado, por lo que puede desea establecer el último parámetro ($double_encode) a false.

  • Confirmado con especificaciones html5 aquí: stackoverflow.com/questions/5320177/…

    – e-motivo

    31 de enero de 2014 a las 23:46

  • +1 por mencionar “ENT_QUOTES”. Ya estaba usando esta función, pero las comillas dobles estropearían el html.

    – danielson317

    17 de agosto de 2017 a las 16:55

  • Tenga en cuenta que ENT_QUOTES aún causará errores en javascript dentro de html:

    –Leigh Bicknell

    14 de marzo de 2019 a las 11:27

  • @LeighBicknell creo que es mejor hacerlo htmlspecialchars(json_encode($variable), ENT_QUOTES). No lo he probado en su ejemplo particular, pero creo que debería funcionar bien para cualquier tipo de valor.

    – frodeborli

    25 de marzo de 2021 a las 12:11

  • Desde PHP8.1 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 es el valor predeterminado.

    – Tobías K.

    28 de noviembre de 2022 a las 14:50

  • Bueno, antes de enviar cualquier texto a HTML, debe escaparlo usando htmlcaracteres especiales(). Así que solo asegúrese de que la comilla (doble) se cambie correctamente.

    Preste atención al segundo parámetro de esa función.

    La herramienta Bat tiene un método StringTool::htmlAttributes ($arrayOfAttributes) que también hace el trabajo.

    https://github.com/lingtalfi/Bat/blob/master/StringTool.php

    ¿Ha sido útil esta solución?

    ¿Cómo generar HTML de forma segura desde un programa PHP?

    2 minutos de lectura

    avatar de usuario de user198729
    usuario198729

    Al hacer este trabajo en PHP, uno puede encontrarse con este tipo de problema:

    <span title="<?php echo $variable;?>">...
    

    El problema es que si $variable contiene comillas dobles, debe cambiarlo a \"

    Y esa no es toda la historia todavía:

    <span title="<?php echo $variable;?>">...
    

    En este caso, necesitamos cambiar las comillas simples a \'pero deje las comillas dobles como están.

    Además, los valores de las variables pueden contener corchetes angulares que interferirán con HTML.

    Entonces, ¿cómo podemos escapar de forma segura de la salida de HTML?

    Avatar de usuario de Dominic Rodger
    dominic rodriguez

    Siempre desea codificar en HTML las cosas dentro de los atributos HTML, lo que puede hacer con htmlspecialchars:

    <span title="<?php echo htmlspecialchars($variable); ?>">
    

    Probablemente desee configurar el segundo parámetro ($quote_style) a ENT_QUOTES.

    El único riesgo potencial es que $variable puede que ya esté codificado, por lo que puede desea establecer el último parámetro ($double_encode) a false.

    • Confirmado con especificaciones html5 aquí: stackoverflow.com/questions/5320177/…

      – e-motivo

      31 de enero de 2014 a las 23:46

    • +1 por mencionar “ENT_QUOTES”. Ya estaba usando esta función, pero las comillas dobles estropearían el html.

      – danielson317

      17 de agosto de 2017 a las 16:55

    • Tenga en cuenta que ENT_QUOTES aún causará errores en javascript dentro de html:

      –Leigh Bicknell

      14 de marzo de 2019 a las 11:27

  • @LeighBicknell creo que es mejor hacerlo htmlspecialchars(json_encode($variable), ENT_QUOTES). No lo he probado en su ejemplo particular, pero creo que debería funcionar bien para cualquier tipo de valor.

    – frodeborli

    25 de marzo de 2021 a las 12:11

  • Desde PHP8.1 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 es el valor predeterminado.

    – Tobías K.

    28 de noviembre de 2022 a las 14:50

  • Bueno, antes de enviar cualquier texto a HTML, debe escaparlo usando htmlcaracteres especiales(). Así que solo asegúrese de que la comilla (doble) se cambie correctamente.

    Preste atención al segundo parámetro de esa función.

    La herramienta Bat tiene un método StringTool::htmlAttributes ($arrayOfAttributes) que también hace el trabajo.

    https://github.com/lingtalfi/Bat/blob/master/StringTool.php

    ¿Ha sido útil esta solución?

    ¿Cómo generar HTML de forma segura desde un programa PHP?

    2 minutos de lectura

    avatar de usuario de user198729
    usuario198729

    Al hacer este trabajo en PHP, uno puede encontrarse con este tipo de problema:

    <span title="<?php echo $variable;?>">...
    

    El problema es que si $variable contiene comillas dobles, debe cambiarlo a \"

    Y esa no es toda la historia todavía:

    <span title="<?php echo $variable;?>">...
    

    En este caso, necesitamos cambiar las comillas simples a \'pero deje las comillas dobles como están.

    Además, los valores de las variables pueden contener corchetes angulares que interferirán con HTML.

    Entonces, ¿cómo podemos escapar de forma segura de la salida de HTML?

    Avatar de usuario de Dominic Rodger
    dominic rodriguez

    Siempre desea codificar en HTML las cosas dentro de los atributos HTML, lo que puede hacer con htmlspecialchars:

    <span title="<?php echo htmlspecialchars($variable); ?>">
    

    Probablemente desee configurar el segundo parámetro ($quote_style) a ENT_QUOTES.

    El único riesgo potencial es que $variable puede que ya esté codificado, por lo que puede desea establecer el último parámetro ($double_encode) a false.

    • Confirmado con especificaciones html5 aquí: stackoverflow.com/questions/5320177/…

      – e-motivo

      31 de enero de 2014 a las 23:46

    • +1 por mencionar “ENT_QUOTES”. Ya estaba usando esta función, pero las comillas dobles estropearían el html.

      – danielson317

      17 de agosto de 2017 a las 16:55

    • Tenga en cuenta que ENT_QUOTES aún causará errores en javascript dentro de html:

      –Leigh Bicknell

      14 de marzo de 2019 a las 11:27

  • @LeighBicknell creo que es mejor hacerlo htmlspecialchars(json_encode($variable), ENT_QUOTES). No lo he probado en su ejemplo particular, pero creo que debería funcionar bien para cualquier tipo de valor.

    – frodeborli

    25 de marzo de 2021 a las 12:11

  • Desde PHP8.1 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 es el valor predeterminado.

    – Tobías K.

    28 de noviembre de 2022 a las 14:50

  • Bueno, antes de enviar cualquier texto a HTML, debe escaparlo usando htmlcaracteres especiales(). Así que solo asegúrese de que la comilla (doble) se cambie correctamente.

    Preste atención al segundo parámetro de esa función.

    La herramienta Bat tiene un método StringTool::htmlAttributes ($arrayOfAttributes) que también hace el trabajo.

    https://github.com/lingtalfi/Bat/blob/master/StringTool.php

    ¿Ha sido útil esta solución?