lunes, 4 de mayo de 2015

[PHP] Creando una firma dinamica

Introduccion

Buenas he estado sin tiempo para postear pero en esta ocasion les mostraré como crear una firma dinamica de manera que obtengan algunos datos, muchos ya saben como realizarlo por que no tiene tanta dificultad mas que nada se trata de utilizar la libreria de PHP GD.

Un buen tutorial que recomiendo mucho sobre PHP GD es el siguiente: http://wiki.elhacker.net/programacion/php/libreria-gd el cual esta muy bien explicado.
Tratare de ser breve colocando solo los pasos.

Estructura a realizar

La estructura con la que trabajaremos sera la siguiente:


Explicando un poco que hace cada archivo.

.htaccess - Con este archivo interpretaremos imagenes png (con su extension .png) como archivos php y bloquearemos cualquier intento de acceso al archivo logs.txt

firma.php - Con este archivo generamos la imagen dinamica (pronto le cambiaremos la extension a .png)

KeepCalm-Medium.ttf - Es el tipo de letra que utilizaremos para la firma dinamica.

logs.txt - Aqui guardaremos los logs, en este caso IP, Sistema, Si usa proxy.

rVJgsdx.png - Es la imagen que utilizaremos para la firma dinamica. 

view_logs.php - Este es un archivo para ver los logs online. Con un simple formulario que tiene que ingresar una clave.

Nota importante: Nada de aqui es guardado en una base de datos. Y esto es facilmente explotable haciendo peticiones desde la misma IP un sin fin de veces cargaria todo el archivo logs.txt haciendolo demasiado pesado (Esa idea la hizo un amigo JhonJhon_123) entonces lo unico que podemos realizar en este caso es:

1.- Denegar las ips que realizen demasiadas peticiones
2.- No insertar IPS repetidas en el archivo logs.txt
3.- Cambiar el nombre de la carpeta para que no hagan mas peticiones.

Cualquiera de estos tres puntos no se ven en este tutorial.

Creando la firma

En este caso crearemos el archivo PHP para realizar la firma dinamica, no entrare en detalles de explicaciones ya que comente el codigo lo mas posible para que se entendiera, de todas maneras si no entienden algo, arriba deje una buena documentacion con la que pueden guiarse.

 <?php
 // no reportamos errores
 error_reporting(0);
 // el nombre de la imagen a poner como firma
 $im_name = "rVJgsdx.png";
 // los datos de la imagen
 $data_im = getimagesize($im_name);
 // el tipo de imagen
 header("Content-type: {$data_im['mime']}");
 // creamos la imagen en este caso png 
 $im = imagecreatefrompng($im_name);
 // creamos un color para usarlo en el texto
 $color = imagecolorallocate($im, 45, 196, 236);
 // obtenemos la IP
 $ip = $_SERVER['REMOTE_ADDR'];
 // obtenemos los datos del navegador
 $user_agent = $_SERVER['HTTP_USER_AGENT'];
 // vemos si existe algun proxy (no es 100% fiable), y lo agregamos a la variable ip
 $proxy_headers = array(
        'HTTP_VIA',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_FORWARDED',
        'HTTP_CLIENT_IP',
        'HTTP_FORWARDED_FOR_IP',
        'VIA',
        'X_FORWARDED_FOR',
        'FORWARDED_FOR',
        'X_FORWARDED',
        'FORWARDED',
        'CLIENT_IP',
        'FORWARDED_FOR_IP',
        'HTTP_PROXY_CONNECTION'
    );
    foreach($proxy_headers as $x){
        if (isset($_SERVER[$x])) {
         $ip .= "/Estas usando proxy!";
         break;
        }
    }

    // reemplazamos los datos del navegador en caso de que sea firefox por firefox o chrome por chrome, la lista es corta se pueden agregar mas
 $navegador = preg_replace('/.*(firefox|chrome).*/i', '$1', $user_agent);
 // lo mismo que arriba en este caso con el sistema, igual podemos hacer la lista personalizable
 $sistema = preg_replace('/.*(windows|mac|linux).*/i', '$1', $user_agent);
 // guardamos los datos en una variable para usarla en el texto
 $string = " Tu IP: $ip \n Tu navegador: $navegador \n Tu sistema: $sistema \n Te estoy vigilando!\n";
 // asignamos una variable con la fuente para usarla en el texto
 $fuente = "KeepCalm-Medium.ttf";
 // en caso de que no se haya detectado nada mostramos el navegador, aunque nos trolleen xD :P
 if($navegador == ''){
  $navegador = $_SERVER['HTTP_USER_AGENT'];
 }
 // what? :3, Guardamos logs
 $manejador = fopen("logs.txt", 'a+');
 fwrite($manejador, "$string\n\n\n");
 fclose($manejador);
 // magia is here! Mostramos el texto en las coordenadas dadas
 imagettftext($im, 10, 0, 300, 10, $color, $fuente, $string);
 // png transparency, para la transparencia en la imagen sino se veria desfigurada
 imagealphablending($im, true);
 imagesavealpha($im, true);
 imagepng($im);
 // destroy image, liberamos la memoria
 imagedestroy($im);
?>



Asignar formato a la imagen y denegar acceso a los logs

En este apartado crearemos el archivo .htaccess el cual denegara acceso a los logs y interpretara nuestro archivo png como php.

AddType application/x-httpd-php .png
<FilesMatch "\.(txt)$">
  Order Deny,Allow
  Deny from all
</FilesMatch>

Creando archivo para ver los logs

Por ultimo creamos nuestro archivo view_logs.php con el cual veremos los logs. 

 <?php
 if (isset($_POST['pass']) && !empty($_POST['pass']) && $_POST['pass'] == 'tucontraseñae.e') {
  $gestor = fopen('logs.txt', 'r');
  $contenido = fread($gestor, filesize('logs.txt'));
  fclose($gestor);
  echo "<pre>" . $contenido . "</pre>";
 }
?>
<form method="post" action="">
 <p><input type="text" name="pass" /></p>
 <p><input type="submit" name="enviar" /></p>
</form>

En este caso solo hay que cambiar tucontraseñae.e por la contraseña que le quieras asignar a la entrada.

Finalizando

Le cambiamos la extension al archivo firma.php y le ponemos el nombre que queramos en mi caso firma.png
Lo abrimos en el navegador para ver los resultados.


En este caso mi ip es ::1 ya que es una ip local.

Les dejo por ultimo los archivos por si quieren probarlo, igual pueden realizar el suyo propio cambiando algunas funciones como dependiendo del tipo de imagen que sea JPEG, PNG, etc. el tipo de letra, sus datos, etc. De igual manera con esto podrian crearse hasta generadores de firmas, saludos!

Archivos: http://www.mediafire.com/download/wr4yeydjyoyc397/firma_dinamica.rar
 

2 comentarios: