elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Sigue las noticias ms importantes de seguridad informtica en el ttwitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programacin
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  SuperCaptcha animada by WHK
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: SuperCaptcha animada by WHK  (Leído 4,240 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espritu


Ver Perfil WWW
SuperCaptcha animada by WHK
« en: 8 Enero 2011, 22:34 pm »

hace tiempo hize un sistema de captcha utilizando la clase gifencoder que estuve usando en algunos sistemas mios, pero quiero compartilo xD

demo:






descarga: http://test.drawcoders.net/captcha/captcha.zip

rutas:
Código:
C:\xampp\htdocs\captcha>tree /f
Listado de rutas de carpetas
El nmero de serie del volumen es 00000200 BAEF:7637
C:.
│   index.php

└───includes
        captcha_fuente(bad).ttf
        captcha_fuente(beatnik).ttf
        captcha_fuente(belweb).ttf
        captcha_fuente(BERTRAMN).ttf
        captcha_fuente(butch).ttf
        captcha_fuente(cadellin).ttf
        captcha_fuente(candles).ttf
        GIFEncoder.class.php

captcha.php
Código
  1. <?php
  2. $captcha = new captcha();
  3.  
  4. if((int)$_GET['seg'] == 0){
  5. $captcha->mostrar(0);
  6. }elseif((int)$_GET['seg'] == 2){
  7. $captcha->mostrar(2);
  8. }else{ /* 1 */
  9. $captcha->mostrar(1);
  10. }
  11.  
  12. class captcha{
  13. var $dir_data;
  14.  
  15. function __construct(){
  16.  $this->dir_data = './includes/';
  17. }
  18.  
  19. function obtener_hash(){
  20.  return $_SESSION['CAPTCHA'];
  21. }
  22.  
  23. function establecer_hash(){
  24.   array('o','0','i','l','1','y','s','5','8','7','t','6','b','d','u','q','2','z'),
  25.   array('f','r','p','w','x','k','9','a','3','a','m','w','f','3','e','h','c','n'),
  26.   substr(sha1(time().rand(0,100)), 0, 4)
  27.  ));
  28.  $_SESSION['CAPTCHA'] = $hash;
  29.  return $hash;
  30. }
  31.  
  32. function color_azar($handle){
  33.  return imagecolorallocate($handle, rand(0,255), rand(0,255), rand(0,255));
  34. }
  35.  
  36. function crear_frame($buffer, $fuente, $seguridad = 1){
  37.  /* Configuraciones */
  38.  $alto = 25;
  39.  $ancho = 160;
  40.  $lineas = 30;
  41.  
  42.  $handle = imagecreate($ancho, $alto);
  43.  
  44.  if($seguridad <= '1'){ /* Seguridad igual o menor a 1 */
  45.   $blanco = imagecolorallocate($handle, 255, 255, 255);
  46.   $negro  = imagecolorallocate($handle, 51, 51, 51);
  47.  }elseif($seguridad >= '2'){ /* Seguridad igual o mayor a 2 */
  48.   $blanco = imagecolorallocate($handle, rand(0, 255), rand(0, 255), rand(0, 255));
  49.   $negro  = imagecolorallocate($handle, rand(0, 255), rand(0, 255), rand(0, 255));
  50.  }
  51.  
  52.  /* Agrega las lineas */
  53.  if($seguridad >= '1'){ /* Seguridad igual o mayor a 1 */
  54.   for($cuenta = 1; $cuenta <= $lineas; $cuenta++){
  55.    imageline($handle, rand(0,$ancho), 0, rand(0,$ancho), 25, $this->color_azar($handle));
  56.   }
  57.  }
  58.  
  59.  imagettftext($handle, 20, 0, 22, 22, $negro, $fuente, strtoupper($buffer));
  60.  ob_end_clean(); /* Elimina la declaracin de inicio de buffers anteriores en el motor */
  61.  ob_start(); /* Comienza a capturar buffer */
  62.  imagegif($handle); /* Crea imagen */
  63.  $retorno = ob_get_contents(); /* Vuelca el contenido a la variable */
  64.  imagedestroy($handle); /* Libera memoria */
  65.  ob_end_clean(); /* Destruye el buffer */
  66.  return $retorno; /* Retorna el buffer de la imagen */
  67. }
  68.  
  69. function mostrar($seguridad = 1){
  70.  /* Seguridad va del 0 al 2 */
  71.  $string = $this->establecer_hash();
  72.  include($this->dir_data .'GIFEncoder.class.php');
  73.  $cantidad_frames = 10;
  74.  $fuente = glob($this->dir_data .'/captcha_fuente(*).ttf');
  75.  $fuente = $fuente[(int)rand(0, count($fuente) - 1)];
  76.  
  77.  for($cuenta = 0; $cuenta <= $cantidad_frames; $cuenta++){
  78.   $buffer = $this->crear_frame($string, $fuente, $seguridad);
  79.   $rutas_frames[$cuenta] = sys_get_temp_dir().'/'.md5(microtime().rand(10, 500)).'.gif';
  80.   file_put_contents($rutas_frames[$cuenta], $buffer);
  81.   unset($buffer);
  82.  }
  83.  
  84.  $gif = new GIFEncoder($rutas_frames, false, 0, 2, 0, 0, 0, 'url');
  85.  
  86.  foreach($rutas_frames as $eliminar){
  87.   @unlink($eliminar);
  88.  }
  89.  
  90.  header('Content-type: image/gif');
  91.  echo $gif->GetAnimation();
  92.  exit;
  93. }
  94.  
  95. }
  96.  
  97. ?>

GIFEncoder.class.php
Código
  1. <?php
  2. /*
  3. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4. ::
  5. :: GIFEncoder Version 2.0 by Lszl Zsidi, http://gifs.hu
  6. ::
  7. :: This class is a rewritten 'GifMerge.class.php' version.
  8. ::
  9. ::  Modification:
  10. ::   - Simplified and easy code,
  11. ::   - Ultra fast encoding,
  12. ::   - Built-in errors,
  13. ::   - Stable working
  14. ::
  15. ::
  16. :: Updated at 2007. 02. 13. '00.05.AM'
  17. ::
  18. ::
  19. ::
  20. ::  Try on-line GIFBuilder Form demo based on GIFEncoder.
  21. ::
  22. ::  http://gifs.hu/phpclasses/demos/GifBuilder/
  23. ::
  24. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  25. */
  26.  
  27. Class GIFEncoder {
  28. var $GIF = "GIF89a"; /* GIF header 6 bytes */
  29. var $VER = "GIFEncoder V2.05"; /* Encoder version */
  30.  
  31. var $BUF = Array ( );
  32. var $LOP =  0;
  33. var $DIS =  2;
  34. var $COL = -1;
  35. var $IMG = -1;
  36.  
  37. var $ERR = Array (
  38. ERR00=>"Does not supported function for only one image!",
  39. ERR01=>"Source is not a GIF image!",
  40. ERR02=>"Unintelligible flag ",
  41. ERR03=>"Does not make animation from animated GIF source",
  42. );
  43.  
  44. /*
  45. :::::::::::::::::::::::::::::::::::::::::::::::::::
  46. ::
  47. :: GIFEncoder...
  48. ::
  49. */
  50. function GIFEncoder (
  51. $GIF_src, $GIF_dly, $GIF_lop, $GIF_dis,
  52. $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod
  53. ) {
  54. if ( ! is_array ( $GIF_src ) && ! is_array ( $GIF_tim ) ) {
  55. printf ( "%s: %s", $this->VER, $this->ERR [ 'ERR00' ] );
  56. exit ( 0 );
  57. }
  58. $this->LOP = ( $GIF_lop > -1 ) ? $GIF_lop : 0;
  59. $this->DIS = ( $GIF_dis > -1 ) ? ( ( $GIF_dis < 3 ) ? $GIF_dis : 3 ) : 2;
  60. $this->COL = ( $GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1 ) ?
  61. ( $GIF_red | ( $GIF_grn << 8 ) | ( $GIF_blu << 16 ) ) : -1;
  62.  
  63. for ( $i = 0; $i < count ( $GIF_src ); $i++ ) {
  64. if ( strToLower ( $GIF_mod ) == "url" ) {
  65. $this->BUF [ ] = fread ( fopen ( $GIF_src [ $i ], "rb" ), filesize ( $GIF_src [ $i ] ) );
  66. }
  67. else if ( strToLower ( $GIF_mod ) == "bin" ) {
  68. $this->BUF [ ] = $GIF_src [ $i ];
  69. }
  70. else {
  71. printf ( "%s: %s ( %s )!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod );
  72. exit ( 0 );
  73. }
  74. if ( substr ( $this->BUF [ $i ], 0, 6 ) != "GIF87a" && substr ( $this->BUF [ $i ], 0, 6 ) != "GIF89a" ) {
  75. printf ( "%s: %d %s", $this->VER, $i, $this->ERR [ 'ERR01' ] );
  76. exit ( 0 );
  77. }
  78. for ( $j = ( 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) ), $k = TRUE; $k; $j++ ) {
  79. switch ( $this->BUF [ $i ] { $j } ) {
  80. case "!":
  81. if ( ( substr ( $this->BUF [ $i ], ( $j + 3 ), 8 ) ) == "NETSCAPE" ) {
  82. printf ( "%s: %s ( %s source )!", $this->VER, $this->ERR [ 'ERR03' ], ( $i + 1 ) );
  83. exit ( 0 );
  84. }
  85. break;
  86. case ";":
  87. $k = FALSE;
  88. break;
  89. }
  90. }
  91. }
  92. GIFEncoder::GIFAddHeader ( );
  93. for ( $i = 0; $i < count ( $this->BUF ); $i++ ) {
  94. GIFEncoder::GIFAddFrames ( $i, $GIF_dly [ $i ] );
  95. }
  96. GIFEncoder::GIFAddFooter ( );
  97. }
  98. /*
  99. :::::::::::::::::::::::::::::::::::::::::::::::::::
  100. ::
  101. :: GIFAddHeader...
  102. ::
  103. */
  104. function GIFAddHeader ( ) {
  105. $cmap = 0;
  106.  
  107. if ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x80 ) {
  108. $cmap = 3 * ( 2 << ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 ) );
  109.  
  110. $this->GIF .= substr ( $this->BUF [ 0 ], 6, 7 );
  111. $this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap );
  112. $this->GIF .= "!\377\13NETSCAPE2.0\3\1" . GIFEncoder::GIFWord ( $this->LOP ) . "\0";
  113. }
  114. }
  115. /*
  116. :::::::::::::::::::::::::::::::::::::::::::::::::::
  117. ::
  118. :: GIFAddFrames...
  119. ::
  120. */
  121. function GIFAddFrames ( $i, $d ) {
  122.  
  123. $Locals_str = 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) );
  124.  
  125. $Locals_end = strlen ( $this->BUF [ $i ] ) - $Locals_str - 1;
  126. $Locals_tmp = substr ( $this->BUF [ $i ], $Locals_str, $Locals_end );
  127.  
  128. $Global_len = 2 << ( ord ( $this->BUF [ 0  ] { 10 } ) & 0x07 );
  129. $Locals_len = 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );
  130.  
  131. $Global_rgb = substr ( $this->BUF [ 0  ], 13,
  132. 3 * ( 2 << ( ord ( $this->BUF [ 0  ] { 10 } ) & 0x07 ) ) );
  133. $Locals_rgb = substr ( $this->BUF [ $i ], 13,
  134. 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) );
  135.  
  136. $Locals_ext = "!\xF9\x04" . chr ( ( $this->DIS << 2 ) + 0 ) .
  137. chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . "\x0\x0";
  138.  
  139. if ( $this->COL > -1 && ord ( $this->BUF [ $i ] { 10 } ) & 0x80 ) {
  140. for ( $j = 0; $j < ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ); $j++ ) {
  141. if (
  142. ord ( $Locals_rgb { 3 * $j + 0 } ) == ( ( $this->COL >> 16 ) & 0xFF ) &&
  143. ord ( $Locals_rgb { 3 * $j + 1 } ) == ( ( $this->COL >>  8 ) & 0xFF ) &&
  144. ord ( $Locals_rgb { 3 * $j + 2 } ) == ( ( $this->COL >>  0 ) & 0xFF )
  145. ) {
  146. $Locals_ext = "!\xF9\x04" . chr ( ( $this->DIS << 2 ) + 1 ) .
  147. chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . chr ( $j ) . "\x0";
  148. break;
  149. }
  150. }
  151. }
  152. switch ( $Locals_tmp { 0 } ) {
  153. case "!":
  154. $Locals_img = substr ( $Locals_tmp, 8, 10 );
  155. $Locals_tmp = substr ( $Locals_tmp, 18, strlen ( $Locals_tmp ) - 18 );
  156. break;
  157. case ",":
  158. $Locals_img = substr ( $Locals_tmp, 0, 10 );
  159. $Locals_tmp = substr ( $Locals_tmp, 10, strlen ( $Locals_tmp ) - 10 );
  160. break;
  161. }
  162. if ( ord ( $this->BUF [ $i ] { 10 } ) & 0x80 && $this->IMG > -1 ) {
  163. if ( $Global_len == $Locals_len ) {
  164. if ( GIFEncoder::GIFBlockCompare ( $Global_rgb, $Locals_rgb, $Global_len ) ) {
  165. $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
  166. }
  167. else {
  168. $byte  = ord ( $Locals_img { 9 } );
  169. $byte |= 0x80;
  170. $byte &= 0xF8;
  171. $byte |= ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 );
  172. $Locals_img { 9 } = chr ( $byte );
  173. $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
  174. }
  175. }
  176. else {
  177. $byte  = ord ( $Locals_img { 9 } );
  178. $byte |= 0x80;
  179. $byte &= 0xF8;
  180. $byte |= ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );
  181. $Locals_img { 9 } = chr ( $byte );
  182. $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
  183. }
  184. }
  185. else {
  186. $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
  187. }
  188. $this->IMG  = 1;
  189. }
  190. /*
  191. :::::::::::::::::::::::::::::::::::::::::::::::::::
  192. ::
  193. :: GIFAddFooter...
  194. ::
  195. */
  196. function GIFAddFooter ( ) {
  197. $this->GIF .= ";";
  198. }
  199. /*
  200. :::::::::::::::::::::::::::::::::::::::::::::::::::
  201. ::
  202. :: GIFBlockCompare...
  203. ::
  204. */
  205. function GIFBlockCompare ( $GlobalBlock, $LocalBlock, $Len ) {
  206.  
  207. for ( $i = 0; $i < $Len; $i++ ) {
  208. if (
  209. $GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } ||
  210. $GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } ||
  211. $GlobalBlock { 3 * $i + 2 } != $LocalBlock { 3 * $i + 2 }
  212. ) {
  213. return ( 0 );
  214. }
  215. }
  216.  
  217. return ( 1 );
  218. }
  219. /*
  220. :::::::::::::::::::::::::::::::::::::::::::::::::::
  221. ::
  222. :: GIFWord...
  223. ::
  224. */
  225. function GIFWord ( $int ) {
  226.  
  227. return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );
  228. }
  229. /*
  230. :::::::::::::::::::::::::::::::::::::::::::::::::::
  231. ::
  232. :: GetAnimation...
  233. ::
  234. */
  235. function GetAnimation ( ) {
  236. return ( $this->GIF );
  237. }
  238. }
  239. ?>


« Última modificación: 8 Enero 2011, 22:41 pm por WHK » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #1 en: 9 Enero 2011, 00:13 am »

Wow... muy lindo y muy bueno! :)

Código
  1. function obtener_hash(){
  2.  return $_SESSION['CAPTCHA'];
  3. }
  4.  
Lo que no entiendo es porque usas session_destroy que rompe todo, y porque no unset que ahi solo liberarias el captcha? Lo digo porque si hay una pagina con uso intensivo de $_SESSION agregar este script lo romperia :xD


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espritu


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #2 en: 9 Enero 2011, 00:31 am »

Wow... muy lindo y muy bueno! :)
Lo que no entiendo es porque usas session_destroy que rompe todo, y porque no unset que ahi solo liberarias el captcha? Lo digo porque si hay una pagina con uso intensivo de $_SESSION agregar este script lo romperia :xD

haces el formulario con la imgen y llamas solamente a la funcin mostrar() donde inicia sesin, esta funcin de php te crea un archivo temporal con los datos serializados.

al enviar el formulario se obtiene el valor de la imagen anterior con obtener_hash() y esto elimina el archivo temporal. se compara con $_POST del formulario y procesas lo que quieras, redireciconas o cargas algo o muestras algo.

si el texto falla mas abajo buelve a cargar la imgen y eso har que buelva a iniciar sesion con un nuevo hash :P

si no destruyera la sesin al momento de procesar la captcha entonces quedarias con tu directorio temporal con gigas de archivos basura sin eliminar como le pas a un amigo con un plugin de vbulletn. si no destruyes sesiones te quedas con los archivos temporales hechos.
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #3 en: 9 Enero 2011, 02:58 am »

Pero que pasa si llevaba otros datos antes de entrar al script que llama al captcha y los necesite despues. Tengo entendido que sesion_destroy los borra completamente :|
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espritu


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #4 en: 9 Enero 2011, 17:21 pm »

eso ya sera opcional porque si no lo hubiera puesto y no usas sesiones despues hubieras dicho que no destruyo la sesion y que soy hereje por destruir servidores xD
En línea

R@mi

Desconectado Desconectado

Mensajes: 11


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #5 en: 10 Enero 2011, 01:58 am »

 :rolleyes: genial

 ;-) ;-) ;-)
En línea

Si no haces click aca, entrare a tu casa mientras duermes, y te matar a ti y a tu familia
Si no te registras en mi foro, tambin.
Si te registraste, pero no aports, tambien.
Graphixx


Desconectado Desconectado

Mensajes: 1.336


Full Stack Developer


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #6 en: 5 Marzo 2012, 23:16 pm »

Alguien podria resubir el codigo, intente compilarlo con los archivos posteados y me retorna:

Warning: imagettftext() [function.imagettftext]: Could not find/open font in D:\_SERVIDOR2\www\chicamall\captchawhk\captcha.php on line 64

Warning: Cannot modify header information - headers already sent by (output started at D:\_SERVIDOR2\www\chicamall\captchawhk\captcha.php:64) in D:\_SERVIDOR2\www\chicamall\captchawhk\captcha.php on line 95
GIF89a 333! NETSCAPE2.0!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l!, Cڋ޼H扦ʶ L ĢL*̦ JԪj\l;
En línea

Nada tiene fin solo hay pequeas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espritu


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #7 en: 6 Marzo 2012, 13:23 pm »

Lo que te falta son los archivos ttf para crear los textos, puedes agregarle cualquier fuente de texto, solo debe tener el nombre  captcha_fuente(*).ttf

Mas tarde subo las fuentes.
De todas formas esa captcha es parte de mi framework, si quieres te puedo dar el framework completo para que le des un vistazo y te doy unos ejemplos de como usar la captcha. Solo debes solicitarlo ac:
http://whk.drawcoders.com/foro/index.php/board,50.0.html

Y me posteas lo que necesitas hacer y te escribo un par de ejemplos ahi mismo.
En línea

Graphixx


Desconectado Desconectado

Mensajes: 1.336


Full Stack Developer


Ver Perfil WWW
Re: SuperCaptcha animada by WHK
« Respuesta #8 en: 7 Marzo 2012, 02:15 am »

Gracias compa ya me registre por aya por drawcoders, quedo atento al Frame pa observar el code del captcha.
En línea

Nada tiene fin solo hay pequeas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
imagen animada en un picture box
Programacin Visual Basic
krisar 4 4,459 Último mensaje 17 Junio 2005, 16:10 pm
por Martn Fierro
hacer una firma animada como la mia Ver0.1
Diseo Grfico
p1r4t0s 1 3,148 Último mensaje 17 Septiembre 2011, 18:30 pm
por elquenosabe
Videotutoriales- Firma animada
Diseo Grfico
Razor179 1 1,544 Último mensaje 8 Agosto 2014, 02:02 am
por portaro
Simulacin grfica animada
Java
niano 5 1,932 Último mensaje 7 Julio 2019, 17:26 pm
por niano
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines