Ver Mensaje Individual
  #13 (permalink)  
Antiguo 07/02/2008, 00:57
arturoruz
 
Fecha de Ingreso: febrero-2008
Mensajes: 2
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Crear sistema de codigo de seguridad

Hola a todos, mi nombre es Arturo Ruz alias "El susodicho"... como sea... un amigo me paso esta liga y aquí estoy trayendo conmigo lo que espero sea la solución a sus problemas...

Es un minimini-howto, y va de 5 pasitos...

PASO 1: Tener instalado en su sistema o servidor las extensiones necesarias para la creación de gráficos y el uso de sesiones.

Pueden utilizar para su desarrollo y pruebas, un paquetito muy bueno llamado XAMPP que trae preparado APACHE, PHP, MYSQL, FTPd, PERL, entre otras cosas, pero lo importante es que ya tiene configurado los módulos (extensiones) que requerirán para el uso correcto del script.

Una ves instalado PHP en su servidor o equipo, deberán crear un pequeño archivo nombrado ‘phpinfo.php’ que contenga ÚNICAMENTE la siguiente línea:

Código PHP:
<? 
phpinfo
(); 
?>
Ahora accedan a él ingresando a http://localhost/phpinfo.php y deberán ver listado las siguientes configuraciones:

Módulo GD
GD es un módulo que permite la manipulación de gráficos en diversos lenguajes, entre estos PHP.
gd
GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.1.9
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled

Módulo SESSION
Permite el uso de sesiones accediendo al array $_SESSION y funciones session_* de php.
(Ver http://php.mirror.camelnetwork.com/manual/en/ref.session.php para más información)
session
Session Support enabled
Registered save handlers files user sqlite
Registered serializer handlers php php_binary wddx

Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 4 4
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path C:\xampp\tmp C:\xampp\tmp
session.serialize_handler Php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid 0 0

Si han encontrado esta información, entonces podemos continuar con la explicación del script para generar códigos como imagen y validar este código por medio de un formulario de captura.

PASO 2: Vamos a crear un archivo nombrado ‘image.php’, el cual deberá tener la información del script:

Código PHP:
<?
if(!isset($_GET['key'])) { $n=rand(1000,9999); } else { $n base64_decode($_GET['key']); } 
     
    
// Se establece el cabecero del documento, en este ejemplo será del tipo Imagen GIF 
    // Nota: El archivo GIF tiene mejor compresión ;) 
    
header('Content-Type: image/gif'); 
    
// Se genera el área del gráfico 
    
$grafico imagecreate(7030); 
    
// El primer color establecido será el color de fondo 
    
$fondo imagecolorallocate($grafico000); 
    
// El siguiente color establecido será el color del texto 
    
$color imagecolorallocate($grafico255255255); 
    
// Se establece el margen inicial para cada caracter escrito 
    
$margen 5
    
// Se obtiene cada caracter de la cadena usando el loop for() 
    
for($x 0$x strlen($n); $x++) { 
        
// Se extrae la cadena usando la función substr() 
        
$c substr($n,$x,1); 
        
// La inclinación será 10 o -10 segun sea si el número de caracter es par o no 
        
if(($x 2)==0) { $rend 10; } else { $rend = -10; } 
        
// Se escribe el caracter en el gráfico 
        
imagettftext($grafico20$rend$margen22$color'musich.ttf'$c); 
        
// Se incrementa el margen del siguiente caracter a escribir, en caso de existir 
        
$margen += 16
    } 
    
// Se obtiene el gráfico para mostrar en el navegador 
    
imagegif($grafico); 
    
// Destruye la imagen creada liberando la memoria 
    
imagedestroy($grafico);
?>
PASO 3: Crearemos un pequeño formulario web donde pediremos un nombre de usuario, contraseña y por último que digiten el código en la imagen. El archivo lo nombraremos ‘mySecureWebForm.php’ y contendrá:

Código PHP:
<?
$mySecretNumber 
rand(10009999); // Generar número aleatorio...
$secretBase64Code base64_encode($mySecretNumber); // Codificar el número generado en BASE64
session_start(); // Iniciar sesión...
$_SESSION['mySecretNumber'] = $mySecretNumber// Guardar el número en la sesión...
?>
<html>
<head><title>My Secure Web Form</title></head>
<body>
<form action="process-form.php" method="post">
<label>Ingrese su nombre de usuario: </label><input type="text" name="Username" id="Username" /><br />
<label>Ingrese contraseña: </label><input type="password" name="Password" id="Password" /><br />
<?
    
// NOTA IMPORTANTE: "src" de <img> deberá llevar SIEMPRE el número codificado en el parámetro 'key'.
?>
<img id="imgCodigo" alt="" src="image.php?key=<?=$secretBase64Code?>" /><br />
<label>Ingrese los números impresos en la imagen:</label><input type="text" name="Codigo" id="Codigo" /><br />
<input name="btnSubmit" type="submit" value="&iexcl;Iniciar sesi&oacute;n!">
</form>
</body>
</html>
PASO 4: Crear el archivo de proceso y validación, este lo nombraremos ‘process-form.php’ y contendrá:

Código PHP:
<?
session_start
(); // Iniciar la sesión de usuario...
$theNumber $_SESSION['mySecretNumber']; // Recuperamos el número generado...

    // Ahora se valida que el formulario haya sido enviado correctamente...
    
if(!isset($_POST['Username']) || $_POST['Username']=='' || 
        !isset(
$_POST['Password']) || $_POST['Password']=='' || 
        !isset(
$_POST['Codigo']) || $_POST['Codigo']=='')
    {
        
// No se enviaron todos los campos, regresemos al formulario...
        
header('Location: mySecureWebForm.php');
    }

// Ahora validamos que el número digitado sea el mismo...
    
if(trim($_POST['Codigo'])!=$theNumber)
    {
        
// Error! no coinciden los números... volvemos al formulario...
        
header('Location: mySecureWebForm.php');
    }
?>
<html><head><title></title></head>
<body>
Tu nombre de usuario es: <?=$_POST['Username'];?><br />
El número de la imagen fue: <?=$theNumber?><br />
</body>
</html>
PASO 4: Hacer la prueba de que funcione ingresando a: http://localhost/mySecureWebForm.php

Eso es todo amigos…

P.D.: Esta documentación y los archivos citados en el minimini-howto pueden bajarlos de: w w w . dev-mexico . c o m / test-phpimage.zip (lo puse así porque no dejan poner links...)

Saludos,

J. Arturo Ruz C.
arturoruz at msn dot com ;)