|

Evitar Cross-Site Request Forgeries en PHP

Siempre que hagamos una aplicación web, tenemos que tener muy encuenta las cuestiones de seguridad, sobre todo las formas más conocidas de ataque. Una de estas formas es Cross-Site Request Forgeries, que más o menos viene a decir Falsificación de Petición desde Otro Sitio (quizás la traducción no es exacta, pero creo que lo explica bien).

Este ataque se produce cuando a un usuario se le conceden permisos, confiando en él, pero no teniendo en cuenta que otra gente pueda aprovecharse de ello. Supongamos que tenemos una página de compra de artículos, cuya aplicación controla perfectamente los campos de entrada y que tiene una función que realiza la operación de compra de artículos.

Tenemos el formulario HTML:

<form action="compra.php" method="POST">
Artículo: <input type="text" name="articulo" />
Cantidad: <input type="text" name="Cantidad" />
<input type="submit" value="Comprar" />
</form>

El primer fallo que solemos cometer es leer las variables de entrada mediante $_REQUEST:

<?php
session_start();
if (isset($_REQUEST['articulo'] &&
isset($_REQUEST['cantidad'])) {
compra($_REQUEST['articulo'],
$_REQUEST['cantidad']);
}
?>

Una forma muy utilizada para realizar un ataque y que al autor del artículo le gusta mucho, es mediante el uso de una imagen:

<img src="http://ejemplo.org/compra.php?articulo=CAFETERA&cantidad=1000" alt="ads" />

Con esto conseguimos que el usuario que visita nuestra página tambien haga una petición a la página en cuestión sin que él lo sepa, claro, que esto solo funciona si el usuario a la vez tiene una sesión abierta en la página que se está atacando.

La solución es añadir una marca formada por un número “encriptado” y un tiempo para que tenga que renovarse esta marca. La marca se debe crear y pasar en el formulario por el que se envían los datos y a parte se debe controlar su existencia, si coincide y si no ha superado el timeout.

<?php
$marca = md5(uniqid(rand(), TRUE));
$_SESSION['marca'] = $token;
$_SESSION['tiempo_marca'] = time();
?>
<form action="compra.php" method="POST">
<input type="hidden" name="marca" value="<?php echo $marca; ?>" />
Artículo: <input type="text" name="articulo" />
Cantidad: <input type="text" name="Cantidad" />
<input type="submit" value="Comprar" />
</form>
<?php
if ($_POST['marca'] == $_SESSION['marca']) {
$diferencia_tiempo_marca = time() - $_SESSION['tiempo_marca'];
if ($diferencia_tiempo_marca <= 300) {
/* Menos de 5 minutos */
}
}
?>

Artículo original: Security Corner: Cross-Site Request Forgeries

Vía / backdraft

|

Java y AJAX

Para aquellos que quieran meterse en el mundo de AJAX usando Java, Sun nos proporciona toda la información que necesitamos para introducirnos en este mundo. Desde iniciación a AJAX mediante artículos que hablan sobre la importancia de AJAX, hasta a videos, pasando por los típicos ejemplos y componentes que podemos reutilizar.
Ya no hay excusa para los desarrolladores de Java de no meterse en el mundo AJAX.
AJAX and Java
Vía / Digg

links for 2006-07-29

FPDF: librería PHP para crear PDFs

fpdf.pngDebido a la decepción que me estoy llevando con el Zend Framework, aunque aún tengo esperanzas en que vaya mejorando, he tenido que buscar otras librerías PHP para crear PDF. Una que he encontrado que me está gustando bastante (por ahora) es FPDF, una librería que exporta a PDF sin necesidad de PDFLib (la cual es de pago). Lo bueno que tiene tambien es que es gratuita, se puede usar libremente y modificar según nuestras necesidades.

Entre las funcionalidades que nos ofrece esta librería nos encontramos:

  • Elección de la unidad de medida, formato de página y márgenes
  • Gestión de cabeceras y pies de página
  • Salto de página automático
  • Salto de línea y justificación del texto automáticos
  • Admisión de imágenes (JPEG y PNG)
  • Colores
  • Enlaces
  • Admisión de fuentes TrueType, Type1 y codificación
  • Compresión de página
  • Y algo muy importante para mí, que es lo que más me ha decepcionado de las librerías de Zend, es la posibilidad de usar otro idiomas y caracteres especiales.

La instalación es sencilla, lo copias en el directorio donde guardes las librerías e incluyes la ruta en el include_path del php.ini.

FDPD

Google Code Hosting: Source Forge de Google

google.pngYa no es rumor, ahora es noticia. Google ha lanzado un servicio para alojar proyectos open source. Entre las características que ofrece nos encontramos con: workspaces para los proyectos con controles de usuarios simples, control de versiones mediante Subversion, lista de eventos/asuntos ocurridos, listas de correo mediante groups.google.com.
Yo soy casi adicto a Source Forge y creo que seguiré buscando en Source Forge antes que en otro sitio. Si mal no tengo entendido en SF te tienen que aprovar en proyecto, y Google Code Hosting parece que no, por lo que va a haber mucho proyecto basura, que ya lo hay en SF, pero me da la sensación de que aquí va a serlo mucho más. Tambien he echado de menos un directorio de proyectos, las etiquetas están muy bien, y es muy 2.0, pero un directorio siempre viene de todas formas.
Google Code Hosting
Vía / Digg

|

fleXcroll: scroll bars personalizados para tu web

Librería que nos permite usar scrolls personalizados en nuestras páginas web, ya sean verticales u horizontales. Aunque hay que intentar que no aparezcan en nuestra página, en caso de que sea necesario, porque los hay que son totalmente necesarios, quizás se puedan personalizar con este script.
fleXcroll.png
Por lo poco que he visto del código (que no está fácil de seguir porque está ofuscado), veo que fija el tamaño de la capa y con la propiedad overflow muestra los scrolls. Dibuja los scrolls personalizados encima y mediante ellos realiza el scroll de la capa, usando scrollTop y scrollLeft (que creo que antes no funcionaba del todo bien en Opera 8 y en la versión 9 lo han solucionado). Algo que yo no solía hacer y que he visto como lo hace aquí, es capturar el evento selectstart y hacer que devuelva false, para que cuando se haga el drag del scroll no se seleccione la imagen que usamos para personalizar el control.
FleXcroll, Flexible and Accessible Custom Scroll Bars
Vía / aNieto2K

|

Cómo crear un portfolio en flash

Un buen tutorial en el que se explica cómo crear un portfolio en el que se cargan las imágenes dinámicamente. Explicado de forma muy detallada y fácil de seguir. El flash mostrará tres thumbnails, que al pinchar sobre ellos cargará la imagen correspondiente, mostrando el título y la descripción.
portfolio.png
Como única pega, a parte de que está limitado a tres imágenes, yo hubiera cargado los datos en un XML, en vez de en 3 ficheros de texto independientes.
Creating a Dynamic Portfolio in Flash
Vía / Pixel Groovy

links for 2006-07-27