Archive for the ‘PHP’ Category

mayo 17, 2011 0

Filtrando datos con filter_input

By in PHP

Algo que hay que tener en cuenta a la hora de desarrollar cualquier tipo de software, tanto web como de otro tipo, es que los datos que introduce el usuario no tienen porque ser los correctos, y en algunos casos pueden llegar a ser incluso maliciosos. Veamos un pequeño ejemplo:

Supongamos que tenemos el siguiente formulario:

formulario.php

<html>
<head>
  <title>Formulario</title>
</head>
<body>
  <form method="post" action="mensaje.php">
   <label for="mensaje">Mensaje:</label>
   <input type="text" name="mensaje" id="mensaje"/>
   <input type="submit" value="Enviar mensaje"/>
  </form>
</body>
</html>

Al pulsar el botón de enviar este nos lleva al siguiente script:

mensaje.php

<?php
  $mensaje = $_POST['mensaje'];
?>
<html>
<head>
  <title>Ver mensaje</title>
</head>
<body>
<p>El mensaje es:</p>
<p><?php echo $mensaje;?></p>
</body>
</html>

Si no tenemos cuidado puede ocurrir que un atacante malintencionado insertara como mensaje algo como:

<script src="script-dañino.js"></script>

Con lo que el código de ese script-dañino.js se ejecutaría, lo que podría hacer que cambiara el contenido de la página, que instalará algún tipo de malware, etc.

Podemos evitar esto con una función, que está presente desde PHP 5.2.0, que nos permite filtrar los datos que recibe el servidor por parte del navegador, la función filter_input. Veamos como quedaría el archivo mensaje.php una vez corregido:

mensaje.php

<?php
  $mensaje = filter_input(INPUT_POST, 'mensaje', FILTER_SANITIZE_SPECIAL_CHARS);
?>
<html>
<head>
  <title>Ver mensaje</title>
</head>
<body>
<p>El mensaje es:</p>
<p><?php echo $mensaje;?></p>
</body>
</html>

Y de esta sencilla forma hemos conseguido filtrar la variable mensaje. Este método no nos serviría si esperamos que la entrada venga en formato HTML, por ejemplo, pero si nos puede venir bien para otros tipos de datos.

Para ver una descripción completa de esta función es recomendable ver su documentación.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , ,

mayo 5, 2011 0

Midiendo el tiempo que tarda en ejecutarse una porción de código en PHP

By in PHP

Algunas veces nos puede resultar útil saber cuanto tiempo tarda en ejecutarse una porción de código en PHP, por ejemplo para realizar pruebas de rendimiento. Para ello podemos usar la función de PHP microtime, que nos devuelve la fecha con microsegundos, de la siguiente manera:

$time_start = microtime(true);

/* Porción de código que queremos ejecutar */

$time_end = microtime(true);
$time_total = $time_end - $time_start;

echo "El código se ha ejecutado en $time_total segundos";

A partir de PHP 5.0.0 la función microtime admite un parámetro booleano, que puede ser verdadero o falso, para indicar que el resultado se devuelva como un  número real, en lugar de como una cadena, que era como se retornaba en versiones anteriores.

Si estamos usando una versión anterior a la 5.0.0 podemos hacerlo de la siguiente forma:

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();

/* Porción de código que queremos ejecutar */

$time_end = microtime_float();
$time_total = $time_end - $time_start;

echo "El código se ha ejecutado en $time_total segundos";
Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: ,

abril 25, 2011 1

Parsear XML en PHP con SimpleXML

By in PHP

SimpleXML nos permite parsear un XML de una forma sencilla y usable. Para ello nos provee de una serie de funciones y de una clase para la manipulación de XML. Aquí solo vamos a ver la función simplexml_load_file, para ver un ejemplo, pero podemos ver el resto en la documentación de SimpleXML.

Supongamos que tenemos el siguiente archivo XML:

<?xml version="1.0" encoding="UTF-8"?>
<libros>
  <libro id="0">
    <titulo>Ubik</titulo>
    <autor>Philip K. Dick</autor>
</libro>
  <libro id="1">
    <titulo>La fundación</titulo>
    <autor>Isaac Asimov</autor>
  </libro>
  <libro id="2">
    <titulo>El señor de los anillos</titulo>
    <autor>J.R.R. Tolkien</autor>
  </libro>
</libros>

Con el siguiente código cargaríamos el archivo y mostraríamos un listado de los libros con el formato “id:titulo:autor”:

<?php

$libros = simplexml_load_file('libros.xml');

foreach($libros->libro as $libro)
{
 echo $libro['id'].':'.$libro->titulo.':'.$libro->autor."\n";
}

Como podemos ver cargamos el archivo libros.xml en un objeto al que hemos llamado $libros. Este objeto modelará el XML mediante arrays que contienen los elementos del xml. Las propiedades de cada elemento están implementadas como un array asociativo.

Como hemos podido ver en esta breve introducción es muy sencillo parsear un xml con SimpleML. Recomiendo revisar la documentación de este módulo para conocer todas las posibilidades que nos ofrece.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: ,

abril 20, 2010 1

Consejos de seguridad en el desarrollo de aplicaciones web

By in General, PHP

La seguridad es un aspecto muy importante al que hay que prestar atención cuando se desarrolla. Es importante tenerla en cuenta desde el mismo comienzo del desarrollo, no dejando la seguridad como algo secundario a realizar en momentos posteriores. Es por esto que vamos a dejar algunos consejos de como mejorar la seguridad durante el desarrollo de nuestras aplicaciones.

No confies en los usuarios

Esta es una de las reglas más importantes. Considera todas los datos que tus usuarios envíen como maliciosos.

$id = intval($_GET['id']);
mysql_query("SELECT username, email, password FROM users WHERE id = $id");

Con una sola linea podemos evitarnos una inyección SQL, por ejemplo.

Validación de datos en el servidor

Es importante realizar la validación de los datos en el servidor. Aunque realicemos también validación en cliente, mediante JavaScript por ejemplo, no hay que olvidarse que es relativamente fácil saltarse esta. Validando los datos en el servidor desde el principio nos evitamos bastantes problemas.

Presta atención a los archivos subidos

Si permites que tus usuarios suban archivos al servidor comprueba estos adecuadamente. Si son imágenes comprueba su tamaño, su tipo MIME, etc, con la función getimagesize. En caso de que sean otro tipo de archivos puedes usar fileinfo (disponible desde la versión 5.3.0) para obtener información de los archivos. Por ejemplo:

Asegura tus formularios contra los bots

Usa algún tipo de captcha para asegurar tus formularios contra bots de spammers. Hay distintas técnicas, puedes implementar uno propio, hacer uso de algún servicio externo o usar una librería de terceros.

Permisos mínimos para el usuario de la base de datos

Da los mínimos permisos al usuario de la base de datos. Si la aplicación solo va a realizar consultas SELECT, INSERT y UPDATE que el usuario de la base de datos solo pueda realizar SELECT, INSERT y UPDATE. No es nada complicado y te puede evitar algún que otro quebradero de cabeza.

Estos consejos son una “traducción” muy libre de estos otros:

http://www.osmialowski.me/blog/web-development-security-tips/

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , ,

marzo 25, 2010 1

Generando CSS mediante PHP

By in CSS, PHP

Si algo se hecha de menos en CSS es el no poder hacer uso de variables o de cierta lógica. Hay que tener en cuenta que CSS es un lengauje meramente estilístico, sirve para describir los estilos y la presentación de los elementos de la página.

Si alguna vez necesitamos incluir lógica en los CSS, por ejemplo para cambiar la paleta de colores en función de la estación del año, podemos usar PHP para esto. Lo que vamos a tener ahora es un archivo PHP en lugar del CSS, por ejemplo style.php. En este archivo lo primero que tendremos será:

header("Content-type: text/css; charset: UTF-8");

De esta forma le decimos al navegador que el contenido será del tipo CSS. Veamos un ejemplo donde el color de fondo y el color del texto se seleccionará de forma aleatoria. Primero el código de nuestra página:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  dir="ltr" lang="es-ES">
<head>
<link rel="stylesheet" type="text/css" href="style.php"/>
</head>
<body>
<div id="bloque">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aliquam at facilisis odio. Integer sollicitudin facilisis tortor, id
ullamcorper dolor dignissim vel. Curabitur tristique pellentesque iaculis.
Vivamus molestie condimentum hendrerit. In hac habitasse platea dictumst.</div>
</body>
</html>

Y ahora el del script PHP que genera la CSS:

<?php

header("Content-type: text/css; charset: UTF-8");

$colores = array(
  array('bg' => '#000', 'fg' => '#fff'),
  array('bg' => '#00f', 'fg' => '#fff'),
  array('bg' => '#fff', 'fg' => '#f00')
);

$color = $colores[rand(0,2)];
?>

#bloque {
color: <?php echo $color['fg'];?>;
background-color: <?php echo $color['bg'];?>;
}

Se puede ver como se elige una u otra paleta de forma aleatoria en este enlace.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: ,