viernes, 6 de abril de 2007

Captcha seguridad y evitar spam

En muchas ocasiones cuando tienes un formulario en tu página web de registro, login, para poner comentarios, etc. es muy recomendable utilizar este sistema de seguridad para evitar altas fraudulentas, spam en los comentarios y diversos ataques.


Este sistema consiste en una imagen que contiene una secuencia de caracteres aleatorios. El usuario debe introducir esa secuencia en una caja de texto paranconfirmar que no se trata de un robot. Estas imágenes se presentan ligeramente distorsionadas y son realmente difíciles de capturar por un robot.


A continuación el código del captcha.php fichero que nos devuelve una imagen para verificar en el formulario.



<?php
/*
Iniciamos la sesión. Esto se utiliza para el envio de variable de sesión.
Mediante las variables de sesión enviamos la cadena de 5 caracteres que el
usuario debe introducir en el formulario para verificar que no se trata de
un robot.


Si quieres saber más sobre sesiones visita:
http://www.php.net/manual/es/ref.session.php
*/
session_start();
/*
Creación de una cadena aleatoria a partir de las funciones de fecha de php.
La función md5() retorna una cadena de 32 caracteres alfanuméricos, mediante el algoritmo de encriptación md5.
*/
$md5 = md5(microtime() * mktime());
/*
Para este ejemplo sólamente necesitamos 5 caracteres de los 32 que genera la función md5() por lo tanto escojemos los 5 primeros caracteres de la cadena.
*/
$string = substr($md5,0,5);
/*
A continuación creamos una imagen a partir de un fondo que hemos subido previamente al servidor. Generalmente este fondo se encuentra distorsionada.
*/
$captcha = imagecreatefrompng("./captcha.png");
/*
Editamos los colores de la imagen, tanto de los caracteres y de las líneas
*/
$color_letras = imagecolorallocate($captcha, 0, 0, 0);
$color_lineas = imagecolorallocate($captcha,255,0,0);


/*
Añadiremos unas cuantas líneas a nuestra imagen para evitar que que los robots lean el contenido de la imagen.
*/
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
/*
Ahora escribimos la cadena generada aleatoriamente en la imagen
*/
imagestring($captcha, 5, 20, 10, $string, $color_letras);
/*
Encriptamos la variable de sesión con la función md5() y la establecemos como una variable de sesión, para poder verificarla al enviar el formulario.
*/
$_SESSION['codigo_verificacion'] = md5($string);
/*
Devolvemos la imagen para mostrarla en el formulario.
*/
header("Content-type: image/png");

imagepng($captcha);
?>


A continuación presentamos el archivo que verifica si el código introducido
es correcto o no: comprobar.php



<?php
session_start();


if(md5($_POST['codigo']) != $_SESSION['codigo_verificacion']){
/*
Parte del programa que se ejecuta si la el código no es correcto.
*/
} else {
/*
Trozo de código que se ejecuta si la confirmación se realiza con

éxito.
*/
}
?>


Por último tienes que insertar un formulario del estilo:

el archivo 'formulario.html'


<form action="comprobar.php" method="post">
<table width="500"><tr><td>
<tr><td><b>Nombre: </b></td><td><input type="text" name="nombre" size="20" maxlength="30"></td></tr>
<tr><td><b>Email: </b></td><td><input type="text" name="email" size="20" maxlength="100"></td></tr>
<tr><td><b>Comentario: </b></td><td><input type="text" name="comentario" size="20" maxlength="200"></td></tr>
</table>
<p align="center">
<b>*Código de confirmación:</b> <img src="captcha.php" /> <input type="text" name="codigo" size="10">
</p>
<br><br>
<input type="reset" value=" Borrar "> <input type="submit" value=" Enviar ">
</form>

domingo, 4 de marzo de 2007

Mostrar cadenas

La sentencia para mostrar una o varias cadenas en php es echo. Con esta sentencia podemos mostrar todos los datos de nuestro programa de la siguiente forma:
echo "Esto es un ejemplo";

//O también
$nombre= "Pepito";
echo "Hola $nombre";
?>

Pero si lo que realmente queremos es darle un formato a la salida de los datos tendremos que usar printf() o sprintf(). La única diferencia entre estas dos funciones es que printf vuelca la cadena con formato, mientras que sprintf solo da formato, sin volcarlo, con lo cual podemos almacenarlo en una variable.

El significado del patrón depende del caracter final (especificador):

Un indicador de tipo que especifica el tipo bajo el que deben tratarse los datos del argumento. Los posibles tipos son:

% - un caracter de porcentaje literal. No requiere argumento.
b - el argumento es tratado como un entero, presentado como un número binario.
c - el argumento es tratado como un entero, y presentado como el caracter con ese valor ASCII.
d - el argumento es tratado como un entero, y presentado como un número decimal (con signo).
e - el argumento es tratado como notación científica (p.ej. 1.2e+2).
u - el argumento es tratado como un entero, y presentado como un número decimal sin signo.
f - el argumento es tratado como un flotante, y presentado como un número de punto flotante (teniendo en cuenta la localidad).
F - el argumento es tratado como un flotante, y presentado como un número de punto flotante (no tiene en cuenta la localidad). Disponible desde PHP 4.3.10 y PHP 5.0.3.
o - el argumento es tratado como un entero, y presentado como un número octal.
s - el argumento es tratado y presentado como una cadena.
x - el argumento es tratado como un entero y presentado como un número hexadecimal (con letras minúsculas).
X - el argumento es tratado como un entero y presentado como un número hexadecimal (con letras mayúsculas).

Ejemplos

$n = 43951789;
$u = -43951789;
$c = 65; // el valor ASCII 65 es 'A'

// note el doble %%, esto imprime un caracter '%' literal
printf("%%b = '%b'\n", $n); // representacion binaria
printf("%%c = '%c'\n", $c); // imprime el caracter ascii, igual que la funcion chr()
printf("%%d = '%d'\n", $n); // representacion de entero estandar
printf("%%e = '%e'\n", $n); // notacion cientifica
printf("%%u = '%u'\n", $n); // representacion entera sin signo de un entero positivo
printf("%%u = '%u'\n", $u); // representacion entera sin signo de un entero negativo
printf("%%f = '%f'\n", $n); // representacion en punto flotante
printf("%%o = '%o'\n", $n); // representacion octal
printf("%%s = '%s'\n", $n); // representacion de cadena
printf("%%x = '%x'\n", $n); // representacion hexadecimal (minusculas)
printf("%%X = '%X'\n", $n); // representacion hexadecimal (mayusculas)

printf("%%+d = '%+d'\n", $n); // indicador de signo en un entero positivo
printf("%%+d = '%+d'\n", $u); // indicador de signo en un entero negativo
?>


Para ver el artículo completo acude a la ayuda de php aquí

sábado, 3 de marzo de 2007

Listar archivos de tu servidor

Con esta función puedes hacer un listado de los archivos de una carpeta o directorio determinado. Este script muestra archivos pero no las carpetas.

function archivosAdmin($ruta)
{
if($dir = opendir($ruta))
{
chdir($ruta);
$archivos=array();
//Leer Todos los archivos
while (($archivo = readdir($dir)) !== false)
{
if(!is_dir ($archivo))//No es un directorio
array_push($archivos,$archivo);
}
//Mostrar Archivos
foreach($archivos as $aux)
echo "$aux";
//Cerrar Directorio
closedir($dir);
}
}

domingo, 18 de febrero de 2007

Conectar a BD con php

Para conectar a una BD en una página de tu sitio web tienes que colocar las siguientes sentencias.

<?php
$host='mysql.servidor.com'; //hostdel servidor
$usuario='codigophp'; //usuario que se conecta a la BD
$bd='codigophp_bd'; //BD seleccionada
$pass='codigo'; //Contraseña de la BD
//Conexion, seleccion de base de datos
$enlace = mysql_connect($host,$usuario,$pass) or die('Error: No pudo conectarse al servidor');
$db_selected = mysql_select_db($bd,$enlace) or die('Error: No pudo seleccionarse la BD');
?>



Claro que poner este trozo de código en todas las páginas de tu sitio web es un poco pesado y poco eficiente por lo que es preferible usar el siguiente sistema:

1º Introduces el código anterior en un fiechero llamado por ejemplo "conectar.php"
2º LLamas a este fichero cuando quieras conectar a la BD con la sentencia:

<?php
require('conectar.php');
?>

Esta forma es mucho más efectiva y te ayuda a no cargar de código tus url.