Codificar HTML en PHP
-
Codificar con
htmlspecialchars()
-
Codificar con
htmlentities()
-
Codificar con
htmlentities()
y codificación HTML5 - Codificar con un método personalizado
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 <b>bold text</b> a'nd á <script>alert();</script> 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 '
:
A <b>bold text</b> a'nd á <script>alert();</script> 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 <b>bold text</b> ánd a <script>alert();</script> 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 <b>bold text</b> ánd a <script>alert();</script> tag'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:
àéò ©€ ♣♦
↠ ↔↛ āžš
ķūņ ↙ ℜ℞ ∀∂∋
rūķīš ○
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 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