viernes, 20 de septiembre de 2013

Funciones de seguridad útiles para el tratamiento de strings en PHP


PHP proporciona una serie de funciones que pueden ser muy útiles para el tratamiento de strings, en especial aquellas que proporcionan seguridad ya que si algo es importante en PHP es ésto, ya que de nada sirve un diseño bonito, si después el sistema es fácilmente vulnerable.

htmlspecialchars: convierte caracteres especiales HTML a  su correspondiente entidad HTML

Constantes interesantes:

ENT_COMPAT  : Convertirá las comillas dobles y sólo dejará las comillas simples.
ENT_QUOTES : Convertirá tanto las comillas dobles como las simples.
ENT_NOQUOTES :  Dejará tanto las comillas dobles como las simples sin convertir.

echo htmlspecialchars("<script>document.location.reload();</script>'quería' \"hackear\"", ENT_QUOTES);
/*Si observas el código fuente regresa: &lt;script&gt;document.location.reload();&lt;/script&gt;&#039;quería&#039; &quot;hackear&quot;*/


htmlentities: es prácticamente igual a htmlspecialchars salvo que reemplaza todos los caracteres que contienen su respectivo equivalente como entidad HTML

Constantes interesantes:

ENT_COMPAT :  Convertirá las comillas dobles y deja solo las comillas sencillas.
ENT_QUOTES : Convertirá tanto las comillas dobles como las sencillas.
ENT_NOQUOTES : Dejará tanto las comillas dobles como las sencillas sin convertir.

echo htmlentities("<script>document.location.reload();</script>'quería' \"hackear\"");
/*Si observas el código fuente regresa: &lt;script&gt;document.location.reload();&lt;/script&gt;'quer&iacute;a' &quot;hackear&quot;*/


La diferencia entre htmlspecialchars y htmlentities es casí inapreciable a simple vista, pero si observas la diferencia entre ambas cadenas el carácter acentuado con htmlentities también es codificado a su entidad HTML.

addslashes: coloca una barra invertida \ delante de los caracteres que necesitan escaparse, estos caracteres son las comillas ', las comillas dobles ", y la barra invertida \, esta función para realizar consultas a una base de datos es útil cuando este método de escape es soportado, si no es el caso, hay que utilizar las funciones especificas de cada SGBD, mysqli_real_escape_string() para MySQL, pg_escape_literal(), pg_escape_string() para PostgreSQL

echo addslashes("'1 OR '1'='1");
#Regresa: \'1 OR \'1\'=\'1 evitando así la inyección sql


mysqli_real_escape_string: proporciona seguridad a una consulta realizada a una base de datos mysql, escapando caracteres no deseados como: ' " \

$conexion = new mysqli("localhost", "root", "password", "pruebas");
$root = mysqli_real_escape_string($conexion, "'1 OR '1'='1");
$consulta = "SELECT * FROM usuarios WHERE root='$root'";
$resultado = $conexion -> query($consulta);


quotemeta: escapa de la cadena seleccionada los siguientes caracteres: . \ + * ? [ ^ ] ( $ )

echo quotemeta("<?php function(){} ?>");
#Regresa: <\?php function\(\){} \?>