|

Listas de correo con PHP y AJAX

En SitePoint siempre sacan algún tutorial útil y que nos puede facilitar mucho nuestros desarrollos. En este caso se trata de listas de correos, quizás con el tema de las feeds, ya no se usen mucho, pero conozco a unos cuantos que aún tiran de ellas.

A grandes rasgos se trata de lo siguiente:

  • Un HTML dentro de un PHP que recibe las direcciones de correo de los usuarios.
  • Un Javascript que leerá cada cierto tiempo el formulario y realizará una llamada AJAX al servidor con la dirección de correo introducida.
  • Un script PHP que recibe la dirección, comprueba si es correcta, la almacena en la base de datos y manda un mensaje de que todo ha ido bien o de que ha habido error a la página web para que la muestre al usuario.

Use AJAX and PHP to Build your Mailing List

Lista de librerías de manipulación de imágenes en PHP

Según la Ley del Mínimo Esfuerzo, no hagas lo que ya han hecho otros, y en este caso, si estás interesado en manipulación de imágenes mediante PHP, te puede interesar esta lista de librerías o scripts para la manipulación de imagenes mediante PHP.

  • GD image resize transparent gif: script para cambiar el tamaño de un GIF transparente usando GD.
  • Image Thumb: crear miniaturas (thumbnails).
  • phpThumb(): permite crear miniaturas de nuestras imágenes, exportando a distintos formatos y pudiendo aplicar diversos filtros.
  • GDGraph: crea gráficas de barra, pastel.
  • PanaChart: gráficas en menos de 2 Kb. y en menos de 20 ms.
  • OIC: conversor de formatos de imágenes.
  • PHPaint: crea botones dinámicamente.
  • GraPHPico: genera graficos en formato .PNG, actualmente existen los estilos Porcentaje, Barras y Pastel.
  • GD- Sombras: crea textos con sombras.
  • JpGraph: completísima utilidad para la creación de gráficos.
  • PHPGD: recursos para la manipulación y creación de imágenes con PHP y GD.
  • Unsharp Mask for PHP: máscara unsharp para imágenes.
  • PHPLOT: una ‘biblioteca’ para generar todos tipo de gráficos sobre estadísticas varias. (Gracias alidhaey)

En Sentido Web

| | |

Laboratorio: carga de combos

Ayer nos preguntaban cómo cargar combos según lo que se seleccione en otro combo, y aunque no me quedó muy claro la duda que tenía, pues para intentar ayudarle, voy a explicar cómo hacerlo mediante tres posibilidades.

Primeramente explicaremos cómo hacerlo mediante el uso de iframes ocultos. Sí, no es nada web 2.0, pero no a todo el mundo se le da bien el desarrollo web, o no le gusta el uso de Ajax, o simplemente, como me pasa a mí, no nos dejan usar Ajax en los desarrollos del cliente (¡vete a saber por qué!).

Después lo haremos mediante Ajax (¡viva la web 2.0!), pero instanciando nosotros mismos el objeto XMLHttpRequest, para que los conceptos de Ajax no se pierdan dentro del uso de librerías, es importante conocer la base para luego usar una librería que te lo haga todo más fácil.

Y por último, ya no solo en plan web 2.0, sino en plan lo último de lo último, lo haremos usando la librería Prototype. Que la verdad sea dicha, no se trata de reinventar la rueda.

Read More “Laboratorio: carga de combos”

|

Internacionalización mediante PHP

Yo creo que el hecho de usar multilenguaje en un sitio web puede ser algo muy importante, sobre todo si deseas que tenga bastante repercusión. En Sentido Web ya hay entradas que trata el tema del multi-idioma ya sea mediante Apache o aportando recursos.

Esta vez vamos a hablar sobre un método que nos muestran en PHPBuilder. Se trata de tener varios ficheros para almacenar los textos traducidos, un fichero para cada idioma admitido (en.php, es.php, fr.php, de.php …) en el cual tendremos un array que contendrá código-traducción. En este caso, también hay un array para las imágenes, por si hay botones con texto que son realmente imágenes:

<?php
// Textos a traducir
$dicc['text'] = array (
'welcome' => 'Bienvenidos',
'thanks' => 'Gracias por participar',
...
);
// Imágenes especificas para idiomas
$dicc['imgsrc'] = array (
'title' => 'graphics/title.es.png',
'footer' => 'graphics/footer.es.jpg',
..
);
?>

Ahora solo falta obtener el idioma o asignar uno por defecto, importar el script específico del idioma seleccionado y usarlo.

// Buscamos si el idioma está especificado en la URL
if (isset($_GET['lang'])) {
// Si lo está, lo introducimos en una coockie para tenerlo la próxima vez
$lang = $_GET['lang'];
setcookie('lang', $lang, time()+(3600*24*365));
} else if (isset($_COOKIE['lang'])) {
// Miramos si lo está en una cookie
$lang = $_COOKIE['lang'];
} else {
// Por defecto en inglés
$lang = 'en';
}
// Obtenemos las traducciones
require_once "{$lang}.php"
echo $dicc['text']['welcome'];

Claro, que a parte de un diccionario/traductor se puede usar un directorio específico para cada idioma que contenga el contenido en ese idioma. Por ejemplo en un sitio de noticias no puedes tener un diccionario para introducir todo el texto de la noticia.

Afortunadamente los frameworks actuales como Seagull ya nos ofrencen módulos que nos facilitan esta labor.

Localizing a Web Page for Different Languages

Vía / dzone

|

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)