Codificar HTML en PHP

Habdul Hazeez 30 enero 2023
  1. Codificar con htmlspecialchars()
  2. Codificar con htmlentities()
  3. Codificar con htmlentities() y codificación HTML5
  4. Codificar con un método personalizado
Codificar HTML en PHP

La codificación HTML es un intento de evitar XSS de secuencias de comandos entre sitios en las aplicaciones web PHP cuando se procesan datos proporcionados por el usuario. Este tutorial le enseñará cómo codificar datos con htmlentities(), htmlspecialchars() y un método personalizado.

Codificar con htmlspecialchars()

PHP htmlspecialchars() es una función integrada que puede convertir caracteres especiales en entidades HTML. La sintaxis es la siguiente:

htmlspecialchars( $string, $flags, $encoding, $double_encode )

Explicación de los parámetros:

  • $string: La cadena de entrada
  • $flags: las banderas que dictan cómo la función debe manejar las comillas en la cadena
  • $encoding: Especifica la codificación utilizada por la función. Este parámetro es opcional
  • $double_encode: un atributo booleano que dicta si PHP codificará entidades existentes. Si lo establece en falso, PHP no codificará las entidades existentes

Como todas las funciones, htmlspecialchars() devuelve un valor. Su valor es la cadena convertida. Pero, si la función considera que la cadena no es válida, devolverá una cadena vacía.

El siguiente ejemplo muestra cómo convertir una cadena con htmlspecialchars(). Observará que la función no se usa con ninguna bandera.

<?php
    $stringToEncode = "A <b>bold text</b> a'nd á <script>alert();</script> tag";

    $encodedString = htmlspecialchars($stringToEncode);

    echo $encodedString;
?>

Producción :

A <b>bold text</b> a'nd á <script>alert();</script> tag

Cuando vea el código fuente de la página web, observará que el apóstrofe y los caracteres á no están codificados:

A &lt;b&gt;bold text&lt;/b&gt; a'nd á &lt;script&gt;alert();&lt;/script&gt; tag

Ahora, si proporciona una bandera y un formato de codificación a htmlspecialchars(), el apóstrofo se codifica, pero la á no.

<?php
    $stringToEncode = "A <b>bold text</b> a'nd á <script>alert();</script> tag";

    $encodedString = htmlspecialchars($stringToEncode, ENT_QUOTES, 'UTF-8');
    
    echo $encodedString;
?>

Producción :

A <b>bold text</b> a'nd á <script>alert();</script> tag

Ver código fuente de la página muestra que el navegador codifica el apóstrofo como &#039;:

A &lt;b&gt;bold text&lt;/b&gt; a&#039;nd á &lt;script&gt;alert();&lt;/script&gt; tag

Codificar con htmlentities()

El htmlentites() también es una función incorporada de PHP. Con htmlentities(), todos los caracteres aplicables se convierten en entidades HTML. Su sintaxis es la siguiente:

htmlentities( $string, $flags, $encoding, $double_encode )

La siguiente es una explicación de los parámetros:

  • $cadena: La cadena de entrada
  • $flags: las banderas que dictan cómo la función debe manejar las comillas en la cadena
  • $encoding: Especifica la codificación utilizada por la función. Este parámetro es opcional
  • $double_encode: un atributo booleano que dicta si PHP codificará entidades existentes. Si lo establece en falso, PHP no codificará las entidades existentes

El valor de retorno de esta función es la cadena codificada.

El siguiente es un ejemplo de conversión de una cadena con htmlentities(). Aquí htmlentities() no se usa con ninguna bandera.

<?php    
    $stringToEncode = "A <b>bold text</b> ánd a <script>alert();</script> tag's";

    $ecodedString = htmlentities($stringToEncode);

    echo $ecodedString;
?>

Producción :

A <b>bold text</b> ánd a <script>alert();</script> tag's

La fuente de vista de la página muestra que la función codifica el carácter á sin ningún indicador, pero el apóstrofo no está codificado.

A &lt;b&gt;bold text&lt;/b&gt; &aacute;nd a &lt;script&gt;alert();&lt;/script&gt; tag's

Un cambio en el código permitirá que la función codifique el apóstrofe.

<?php
    $stringToEncode = "A <b>bold text</b> ánd a <script>alert();</script> tag's";

    $ecodedString = htmlentities($stringToEncode, ENT_QUOTES, 'UTF-8');

    echo $ecodedString;
?>

Producción :

A <b>bold text</b> ánd a <script>alert();</script> tag's

Ver código fuente de la página:

A &lt;b&gt;bold text&lt;/b&gt; &aacute;nd a &lt;script&gt;alert();&lt;/script&gt; tag&#039;s

Codificar con htmlentities() y codificación HTML5

Cuando tiene caracteres que no están en inglés en su cadena, puede usar el indicador HTML 5 y la codificación UTF-8.

El indicador HTML5 indica a la función que trate la cadena como HTML5, y el indicador UTF-8 permite que la función comprenda cualquier carácter Unicode estándar.

El siguiente es un ejemplo de cómo usar htmlentities() con un indicador HTML5 y codificación UTF-8:

<?php
    $stringToEncode = "àéò ©€ ♣♦ ↠ ↔↛ āžšķūņ ↙ ℜ℞ ∀∂∋ rūķīš ○";

    $ecodedString = htmlentities($stringToEncode, ENT_HTML5, 'UTF-8');
    
    echo $ecodedString;
?>

Ver código fuente de la página:

&agrave;&eacute;&ograve; &copy;&euro; &clubs;&diamondsuit;
&twoheadrightarrow; &harr;&nrarr; &amacr;&zcaron;&scaron;
&kcedil;&umacr;&ncedil; &swarr; &Rfr;&rx; &forall;&part;&ReverseElement;
r&umacr;&kcedil;&imacr;&scaron; &cir;

Codificar con un método personalizado

Si desea implementar su esquema de codificación, un método personalizado puede ser útil. Este método tomará su cadena de entrada y aplicará alguna manipulación de cadena. Al final, obtienes una cadena codificada.

El siguiente código HTML tiene un área de texto y un solo botón de envío. El formulario action apunta a un archivo que codificará la cadena pasada en la entrada del formulario.

<main>
    <h1>Enter and HTML code and click the submit button</h1>
    <form action='encodedoutput.php' method='post'>
        <div class="form-row">
            <textarea rows='15' cols='50' name='texttoencode' required></textarea>
        </div>
        <div class="form-row">
            <input type='submit'>
        </div>
    </form>
</main>

El siguiente bloque de código es el código PHP que realizará la codificación. Guárdelo como encodedoutput.php.

<?php
    if (isset($_POST['texttoencode']) && !empty($_POST)) {
        // Check for empty text
        if ($_POST['texttoencode'] == "") {
            echo "Invalid text";
            die();
        }

        $inputHTML = bin2hex($_POST['texttoencode']); 
        $spiltHTML = chunk_split($inputHTML, 2 ,"%");
        $HTMLStringLength = strlen($spiltHTML);
        $HTMLSubLength = $HTMLStringLength - 1;
        $HTMLSubString = substr($spiltHTML,'0', $HTMLSubLength);

        $encodedOutput="<script>document.write(unescape('%$HTMLSubString'));</script>";

    } else {
        echo "Not allowed";
        die();
    }
?>

<textarea rows='15' cols='60'>
    <?php
        if ($encodedOutput) {
            echo $encodedOutput;
        } else {
            echo "";
            die();
        }
    ?>
</textarea>

Salida de muestra para <script>alert("Hello world");</alert>:

<script>document.write(unescape('%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%48%65%6c%6c%6f%20%77%6f%72%6c%64%22%29%3b%3c%2f%61%6c%65%72%74%3e'));</script>
Habdul Hazeez avatar Habdul Hazeez avatar

Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.

LinkedIn

Artículo relacionado - PHP Encode