|

Flickr en tu blog mediante PHP

phpFlickr es una librería que hace de intermediaria entre nuestra aplicación web y el API de Flickr. Para poder usarla es necesario, a parte de tener una cuenta de Flickr y esta librería, una base de datos MySQL para el PEAR Caching o acceso de lectura/escritura a sistema de ficheros, script.aculo.us y LightBox JS (bastantes cosas).
Su uso parece bastante sencillo y nos puede facilitar mucho el acceso a las fotos de Flickr, sobre todo si aún somos nuevos en PHP.
Using phpFlickr to Intergrate Flickr Photos on Your Own Site
Using phpFlickr to Create a Ajax Enabled Flickr Slideshow
Vía / Pixel Groovy

Configura tu PHP de forma segura

PHP viene por defecto configurado para desarrollo, pero en producción hay opciones que no son recomendables sobre todo por temas de seguridad. Cambiad en el php.ini las siguientes opciones para mejorar la seguridad en tu entorno de producción:

  • Desactiva el acceso a ficheros remotos: las funciones fopen, file_get_contents, y include permiten el acceso a ficheros remotos (http://host/..), lo cual puede dar problema en temas de seguridad. Si necesitas acceder a ficheros remotos puedes usar fsockopen o funciones de CURL.
allow_url_fopen = Off
  • Register globals: aunque ahora viene por defecto desactivado, en versiones anteriores de PHP, los parámetros de entrada se registraban como variables globales.
register_globals = Off
  • Restringe a qué ficheros puede acceder PHP: normalmente PHP solo necesita acceder a ficheros situados en cierto path, por lo que para evitar que se acceda a otros paths, es conveniente restringir su acceso.
open_basedir = /www/ficheros
  • Modo seguro: PHP dispone de un modo seguro, en el que Apache solo puede acceder a ficheros de los que sea dueño, aunque nos puede dar problemas sobre todo cuando se trabaja en grupo, la tranquilidad que nos aporta pesa más que este inconveniente. Para ello usaremos una propiedad para que solo ejecute scripts que le pertenecen y otra permite acceso a los ficheros que pertenecen al grupo de Apache aun cual sea el dueño.
safe_mode = Off
safe_mode_gid = On
  • Acceso permitido a ficheros binarios: el modo seguro tampoco permite ejecutar ficheros binarios, pero se le puede indicar en que ruta si se pueden ejecutar.
safe_mode_exec_dir = /www/ejecutables
  • Acceso a variables de entorno: tampoco está permitido acceder a variables de entorno en el modo seguro, pero se puede inluir una lista (separada por comas) de prefijos que se permiten para estas variables.
safe_mode_allowed_env_vars = PHP_
  • Controlar límites: también es conveniente controlar ciertos límites, como el tiempo de ejecución, el de tamaño máximo subido y muchos otros.
max_execution_time = 30 ; Tiempo máximo de ejecución
max_input_time = 60 ; Tiempo máximo que trata la entrada
memory_limit = 16M ; Memoria máxima para la ejecución de un script
upload_max_filesize = 2M ; Tamaño máximo de un fichero para subir
post_max_size = 8M ; Tamaño máximo de un POST
  • Control de acceso a ficheros mediante Apache: aunque en este caso se debe configurar Apache, tampoco biene mal el contarlo. Se trata de evitar que Apache acceda a ficheros importantes, por ejemplo ficheros .inc, .sql.
<FilesMatch "\.(inc|.*sql)$">
Order allow,deny
Deny from all
</FilesMatch>
  • Evita el acceso a la shell: Taufpate nos recomienda también evitar que se intente acceder a la shell. Si tienes un server y das hosting tienes que tener cuidado con los usuarios que usan mambo, phpnuke, jooomla, etc.., sistemas que a diario reportan problemas de seguridad y nunca son actualizados por sus usuarios.
  • disable_functions = system, exec, shell_exec, passthru, pcntl_exec, putenv, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, popen, pclose, set_time_limit, ini_alter, virtual, openlog, escapeshellcmd, escapeshellarg, dl, curl_exec, parse_ini_file, show_source

Checklist for Securing PHP Configuration

Vía / dzone

Filtra las imágenes con desnudos que suban a tu web

Ahora que está tan de moda el software social y las posibilidades de compartir nuestras experiencias, sobre todo en imágenes. Es posible que no queramos que los usuarios suban imágenes con desnudos. Para ello esta clase que analiza los colores que existen en la imagen y devuelve una posibilidad de que la imágen contenga “demasiada carne”.
Claro, que este script nos puede ayudar, aunque tampoco hay que tratarlo como perfecto, porque está claro que no distinguiría de una foto de una cara o un grupo de caras, de una foto de una modelo posando desnuda, y muchos otros ejemplos que seguro que se pueden decir que pasarían este filtro.
Pero al menos si se trata de una ayuda, para localizar imágenes y luego revisarlas manualmente, a parte de incluir la posibilidad de que los usuarios avisen que determinada fotografía no cumple con los requisitos deseados.
Class: Image Nudity Filter
Vía / dzone

Descargas seguras mediante PHP

Interesante script que te ayudará si no quieres que la gente acceda directamente a tus ficheros para bajárselos. Para ello lo que hará será recoger un parámetro con el fichero que se quiere bajar, añadirle el path donde se encuentra y mediante la cabecera de la respuesta (header) devolver el fichero.

<?
$dir="/path/directorio/";
if (isset($_REQUEST["fichero"])) {
$fichero=$dir.$_REQUEST["fichero"];
header("Content-type: application/force-download");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize($fichero));
header("Content-disposition: attachment; filename=\"".basename($fichero)."\"");
readfile("$fichero");
} else {
echo "Fichero seleccionado";
}
?>

Si avanzáis en el artículo, veréis un caso más práctico con la base de datos.

File Download Security

Vía / Good PHP Tutorials

Expresiones regulares en PHP

Creo que uno de los mejores inventos en la programación son las expresiones regulares, en otra ocasión ya hemos hablado de ellas, pero esta vez os mostramos un enlace bastante interesante en el que se nos explica su uso en PHP.
Aunque no se trata solamente del uso de funciones, sino también una lista de recursos, como este manual de expresiones regulares en Perl, en el cual recomiendo el apartado sobre grupos no capturables (no los solemos usar pero creo que son fundamentables), y también nos habla de la diferencia entre expresiones regulares POSIX y compatibles con Perl.
Se trata de un primer artículo y al menos deberá haber uno más, que espero sea tan bueno como este.
The Joy of Regular Expressions [1]
The Joy of Regular Expressions [2] (actualización)
The Joy of Regular Expressions [3] (actualización)

10 cosas que probablemente no sepas de PHP

Cuando aprendemos un lenguaje (en este caso PHP) de forma autodidacta o parcialmente (un curso en la empresa), hay veces que usamos lo que conocemos porque con eso nos basta, pero no profundizamos más y nos encontramos con que hay cosas que desconocemos y que nos serían de utilidad. Por eso, el artículo que paso a traducir, nos puede ser de gran ayuda.

  • Usa ip2long() y long2ip() para guardar/recuperar las direcciones IP en la base de datos en vez de un string. Un string de 15 posiciones ocupa más espacio, cuanto menos llenemos la BD mejor que mejor.
  • Valida parcialmente la dirección de email con la función checkdnsrr(). Esta función comprueba que el dominio se corresponde a una dirección IP, así evitamos que se hayan enviado direcciones de correo con servidores erróneos. En el caso de que la validación de la existencia del email sea necesario.
  • Si usas PHP5 utiliza las funciones para acceso a MySQL mysqli_* en lugar de mysql_*, ya que están optimizadas.
  • Aprende lo que te ofrece el operador ternario (?:), te facilitará mucho el desarrollo y la comprensión del código una vez creado.
  • No reinventes la rueda, antes de meterte a hacer lo que ya está hecho, mira si existe en las librerías PEAR.
  • Usa highlight_file() cuando quieras formatear un texto como código PHP.
  • Deshabilita los logs de errores con error_reporting(0), a parte de ganar en rendimiento, evitas mostrar querys o paths de scripts. Yo personalmente recomendaría que te crearas un buen gestor de errores.
  • Usa gzcompress() y gzuncompress() para comprimir strings grandes para que no ocupen demasiado tamaño en la BD, por ejemplo en un campo BLOB.
  • Usa parámetros por referencia (&$param) para poder conseguir que la función te devuelva más valores a parte de que devuelve return.
  • Intenta comprender completamente las “magic quotes” para evitar que te ataquen mediante SQL Injection.

10 things you (probably) didn’t know about PHP.

Vía / dzone

Mejora el rendimiento de PHP

Unos consejos interesantes sobre cómo mejorar el rendimiento de tus páginas cuando usas PHP.

  • Caché de objetos: cada vez que llamas a una página se llama al compilador y se vuelve a procesar, aunque no haya cambiado. Si se cachean los objetos de PHP (parecido a lo que ocurre con JSP), la primera vez se compilaría y la siguiente se usaría la compilada. Una herramienta gratuita que nos permite realizarlo es Turck MMCache for PHP
  • Sistema de plantillas: se trata de una caché de contenido. Es útil cuando existe datos estáticos que se muestran más de una vez y no se quiere que se recargue. Los sistemas de caché también proveen una separación entre código y HTML, que no solo mejorará el rendimiento, sino que además hará más sencilla una futura actualización. La mayoría de los sistemas de plantillas para PHP está disponibles aquí: Smarty Templates, Pear Templates y PHP savant.
  • Sistema distribuido de caché de objetos: se trata de tener la mayoría de la BD en memoria, usando para ello memcached. Claro, que esto realmente puede ser poco útil en sitios que no tengan un elevado número de visitas.
  • Variables de PHP que se deben usar:
    variables_order = ‘GPC’
    register_argc_argv = ‘Off’
    register_globals = ‘Off’ (también útil para temas de seguridad)
    always_populate_raw_post_data = ‘Off’
    magic_quotes_gpc = ‘Off’
    A parte de desactivar los logs de errores, consumen tiempo y recursos y a parte si tienes un error no muestras información que quizás no quieras.
  • Comprensión de salida: mediante PHP, comprimimos la salida usando el formato zip. En esta posibilidad no estoy del todo de acuerdo, porque los recursos que se utilizan en la compresión pueden ser superiores a los que se usan para enviar la página, como ya indicamos en otra ocasión.

Fast PHP

Vía / dzone

Obtener información de páginas remotas con PHP

En ciertos momentos nos puede ser útil obtener información de páginas remotas, por ejemplo si tenemos un listado de páginas favoritas, pues obtener las palabras clave que tengan en el metatag, para poder clasificarlas con tags propias.

El proceso es sencillo mediante PHP, el problema es que algunos servidores, creo que pasa con DreamHost, no permiten el abrir ficheros de forma remota.

Primero debemos leer el fichero:

$url = "http://www.pagina.com/";
$fp = fopen( $url, 'r' );
$cont = "";
while( !feof( $fp ) ) {
$buffer = trim( fgets( $fp, 4096 ) );
$content .= $buffer;
}

Después podemos mirar cual es el título de la página:

$start = '<title>';
$end = '<\/title>';
preg_match( "/$start(.*)$end/s", $content, $match );
$title = $match[1]; 

Y por último obtener las metatags, usando para ello la función de PHP get_meta_tags, lo cual nos facilita el trabajo:

$metatagarray = get_meta_tags( $url );
$keywords = $metatagarray[ "keywords" ];
$description = $metatagarray[ "description" ];

Puedes verlo con una explicación más extensa en el artículo original.

Get Remote Web Page Information Using PHP

| | |

Laboratorio: acceder a contenido dinámico de forma estática (caché)

La verdad es que el título puede ser un tanto difícil de entender. Pero explicando que es lo que quiero decir, supongo que será fácil de entender. En este caso se trata totalmente de “laboratorio”, ya que es una idea que se me ha ocurrido y que su implementación puede que no se pueda necesitar, ya que se trataría de un ejemplo muy a la medida. Aunque bien pensado, se trata de una caché.

El problema de acceder a contenido dinámico (sobre todo pasa en Java) es sobrecargar el acceso a un mismo script (o JSP), a parte de que el acceso a contenido estático es mucho más rápido que el acceso a un contenido dinámico. El problema es cuando queremos acceder a contenido dinámico de forma estática.

Imaginemos un mapa tipo Google Maps, tenemos la Tierra totalmente vectorizada y dividimos el mapa en cuadrículas (x e y). Para acceder a una imagen queremos que sea de forma estática para agilizar la carga de la página y no sobrecargar el servidor, pero la imágen no se puede cargar porque no existe, se tiene que crear dinámicamente.

¿Cual es la solución?, controlar la página de error 404, para que cuando no exista la imagen que deseamos la cree y así la próxima vez ya podamos acceder a ella de forma estática.

Para ello tendremos que modificar el fichero .htaccess para que cuando no encuentre la imagen la cree y la devuelva.

ErrorDocument 404 /sentidoweb/imagenes-estaticas/createimage.php

Y tendremos que crear un script PHP para que cree la imagen y la devuelva. En este caso hemos añadido unas condiciones, y es que la imagen tiene que ser png y que tiene que tener el nombre con el siguiente formato (en expresión regular): /\d{1,2}_\d{1,2}\.png/ .

<?php
$url = $_SERVER["REQUEST_URI"];
// Si es una imagen PNG
if (preg_match("/\.png$/", $url)) {
$nombreImagen = substr($url, strrpos($url, "/")+1);
// Si el nombre de la imagen tiene el formato que deseo
if (preg_match("/^\d{1,2}_\d{1,2}\.png$/", $nombreImagen)) {
// Obtengo que imagen tengo que crear
$aux = substr($nombreImagen, 0, strlen($nombreImagen)-4);
$coords = split("_", $aux);
// Creo la imagen
header("Content-type: image/png");
$img = imagecreate(50, 50);
$cFondo = imagecolorallocate($img, 0, 133, 133);
$cTexto = imagecolorallocate($img, 255, 255, 255);
imagestring($img, 1, 5, 5,  '['.$coords[0].', '.$coords[1].']', $cTexto);
imagepng($img, $nombreImagen);
imagepng($img);
}
}
?>

Está claro que esto no funcionaría para nada si el contenido dinámico se actualiza con frecuencia.

Qcodo: otro framework de PHP

qcodo.pngYa hemos hablado en otras ocasiones sobre frameworks para PHP. La lista va aumentando e intentaremos comentaros los nuevos frameworks que vayan apareciendo.
En este caso se trata de Qcodo, cuya más importante característica es que ahorrará tiempo al desarrollador mediante el uso de la tecnología ActiveRecord, la cual generará código para la utilización de la BD automáticamente. Para ello se conectará a la BD y mediante ingeniería inversa generará el código necesario para usar la BD.
La verdad es que en las presentaciónes y demostraciones podemos ver cosas que hacen que este framework sea muy llamativo y nos haga cómodo el desarrollo.
Qcodo
Vía / Download Squad