Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] seguridad web

Estas en el tema de seguridad web en el foro de PHP en Foros del Web. CAPITULO 11 ANTI-SPAM Definicion spam Se llama spam, correo basura o mensaje basura a los mensajes no solicitados, no deseados o de remitente no conocido ...

  #61 (permalink)  
Antiguo 29/08/2013, 16:14
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

CAPITULO 11

ANTI-SPAM

Definicion spam

Se llama spam, correo basura o mensaje basura a los mensajes no solicitados, no deseados o de remitente no conocido (correo anónimo), habitualmente de tipo publicitario, generalmente enviados en grandes cantidades (incluso masivas) que perjudican de alguna o varias maneras al receptor. La acción de enviar dichos mensajes se denomina spamming.

Aunque se puede hacer spam por distintas vías, la más utilizada entre el público en general es la basada en el correo electrónico. Otras tecnologías de Internet que han sido objeto de correo basura incluyen grupos de noticias, usenet, motores de búsqueda, redes sociales, páginas web wiki, foros, web logs (blogs), a través de ventanas emergentes y todo tipo de imágenes y textos en la web.

Ademas de enviar spam de tipo publicitario existen otros tipos como el malicioso , intentar introducir mensajes con codigo malicios para infectar a los usuarios que accedan a ver dicho mensaje , por lo cual es una parcela que deberemos proteger, existen varias medidas voy a enseñar 4 de ellas , que se pueden usar en combinacion


1 Creamos un nuevo campo en el formulario y lo ocultamos con hidden

Código HTML:
Ver original
  1. <input type="hidden" value=""  name="comment">

1.1. Verificamos en la pagina de verificacion de los datos del formulario ( donde envio los datos el formulario ) que el campo no se relleno

Código PHP:
Ver original
  1. if( $_POST['comment'] !== '' )
  2. {
  3.  
  4. exit(' Comentario calificado como spam ');
  5.  
  6. }


eso es todo sobre este proceso , que simplemente dice que: si alguien rellena un campo oculto le bloqueo el acceso , por ende un usuario no deberia de ver ese campo ,mientras que un bot si lo vera y lo rellenara, esa es la trampa , aunque a dia de hoy pienso que este sistema ya no es muy efectivo.


2 Creamos un campo de texto y lo ocultamos como anteriormente pero lo ocultamos esta vez con css
Código HTML:
Ver original
  1. <input type="text" value=""  id="comment" name="comment" />

css:

Código CSS:
Ver original
  1. input#comment { display:none; }

o esta otra opcion que encontre en un blog hace poco.

Código CSS:
Ver original
  1. input#comment {
  2.  
  3.     overflow:hidden;
  4.     height:1px !important;
  5.     float:left !important;
  6.     margin:0 !important;
  7.     padding:0 !important;
  8. }

Para verificar usamos la misma verificacion que en el ejemplo 1


3 Usar captcha , el mas conocido es re-captcha , aqui os dejo el link para que lo probeis , tambien podeis realizar vuestros captchas os animo a que programeis vuestros propios catchas , eso si usa una buena logica.

4 Usaremos un buscador de palabras prohibidas en los comentarios



Código PHP:
Ver original
  1. function antispam($var){
  2.  
  3.  
  4.         $palabras = array(
  5.      
  6.         '1' => 'Gratis',
  7.         '2' => 'Gane' ,
  8.         '3' => 'dinero',
  9.         '4' => 'Ahorre',
  10.         '5' => 'ventas',
  11.         '6' => 'Sexo',
  12.         '7' => 'Promocion',
  13.         '8' => 'cobro',
  14.         '9' => 'Compre',
  15.         '10' => 'llame',
  16.         '11' => 'Viagra'
  17.      
  18.     );
  19.      
  20.     foreach ($palabras as $val )
  21.     {
  22.  
  23.     if(stristr(strtolower($var), $val) !== false)
  24.     {
  25.         return true;
  26.     }
  27.      
  28.     }
  29.      
  30.     return false;
  31.      
  32.     }
  33.      
  34.  
  35. // buscaremos en cualquier variable que queramos si existe alguna palabra de la lista
  36.  
  37. // verificamos usando la funcion
  38.  
  39.     if( antispam($_POST['mensaje']) === true )
  40.     {
  41.      
  42.     exit('comentario calificado como spam');
  43.      
  44.     }



Estas opciones y la funcion son tan solo ejemplos para entender el funcionamiento y comportamiento , puedes usar muchas otras funciones , cambiar las formas de hacer las cosas , lo importante no es copiar y pegar , si no que entiendas como funciona y creen sus propios sistemas.

Eso es todo sobre el capitulo 11 , te recomiendo hacer una combinacion de la opciones para conseguir detectar mas spam, si sabes otras maneras o mejorar lo expuesto o solo deseas mostrar tu opinion por favor exponlo.


Saludos nos vemos nuevamente con el capitulo 12.

1 - proteger directorios :link http://www.forosdelweb.com/f18/segur...ml#post4410846
2 - mensajes de error : link http://www.forosdelweb.com/f18/segur...ml#post4412140
3 - archivo de configuracion : link http://www.forosdelweb.com/f18/segur...ml#post4412159
4 - permisos y roles : link http://www.forosdelweb.com/f18/segur...ml#post4412275
5 - verificacion de archivos : link http://www.forosdelweb.com/f18/segur...ml#post4412596
6 - configuracion de sessiones : link http://www.forosdelweb.com/f18/segur...ml#post4416219
7 - session hijacking : link http://www.forosdelweb.com/f18/segur...ml#post4419281
8 - hash de contraseñas : link http://www.forosdelweb.com/f18/segur...ml#post4421471
9 - inyeccion sql : link http://www.forosdelweb.com/f18/segur...ml#post4451398
10 - cross site request forgery : link http://www.forosdelweb.com/f18/segur...ml#post4464062
  #62 (permalink)  
Antiguo 29/08/2013, 16:19
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: seguridad web

muchísimas gracias por tu talento, tiempo y energía para recopilar todo esto webankenovi.

saludos :D
__________________
Ayúdame a hacerlo por mi mismo.
  #63 (permalink)  
Antiguo 29/08/2013, 16:26
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

UPsss se me olvido poner el link de re-captcha

Re-captcha LINK :
http://www.google.com/recaptcha

@guardarmicorreo, gracias a ti , seguire intentando recopilar todo lo que pueda , ganas me sobran
  #64 (permalink)  
Antiguo 11/09/2013, 15:04
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

CAPITULO 12

FORMULARIOS

Mi intencion con lo detallado a continuacion es orientar , no copies , explora por ti mismo , los codigos podrian tener algun error y no son un aporte , falta parte de verificaciones que en este capitulo no se detallan , tan solo es un ejemplo .

A continuacion explicare el siguiente formulario y las medidas de seguridad que lleva.

Ejemplo formulario de login:

Código HTML:
Ver original
  1. <form action="validar.php?FDW=<? echo $_SESSION['TOKEN']; ?>" method="post">
  2.  
  3. <div id="login"><input type="text" value="k_username" name="k_username" required></div>
  4. <input type="hidden" value="" name="usuario" >
  5. <input type="text" value="Introduce tu comentario"  id="comentario" name="comentario" required>
  6.  
  7. <p>Usuario:<br>
  8. <input type="text" name="<? echo $_SESSION['FORMULARIO'][$_SESSION['TOKEN']]['USUARIO']; ?> " pattern="^[a-zA-Z0-9-_]{3,15}$" maxlength="15" size="15" required></p>
  9.  
  10. <p>Password:<br>
  11. <input type="password" name="<? echo $_SESSION['FORMULARIO'][$_SESSION['TOKEN']]['PASSWORD']; ?>" pattern="(?=^.{10,30}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" size="30" maxlength="30" required></p>
  12.  
  13. <input type="submit" value="Iniciar sesion" name="login" formenctype="application/x-www-form-urlencoded" >
  14.  
  15. </form>

Codigo fuente:

Código HTML:
Ver original
  1. <form action="validar.php?FDW=8ce3eaa2695cb5d2e7edab515dd9e8b7cd7d4278cf2681cb16b6443d105ba361/1378930760" method="post">
  2.  
  3. <div id="login"><input type="text" value="k_username" name="k_username" required></div>
  4. <input type="hidden" value="" name="usuario" required>
  5. <input type="text" value="Introduce tu comentario"  id="comentario" name="comentario" required>
  6.  
  7. <p>Usuario:<br>
  8. <input type="text" name="165414168" pattern="^[a-zA-Z0-9-_]{3,20}$" maxlength="20" size="20" required></p>
  9.  
  10. <p>Password:<br>
  11. <input type="password" name="847424868" pattern="(?=^.{10,20}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" size="20" maxlength="20" required></p>
  12.  
  13. <input type="submit" value="Iniciar sesion" name="login" formenctype="application/x-www-form-urlencoded" >
  14.  
  15. </form>

Se puede apreciar varias cosas , entremos en detalle.


PROCEDENCIA


Vamos a usar lo visto en el capitulo 10 cross site request forgery.

Creamos una session con un hash y tambien enviamos en el action por get el token y despues lo comparamos.
Código PHP:
Ver original
  1. <? $_SESSION['TOKEN'] = hash('haval256,5',rand(),false); ?>
  2.  
  3. <form action="validar.php?FDW=<? echo $_SESSION['TOKEN']; ?>" method="post">
  4.  
  5. <input type="submit" value="Iniciar sesion" name="login" formenctype="application/x-www-form-urlencoded" >

lado del servidor:

Verificamos de donde vino el usuario , donde la url deberia de ser la url de la pagina del formulario en este caso 'http://localhost/login/' .

Código PHP:
Ver original
  1. if( empty($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] === 'http://localhost/login/')
  2. {
  3.     header('location:index.php');
  4.     exit();
  5.  
  6.     // esta  verificacion no es segura el referer se puede modificar
  7. }
Verificamos el token y comprobamos si existen datos del formulario login

Código PHP:
Ver original
  1. if(!empty($_SESSION['TOKEN']) and !empty($_GET['FDW']) and $_GET['FDW'] === $_SESSION['TOKEN'])
  2. {
  3.     if(isset($_POST['login']) and $_POST['login'] === 'Iniciar sesion')
  4.     {
  5.         // CONTINUAMOS

PROTEGIENDO LOS CAMPOS CLAVE

Creamos una session con los campos clave del formulario , en el formulario no mostraremos ni user ni passwor mas bien numeros aleatorios que identifican al campo y lo relacionan con la session.

Código PHP:
Ver original
  1. $_SESSION['FORMULARIO'][$_SESSION['TOKEN']] = array(
  2.  
  3.     'USUARIO' => rand(1,9999999999),
  4.     'PASSWORD' => rand(1,9999999999)
  5.  
  6.     );

$_SESSION['FORMULARIO'][$_SESSION['TOKEN']] el token es el identificador de la session del formulario , para despues acceder a los datos no servira con un simple $_POST['user'] debera de ser $_SESSION['FORMULARIO'][$_SESSION['TOKEN']][$_POST['user']]


Código PHP:
Ver original
  1. <form action="validar.php?FDW=<? echo $_SESSION['TOKEN']; ?>" method="post">
  2.  
  3.     <p>Usuario:<br>
  4.     <input type="text" name="<? echo $_SESSION['FORMULARIO'][$_SESSION['TOKEN']]['USUARIO']; ?>" pattern="^[a-zA-Z0-9-_]{3,15}$" maxlength="15" size="15" required></p>
  5.  
  6.     <p>Password:<br>
  7.     <input type="password" name="<? echo $_SESSION['FORMULARIO'][$_SESSION['TOKEN']]['PASSWORD']; ?>" pattern="(?=^.{10,30}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" size="30" maxlength="30" required></p>
  8.  
  9.     <input type="submit" value="Iniciar sesion" name="login" formenctype="application/x-www-form-urlencoded" >
  10.  
  11.     </form>

lado del servidor:

Código PHP:
Ver original
  1. $user        = $_SESSION['FORMULARIO'][$_GET['FDW']]['USUARIO'];
  2. $password = $_SESSION['FORMULARIO'][$_GET['FDW']]['PASSWORD'];
  3.  
  4. if(!empty($_POST[$user]) and !empty($_POST[$password]))
  5. {
  6.     // CONTINUAMOS
  7.     // para acceder a los datos $_POST[$user] $_POST[$password] , $user y $password identifican el campo del formulario
  8. }
  9. else
  10. {
  11. // existe algun campo vacio o no es valido como null , 0 , false etc.......
  12. }

EXPRESIONES REGULARES

Solo se aceptaran usuarios con letras mayusculas/minusculas numeros y guion bajo _ y guion - minimo 3 caracteres y maximo 15 caracteres , este input es requerido.

pattern="^[a-zA-Z0-9-_]{3,15}$"

Código HTML:
Ver original
  1. <p>Usuario:<br>
  2. <input type="text" name="<? echo $_SESSION['FORMULARIO'][$_SESSION['TOKEN']]['USUARIO']; ?>" pattern="^[a-zA-Z0-9-_]{3,15}$" maxlength="15" size="15" required></p>

El password debe de contener al menos una mayucula una minuscula un numero un caracter especial y minimo 10 caracteres maximo 30 caracteres , este input es requerido.

pattern="(?=^.{10,30}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

Código HTML:
Ver original
  1. <p>Password:<br>
  2. <input type="password" name="<? echo $_SESSION['FORMULARIO'][$_SESSION['TOKEN']]['USUARIO']; ?>" pattern="(?=^.{10,30}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" size="30" maxlength="30" required></p>

Esta medida de seguridad es altamente saltable ya que se puede modificar el codigo html y saltarse la verificacion, por ello debemos verificar en el lado del servidor.

lado del servidor:

Código PHP:
Ver original
  1. if(!empty($_POST[$user]))
  2. {
  3.     if(strlen($_POST[$user]) >= 3 and strlen($_POST[$user]) <= 15)
  4.     {
  5.         if( preg_match('|^[a-zA-Z0-9-_]{3,15}$|', $_POST[$user], $coincidencias) !== 1 )
  6.         {
  7.             exit('usuario no valido');
  8.         }
  9.     }
  10.     else
  11.     {
  12.         exit('longitud no valida');    
  13.     }
  14. }
  15. else
  16. {
  17.     exit('debe de rellenar todos los datos');
  18. }
  19.  
  20.  
  21. if(!empty($_POST[$password]))
  22. {
  23.     if(strlen($_POST[$password]) >= 10 and strlen($_POST[$password]) <= 30)
  24.     {
  25.         if( preg_match('|(?=^.{10,30}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$|', $_POST[$password], $coincidencias) !== 1 )
  26.         {
  27.             exit('password no valido');
  28.         }
  29.     }
  30.     else
  31.     {
  32.         exit('longitud no valida');    
  33.     }
  34. }
  35. else
  36. {
  37.     exit('debe de rellenar todos los datos');
  38. }

ANTIBOTS

Ocultaremos campos como se hablo en el capitulo 11 , añadiendo un campo escondido en un div oculto.

Código CSS:
Ver original
  1. <style>
  2.  
  3. input#comentario,#login { display:none; }
  4.  
  5. </style>

Código HTML:
Ver original
  1. <div id="login"><input type="text" value="k_username" name="k_username" required></div>
  2.  
  3.     <input type="hidden" value="" name="usuario" >
  4.  
  5.     <input type="text" value="Introduce tu comentario"  id="comentario" name="comentario" required>
lado del servidor:

Código PHP:
Ver original
  1. if(empty($_POST['usuario']) and isset($_POST['comentario']) and $_POST['comentario'] === 'Introduce tu comentario' and !empty($_POST['k_username']) and $_POST['k_username'] === 'k_username' )
  2. {
  3.     // continuamos
  4. }
  5. else
  6. {
  7.     // bot
  8. }

Parte 2 A continuacion
  #65 (permalink)  
Antiguo 11/09/2013, 15:05
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

NUMERO DE INTENTOS

Bloquearemos al usuario si falla en 3 intentos

Código PHP:
Ver original
  1. if (empty($_SESSION['count']))
  2. {
  3.    $_SESSION['count'] = 1;
  4. }
  5. else
  6. {
  7.    $_SESSION['count']++;
  8. }
  9.  
  10. if($_SESSION['count'] > 3)
  11. {
  12.     // se deberia de crear un sistema que permita denegar el acceso durante un dia , horas , etc ...... a dicha ip
  13.     // para ello debemos guardar la ip y un campo por ejemplo acceso con valor concedido  o denegado y otro con la marca de tiempo
  14.     // despues al verificar los datos comprobamos si existe la ip en la tabla si existe y es denegado
  15.     // denegamos la verificacion , si no existe procedeemos a verificar los datos
  16.     // si se supera el numero de maximo de intentos guardamos la ip y  el campo acceso a denegado y una marca de tiempo
  17.     // ahora bien al verificar los datos comprobamos si existe la ip en la tabla si existe y es denegado tendremos que verificar si la marca de tiempo es menor
  18.     // por ejemplo denegamos 12 horas , pues verificaremos si la marca de tiempo es mayor a 12 horas de ser asi , borramos de la tabla los datos de dicha ip
  19.     // y volvemos a empezar otra vez todo el proceso , si la marca de tiempo es menor de 12 horas seguiremos bloqueandole el acceso.
  20.  
  21.     exit('Has superado el maximo numero de intentos');
  22. }


Espero que os sirva como he dicho anteriormete a orientaros estas opciones tan solo son ejemplos para entender el funcionamiento y comportamiento , puedes usar muchas otras funciones , cambiar las formas de hacer las cosas , lo importante no es copiar y pegar , si no que entiendas como funciona y creen sus propios sistemas.

Eso es todo sobre el capitulo 12 , si sabes otras maneras o mejorar lo expuesto o solo deseas mostrar tu opinion por favor exponlo.

1 - proteger directorios :link http://www.forosdelweb.com/f18/segur...ml#post4410846
2 - mensajes de error : link http://www.forosdelweb.com/f18/segur...ml#post4412140
3 - archivo de configuracion : link http://www.forosdelweb.com/f18/segur...ml#post4412159
4 - permisos y roles : link http://www.forosdelweb.com/f18/segur...ml#post4412275
5 - verificacion de archivos : link http://www.forosdelweb.com/f18/segur...ml#post4412596
6 - configuracion de sessiones : link http://www.forosdelweb.com/f18/segur...ml#post4416219
7 - session hijacking : link http://www.forosdelweb.com/f18/segur...ml#post4419281
8 - hash de contraseñas : link http://www.forosdelweb.com/f18/segur...ml#post4421471
9 - inyeccion sql : link http://www.forosdelweb.com/f18/segur...ml#post4451398
10 - cross site request forgery : link http://www.forosdelweb.com/f18/segur...ml#post4464062
11 - antispam : link http://www.forosdelweb.com/f18/segur...ml#post4493070

Este es mi ultimo capitulo , solo creare mas a peticion de no haber peticiones nos vemos nuevamente en una serie de aportes que realizare proximamente

saludos y gracias a todos los que han contribuido , gracias a todos los que lo han seguido .
  #66 (permalink)  
Antiguo 11/09/2013, 16:10
Avatar de macmaikel  
Fecha de Ingreso: agosto-2013
Mensajes: 25
Antigüedad: 10 años, 7 meses
Puntos: 5
Respuesta: seguridad web

Todos los años se actualiza la lista oficial de los 25 errores de programación mas peligrosos, podéis verla aquí:

http://cwe.mitre.org/top25/
  #67 (permalink)  
Antiguo 20/09/2013, 06:02
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

ULTIMO CAPITULO 13

CROSS SITE SCRIPTING ( XSS )


Creo este ultimo tema debido a que se me paso crear un tema sobre xss, pero bueno en este capitulo no aportare ningun codigo, añadire links que os serviran de utilidad ademas de funciones para solucionar el problema espero que os ayuden.

1 - Aporte de @GatorV

http://www.forosdelweb.com/f18/aport...ar-xss-948577/

2 - Aporte de seguridad @Triby


http://www.forosdelweb.com/f18/aport...a-php-1011808/

3 - Owasp

https://www.owasp.org/index.php/Cros...Scripting_(XSS)

4 - Wikipedia

http://es.wikipedia.org/wiki/Cross-site_scripting

5 - Google antixss

http://code.google.com/p/php-antixss/

6 - buscador foros del web

http://www.forosdelweb.com/search.ph...208859-1&q=xss


Eso es todo sobre el capitulo 13 , si sabes otras maneras o mejorar lo expuesto o solo deseas mostrar tu opinion por favor exponlo.


1 - proteger directorios :link http://www.forosdelweb.com/f18/segur...ml#post4410846
2 - mensajes de error : link http://www.forosdelweb.com/f18/segur...ml#post4412140
3 - archivo de configuracion : link http://www.forosdelweb.com/f18/segur...ml#post4412159
4 - permisos y roles : link http://www.forosdelweb.com/f18/segur...ml#post4412275
5 - verificacion de archivos : link http://www.forosdelweb.com/f18/segur...ml#post4412596
6 - configuracion de sessiones : link http://www.forosdelweb.com/f18/segur...ml#post4416219
7 - session hijacking : link http://www.forosdelweb.com/f18/segur...ml#post4419281
8 - hash de contraseñas : link http://www.forosdelweb.com/f18/segur...ml#post4421471
9 - inyeccion sql : link http://www.forosdelweb.com/f18/segur...ml#post4451398
10 - cross site request forgery : link http://www.forosdelweb.com/f18/segur...ml#post4464062
11 - antispam : link http://www.forosdelweb.com/f18/segur...ml#post4493070
12 - formularios : link http://www.forosdelweb.com/f18/segur...ml#post4499542

Etiquetas: seguridad, sistema, aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 10 personas




La zona horaria es GMT -6. Ahora son las 23:00.