You may ask what the Ambilight is and what is used for. If I’m right, please watch the next video:

In this entry you will learn to assemble and configure it by yourself at a very good price. NOTE that this post is “DO IT YOURSELF”, to put it in other words, would probably need some effort to finish it. But if you follow the instructions step by step, you won’t have any problem. And even if you have some problem, you can ask me in the comments! Continuar leyendo »

English version -> http://www.grabthiscode.com/diy/how-to-set-up-an-ambilight-system-in-home-and-not-die-trying

 

Te estarás preguntando que es eso del Ambilight y para que sirve. Como una imagen vale más que mil palabras, aquí te pongo el video para que puedas verlo.

En este post aprenderás a montarlo y configurarlo por ti mismo a un muy buen precio. Aclarar antes de todo que este post es “DO IT YOURSELF”, con eso quiero decir que si no te gusta cacharrear con estas cosas, quizás te cueste un poco. Pero si sigues los pasos al 100% vas a tenerlo 100% montado y funcional. Continuar leyendo »

A continuación os recopilo unas cuantas situaciones con las que es habitual toparse en el mundo de la seguridad informática.

La mayoría de ellas han sido sacadas de este maravilloso tumblr. Recomiendo leerlo de vez en cuando para echarse unas risas.

Comienzo con la que, en mi opinión, es una de las mejores:

Cuando recibo mi password en texto plano en el email de reinicio de contraseña

Plaintext password

Cuando la funcion “–is-dba” devuelve true

Continuar leyendo »

A causa de un cambio de trabajo (ahora me dedico a la Seguridad Informática) llevo un tiempo sin escribir por el blog. Hoy es un buen día para volver a escribir y qué mejor que dedicarlo al tema que inauguró Grabthiscode, la seguridad web.

En la primera y segunda parte aprendiste a mantener tu web segura de vulnerabilidades a nivel de servidor y a nivel de cliente a un nivel básico. En esta tercera aprenderás un “nuevo” tipo de vulnerabilidad muy de moda (incluso Google la sufrió en Gmail) y algún que otro consejo que nunca viene mal.

Antes de empezar con el tema quiero dejar claro que NO soy un experto en seguridad informática (quizás algún día…), estoy empezando en este mundo y poco a poco voy aprendiendo sobre este tema. En mi trabajo me han recomendado este libro para aprender todo lo relacionado con la seguridad web. Te lo recomiendo encarecidamente si te interesa este mundo o si eres un desarrollador web que se preocupa por la seguridad de sus aplicaciones.

Ya dejo de enrollarme y empiezo con lo que de verdad importa:

CSRF o Cross Site Request Forgery

¿En que consiste el CSRF? 

Imagina que en tu web tienes un formulario que envía los datos a una web.php. Imagina que ese formulario sirve para cambiar la password del usuario logueado y que para cambiarla solo necesitas estar logueado (nunca hagas un cambio de contraseña así, asegúrate de pedir contraseña actual SIEMPRE). Ahora imagina que yo creo un link (si el formulario es GET) o una imagen (si es post, sí, puedes insertar código en una imagen…) y se la paso a un usuario que use tu apliación. Ese usuario hace click en el link o abre la imagen sin darse cuenta de lo que está pasando internamente.

¿Lo vas pillando? Al ejecutar esa acción, el usuario ha cambiado su contraseña por otra que tú has elegido. Y sí, es una vulnerabilidad de parte del cliente, no del servidor. Pero es una vulnerabilidad grave. Sino busca por Google que les pasó con su sistema de cambio de contraseña de las cuentas…

Vale, lo entiendo pero…¿Cómo puedo evitarlo?

Una vez entendido el problema, hay mil formas de evitarlo. La más común y “segura” es incluir un token como campo oculto en cada formulario, que vaya enlazado con la sesión y que solo sea válido una vez durante un tiempo determinado.

Una vez envías el formulario, el servidor se encargará de recibir ese token, y comprobar si es válido y si no ha sido usado anteriormente. Con eso evitas que un atacante te prepare un enlace o una imagen con código incrustado.

Muy bien, la parte teórica la entiendo, pero ¡dónde está mi código para copiar y pegar?

anti CSRF   
  1. <?php
  2.  
  3. function generarToken($formulario)
  4. {
  5. $salt = "[email protected]";
  6. // genera token de forma aleatoria
  7. $token = md5(sha1($salt).md5(uniqid(microtime(), true)));
  8. // genera fecha de generación del token
  9. $tokenTime = time();
  10. // escribe la información del token en sesión para poder
  11. $_SESSION['AntiCsrf'][$formulario.'_token'] = array('token'=>$token, 'time'=>$tokenTime);
  12. return $token;
  13. }
  14.  
  15. function validarToken($formulario,$token,$time=0)
  16. {
  17. if(!isset($_SESSION['AntiCsrf']['cambiarPassword_token']))//no existe el token en la sesion
  18. return false;
  19. if($token != $_SESSION['AntiCsrf']['cambiarPassword_token']['token'])//el token almacenado en la sesion no es el mismo que el recibido
  20. return false;
  21. if($time > 0){//solo en caso que quieras que el token caduque cada cierto tiempo
  22. $token_edad = time() - $_SESSION['AntiCsrf'][$formulario.'_token']['time'];
  23. if($token_edad >= $time){
  24. return false;
  25. }
  26. }
  27. unset($_SESSION['AntiCsrf'][$formulario.'_token']);//opcional, borrar el token de la sesion
  28. return true;
  29. }
  30.  
  31. if(isset($_POST['NuevaPassword']))//cambiamos contraseña
  32. {
  33. $token = $_POST['token'];
  34. $tokenValido = validarToken('cambiarPassword',$token);
  35. if($tokenValido)
  36. {
  37. //proceder con el cambio de contraseña
  38. }
  39. }
  40.  
  41. ?>
  42.  
  43. <form action="." method="POST" name="cambiarPassword">
  44. <input type="hidden" name="token" value="<?php generarToken('cambiarPassword'); ?>" />
  45. <input type="NuevaPassword" name="pass" />
  46. <input type="submit" value="Cambiar" />
  47. </form>

Con todo esto ya estarás protegido contra este tipo de ataques.

Por último un consejo, esta vez sobre SQLi; siempre añade a cada variable que uses en el sql las comillas simples <‘>. ¿Cuál es la razón de esto?

Incluso la famosa función “mysql_real_escape_string” es vulnerable a inyección de SQL si no usas las comillas simples para la variable que le has pasado a mysql_real_escape_string.

Un ejemplo:

sqli   
  1. mysql_query("select * from myTable where id=".mysql_real_escape_string($id));

Es cierto que mysql_real_escape_string ayuda a proteger de las inyecciones de mysql, pero al no usar la variable entre comillas simples, un atacante podría escribir en $id:

 

  1. $id="1;delete from myTable;"

Protegerte de este tipo de ataque es tan simple como usar la variable entre comillas simples:

  1. mysql_query("select * from myTable where id='".mysql_real_escape_string($id)."'");

 

 

Y esto es todo por hoy, espero que estos consejos te sirvan para tener un poco más de seguridad en tu apliación web.

Saludos!

Con la llegada de HTML5 llegaron muchas etiquetas que causaron emoción entre los desarrolladores, una de ellas es <audio>. Esta nueva etiqueta nos permite reproducir archivos de audio sin demasiadas complicaciones, unas cuantas lineas de código y tendremos listo un buen reproductor totalmente en HTML5.

Continuar leyendo »

codemotion

La vamos a liar parda!

Así dicen los organizadores de este evento en su página web. Y no es para menos, pues es la primera vez que se celebra CodeMotion en España (y en paralelo en Italia).

Codemotion es un evento organizado por las comunidades, para las comunidades. Cada grupo es responsable de organizar su propio Call For Papers, y llegado el momento se confeccionará el calendario final con las charlas seleccionadas por cada comunidad.

Este evento es una oportunidad única para mezclar en un mismo recinto comunidades como Java, Rails, JavaScript o Agile.

El evento consta de 7 tracks en paralelo de charlas… pero también hay un track para talleres. Puedes ver la programación aquí. Cada charla tiene un nivel de “conocimientos” requeridos para poder sacarle jugo, por lo que cualquiera aunque no tenga un buen nivel en todo podrá accedar a algunas de las charlas. Lamentablemente las entradas se agotaron a los pocos días de estar a la venta (10€ con cafe y almuerzo incluidos).

De entre las charlas más interesantes (para mi) se encuentran:

Se puede ver como el tema del momento son las tecnologías para aplicaciones móviles junto con el no tan nuevo HTML5. Lo cuál es normal viendo el auge de los smartphones en estos dos últimos años.

Intentaré asistir a todas las charlas y tomar nota para luego contártelo en sucesivos posts! GrabThisCode no tiene la cobertura que un blog como Xataka puede dar a este tipo de eventos (en este caso genbetadev.com) pero durante el evento prometo subir fotos y comentarios a la cuenta de twitter de GrabThisCode.

Si por otra parte tu también tienes pensado asistir, no dudes en enviar tus comentarios y fotos al blog, así entre todos podemos hacer una buena recopilación del evento.

Nos vemos en Madrid y recuerda, La vamos a liar parda!

Adblock plus

Si has llegado a esta entrada por Google, sabrás muy bien que es Adblock Plus. Si aun no lo sabes no te preocupes, pues voy a dar una pequeña explicación sobre este addon tan popular en Mozilla Firefox y en Google Chrome.

Adblock Plus es un plugin que bloquea la publicidad de las páginas webs. Permite definir filtros personalizados o incluso usar algunas listas ya creadas para bloquear los anuncios. Además de añadir sitios webs a una “lista blanca” (white list) dónde no será bloqueada su publicidad.

Continuar leyendo »

Hace unos días discutía con un compañero de trabajo sobre el uso de In e Inner Join en nuestras aplicaciones web. Yo siempre he sido de usar in porque me resulta mucho más fácil hacer consultas complejas usando esta cláusula, pero desconozco si es menos eficiente que inner join.

Continuar leyendo »

Existen muchos plugins para crear campos con autocompletan según el texto ingresado, pero muy pocos con tantas opciones como el desarrollado por la gente de Oslund.

El plugin es muy liviano, ocupa apenas 3.2Kb en su versión simplificada y comprimida. Permite instancias múltiples, control por medio del teclado, y un detalle muy interesante es que retorna no solo el valor sino también el ID del elemento seleccionado.

Continuar leyendo »

En primer lugar y tras un tiempo de “descanso” (que en realidad no es descanso, sino falta de tiempo) prometo retomar el blog semanalmente con códigos que sean útiles y terminar el curso de django como muchos me habéis pedido. Además dentro de unos días se unirá un compañero de trabajo bastante experimentado en las plataformas de Android e i-Phone.

Después de este breve offtopic vamos con la entrada de hoy:

Cómo cargar archivos javascript en paralelo y elegir el orden de ejecución.

Hace unos días en el trabajo tuve que mejorar el tiempo de carga de una aplicación web hecha casi íntegramente en javascript, en concreto en extJs (más adelante pondré algún ejemplo de como usar este framework). El problema era, al estar hecha en js, que la carga de todos esos js se hacía pesada y lenta. Buscando por google encontré un par de bibliotecas que ayudaban a optimizar esta carga. Head.js y Require.js (ésta última de jQuery). Como require.js me dio problemas al usarla, me decanté por Head.js.

Continuar leyendo »