Defcrypt

PHP

Documentación PHP en tu Mac

by dGil on Feb.07, 2009, under MacOS X, PHP, Programación

Si eres programador de PHP, PHP.net seguramente será una de tus webs preferidas. Estaba esta tarde navegando buscando algún widget para el dashboard cuando por casualidad he encontrado PHP Function Index. Este programa para Mac OS X (10.4+) permite buscar en toda la documentación de PHP utilizando la documentación online.

Una vez descargado el programa, tendremos que descargar la documentación de PHP.net. Luego en las preferencias del programa seleccionamos el directorio dónde hemos guardado la documentación y le indicamos al programa que cree el índice.

Este programa permite además, consultar los comentarios. El programa también utiliza la documentación online para estar al día, pero también permite buscar sin conexión utilizando los archivos descargados. Os dejo un par de capturas:

PHPfi

PHPfi

PHPfi

PHPfi

Por cierto, si usáis Textmate, el programa lleva un addon para éste que permite mientras programamos consultar funciones en PHPfi. Para ejecutar dicho addon utiliza el siguiente atajo: ctrl + alt + H.

Leave a Comment :, , , more...

Obtener el tiempo a partir de un string en PHP

by dGil on Ene.17, 2009, under PHP, Programación

Para mi PFC he tenido que comparar entre dos fechas, cual era menor que la otra. Estas fechas se leían de un RSS (osea, un XML). El campo era “lastBuildDate”, que es un string con un formato como el siguiente: “Tue, 13 Jan 2009 18:16:06 +0100″.

Para poder comparar utilizando fechas se necesita trabajar con la marca de tiempo de Unix. Esta marca de tiempo es un entero que contiene el número de segundos entre el Epoch Unix (1 de Enero de 1970 00:00:00 GMT) y la hora especificada.

Para poder convertir una fecha en la marca de Unix tendremos que utilizar la función mktime de PHP. El problema es que solo acepta enteros como entrada y en el siguiente orden:

int mktime  ([ int $hora  [, int $minuto  [, int $segundo  [, int $mes  [, int $dia  [, int $anyo  [, int $es_dst  ]]]]]]] )

Por lo tanto, como tenía un string, para poder utilizar la función mktime debía parsear el texto. Hice una pequeña función utilizando expresiones regulares que retorna la marca de Unix:

function getTime($time="")
{
	if (!empty($time)) {
		//separamos $time por los espacios en blanco, comas y doble punto
		$car = preg_split("/[\s,:]+/", $time);
 
		//mktime(hora, min, seg, mes, dia, año)
		return mktime($car[4],$car[5],$car[6],getMonth($car[2]),$car[1],$car[3]);	
	}
	else {
		return false;
	}
}

La función getMonth es un pequeño diccionario que convierte el mes -nombre- en un entero. Por ejemplo Nov devuelve 11.

Para que se entienda un poco mejor que retorna la función, utilizando como entrada “Tue, 13 Jan 2009 18:16:06 +0100″ $car contendría:

$car[0] = "Tue";
$car[1] = 13;
$car[2] = "Jan";
$car[3] = 2009;
$car[4] = 18
$car[5] = 16
$car[6] = 06
$car[7] = +0100

¡Y eso es todo amigos!

Actualización: ya hay una función implementada en PHP que hace esto y un poco más: strtotime.

Leave a Comment :, , more...

Funciones en PHP para evitar ejecución de código HTML

by dGil on Nov.25, 2008, under PHP, Programación, Seguridad

Durante el desarrollo de Filmo (más adelante ya os hablaré sobre éste proyecto) me he encontrado con un problema habitual en el uso de formularios html.

Normalmente nos vemos necesitados de usar formularios para que el usuario pueda introducir información en el sistema. Dicha información se suele guardar en una base de datos. Si no somos precavidos, y guardamos tal como el usuario introduce la información en la base de datos, pueden surgir problemas de seguridad graves. Dependiendo de como se haya programado (entenderemos que mal programado), incluso podría haber ejecución de código. Es, por lo tanto, necesario un control por parte del sistema para que no suceda esto.

PHP nos ofrece distintas funciones ya implementadas para tratar con el código HTML. A continuación os hablaré de cada una y cual escogí yo.

  • htmlentities: Transforma cualquier caracter en html si exisite su correspondencia. Osea, traduce <, >, ‘, “, &, á, é, í, ó, ú, etc. con sus correspondientes html.
  • htmlspecialchars: Funciona igual que htmlentities, sólo que htmlspecialchars funciona con UTF8, por lo tanto, no hace la traducción a carácteres html de letras acentuadas, con diéresis, etc.
  • strip_tags: Suprime todo lo que está entre “<, >” exceptuando las etiquetas HTML que le indiquemos.

En mi caso en particular, tenia el siguiente problema: en la base de datos había declarado una variable de tipo string con un limite de 11 carácteres. Si usaba una de las dos primeras funciones suponiendo que un usuario insertaba en el formulario:

<b>hola</b>

Que son 11 carácteres, como se traducía a html teníamos:

&lt;b&gt;hola&lt;/b&gt;

Cómo podemos observar, al traducirlo a HTML tenemos muchas más letras, y por lo tanto, la base de datos nos devolvería un error conforme no se podría hacer la inserción por tamaño demasiado grande.

Es aquí donde entra strip_tags. Esta función, nos permite eliminar como ya hemos comentado, las entidades HTML que nosotros no permitamos (por defecto se borran todas). Esto nos permitiría eliminar todas aquellas que pudieran suponer un peligro, o remodelar el sitio web (como poner <li> o <div> en un lugar indevido).

Por lo tanto, la mejor opción es sin duda usar strip_tags. Como ya hemos dicho, borra todos los tags html, y por lo tanto en el ejemplo comentado, no tendriamos un overflow en la base de datos. Así nos quedaría:

  • Código original:
    <b>¡hola!</b>
  • Usando strip_tags:
    ¡hola!

De todas formas, éste es un ejemplo muy concreto. Si no tubieramos el límite del tamaño, quizás seria suficiente con htmlspecialchars. Sin duda, strip_tags es la posibilidad más restrictiva.

4 Comments :, , more...

¿Buscando algo?

Utiliza este formulario para buscar: