Cómo protegerme de de ataques cibernéticos

Los ataques cibernéticos, o ciberataques, consisten en una seria de acciones cuyo objetivos son destruir o comprometer los sistemas informáticos de una organización. También puede tener como objetivo el acceso ilegal o robo masivo de datos personales, en este caso se denomina cibervigilancia.

Estas acciones delictivas se han vuelto cada día más frecuentes debido a la mayor presencia que tienen las empresas los gobiernos y los ciudadanos en Internet y con el mayor uso de sistemas y dispositivos conectados a la Red.

Los ataques cibernéticos pueden ser llevados a cabo tanto por distintos actores, que se mueven por las motivaciones más diversas:

  • Personas – los denominados hackers – que actúan de forma independiente, generalmente motivados por un beneficio económico.
  • Grupos organizados, con distintas finalidades, tanto criminales (terroristas), como ideológicas (activistas).
  • Gobiernos, en ataques que se enmarcan dentro de una estrategia de ciberguerra, dirigidos tanto a sistemas informáticos de otros gobiernos o a importantes activos públicos o privados.
  • Empresas privadas, en acciones de ciberespionaje.

Ahora que sabemos que es un ataque cibernetico t quienes los hacen, te daré unos consejos.

  1. Comprobar la procedencia de los correos electrónicos
    Una forma muy común de realizar los ataques cibernéticos es solicitarle información vía correo electrónico. Muchas veces no tomamos precauciones y respondemos a correos electrónicos desconocidos. Hacerlo es confirmar que la dirección de correo está activa, lo que da pie a que el ataque avance. Al ser amenazados caemos en la desesperación, pero muchos de estos ataques son automatizados y al que responda se le ataca con más fuerza ya que le han ganado su valor.
  2. Tener contraseñas fuertes
    Todos debemos cambiar las contraseñas con cierta periodicidad. De este modo evitamos inconvenientes y riesgos innecesarios. Además, dichas contraseñas deben ser una combinación de números, letras y caracteres especiales. De igual modo, se debería activar las opciones de seguridad, como por ejemplo, la autentificación de dos factores. Esta herramienta permite agregar una capa de mayor seguridad a la hora de iniciar sesión en sus cuentas.
  3. Tener conocimiento de los riesgos para prevenir ataques cibernéticos
    Muchas compañías realizan foros, talleres y charlas para explicar a los trabajadores del riesgo que representa los ataques cibernéticos. Este tipo de actividad permite que todos los miembros de la organización se mantengan informados durante los 365 días del año. Además evita que se cometan errores comunes. De igual manera si no pertenecemos a una de estas compañías debemos aprender a como securizar nuestra web o nuestras computadoras.
  4. Evitar visitar páginas sospechosas
    No todas las páginas en la web son seguras, por ello es preciso evitar las visitas a sitios desconocidos. En ocasiones, llegan invitaciones al correo electrónico o las redes sociales, aceptarlas podría representar un riesgo. Es necesario tener un antivirus y firewall activado y actualizado.
  5. No permitir que personas ajenas usen sus equipos
    Las visitas no deben tocar nuestros equipos sin permiso o supervisión. Es preciso supervisar que personas sin autorización los utilicen ya que no todas las personas tienen las mejores intenciones para nosotros o nuestros negocios.

La seguridad ante este tipo de ataques consiste muchas veces en prevención, de este modo podemos librarnos de los ataques cibernéticos que ponga en riesgo la estabilidad nuestra o de nuestro negocio.

Si quieres saber más sobre el tema de protegerte de ataques cibernéticos o ataques informáticos, te invitamos a ver el curso “Como hacer de mi web una muralla ante ataques informáticos” impartido por Luis Anaya en la plataforma de Udemy. Además te haremos un jugoso descuento del 91%. ¡No lo desaproveches!

Que es un Hacker Ético

La palabra hacker ha sido tan mal usada en los medios de comunicación que la confundimos con cracker. Incluso la RAE registra en su primera acepción la de “pirata informático”, “persona que accede ilegalmente a sistemas informáticos ajenos para apropiárselos u obtener información secreta”. Eso justo es un cracker, según los expertos en ciberdefensa y del mundo de la seguridad informática.

Un hacker ético es una persona que usa de sus conocimientos avanzados en informática para hacer el bien. Su trabajo o afición (debería ser) es realizar pruebas en redes y sistemas y localizar vulnerabilidades. Una vez detectadas, se informa de ellas para que se tomen medidas y se solucionen.

El daño al sistema o sus usuarios nunca es una opción. Son hackers de sombrero blanco, los ‘buenos’ de la película. Tienen unos conocimientos y buscan sacarles partido haciendo el bien, como la mayoría de profesionales.

Frente a los hackers de sombrero negro, que buscan fallas de seguridad en sistemas a los que no han sido invitados para su enriquecimiento propio, y los de sombrero gris, que tienen su propio código ético pero buscan beneficio (reportar vulnerabilidades frente al CNI, FBI, Interpol, etc.), los de sombrero blanco buscan hacer más segura la red y los sistemas.

Un poco de Historia

Los programadores del MIT se hacían llamar asimismo «Hacker» como una forma de identificar su capacidad de hacer programas mejores y más eficaces, de una forma distinta a como se acostumbraba en ese entonces, siendo este el momento donde se relacionaba por primera vez la palabra «hacker» con el mundo de la informática.

Es así como el término «Hacker» se empezó a utilizar para describir «a toda persona que manipula o que posee conocimientos prácticos que modifican los usos de las cosas de modo que éstas puedan emplearse para fines no previstos en su origen» (Según Wikipedia).  Considero que ésta es la definición más apropiada, ya que la figura de «hacker» no está únicamente asociada al área de sistemas, informática o telecomunicaciones; también abarca cualquier área del quehacer humano, considerándose así «hacker» como una capacidad de reinventar una profesión o actividad, más que una profesión independiente.

La Real Academia Española (RAE) en el año 2014 incluyó por primer vez en el diccionario la palabra «Hacker», la cual definió como «Pirata Informático», describiéndolo como una «Persona que accede ilegalmente a sistemas informáticos ajenos para apropiárselos u obtener información secreta«, esta definición no sorprende en nada, ya que es la continuación de una tendencia errada en criminalizar el término «Hacker».

Luego a finales del año 2017, la RAE decide agregar otro significado, ésta vez totalmente distinto al inicial, destacándolo como una “Persona experta en el manejo de computadoras, que se ocupa de la seguridad de los sistemas y de desarrollar técnicas de mejora”. Lo que motivó a la RAE a tomar esta decisión, fueron las observaciones y reclamos de la comunidad internacional de la seguridad informática, al ver como se criminalizaba un término que nada tiene que ver con actividades ciberdelictivas o ciberataques.

White Hat Hacker o Hacker Éticos.

Es todo lo contrario al Ciberdelincuente, es la antítesis del Black Hat Hacker. Su objetivo es mejorar los sistemas informáticos, identificando y corrigiendo vulnerabilidades o fallos de los mismos, con el fin de proteger el activo de la información dentro de una organización.

Su ética profesional radica, en que deben actuar previo acuerdo contractual con la empresa y organización dueña del sistema de información. Son también conocidos como Profesionales de la Ciberseguridad.

Atacar sistemas sin permiso

Con mucha frecuencia los hackers éticos no piden permiso a la hora de entrar a un sistema. Simplemente lo hacen y, cuando lo consiguen, avisan al responsable.

Los hackers éticos que están un paso adelante de los hackers maliciosos deben ser expertos en sistemas informáticos, con amplios conocimientos acerca de programación, redes y sistemas operativos.

Otro requisito es tener un conocimiento profundo sobre plataformas muy concretas (como Windows, Unix, Linux).

Paciencia, persistencia y una gran perseverancia son cualidades importantes que los hacker éticos requieren debido a cantidad de tiempo y nivel de concentración requerido para que la mayoría de los ataques den resultados. Conocimiento en redes, programación web y bases de datos son todos útiles en el trabajo del hacking ético y durante las pruebas de vulnerabilidad.

La mayoría de los hackers éticos son conocedores acerca de las áreas de seguridad y temas relacionados, pero no necesariamente tienen un gran dominio de las contramedidas que pueden prevenir ataques.

Ahora que conoces que es un hacker ético puedes solicitar sus servicios para proteger la red y sistemas de tu negocio.

Que es un Pentesting

El pentesting es una acción constituida por un conjunto de “test de penetración”, o penetration tests, que se basan en ataques hacia los sistemas informáticos con la intención de encontrar sus debilidades o vulnerabilidades. Están diseñados para clasificar y determinar el alcance y la repercusión de dichos fallos de seguridad. Como resultado de estos test podremos obtener una idea bastante coherente del peligro que corre nuestro sistema y de las defensas con las que contamos. Además, también podremos evaluar cómo de eficientes son dichas defensas.

Los pentests ayudan a determinar las posibilidades de éxito de un ataque; a identificar los fallos de seguridad que son consecuencia de vulnerabilidades de menor riesgo, pero explotadas de cierta manera; también dan pie a identificar otras vulnerabilidades que no son posibles de hallar con una red automatizada o software específico; y a comprobar la capacidad de los encargados de seguridad para detectar con éxito y responder a los ataques.

Tipos de Pentests: Caja Blanca, Negra y Gris

Hay algunas maneras de realizar pentesting, cada una de ellas tendrá una eficiencia diferenciada. Entre ellas, podemos destacar la White Box, la Black Box y la Gray Box.

Caja Blanca o White Box

La prueba White Box, o de “Caja Blanca”, es el Pentest más completo. Esto es porque parte de un análisis integral, que evalúa toda la infraestructura de red. En el caso de que se produzca un error en el sistema, es posible que, al iniciar el Pentesting, el hacker ético (o pentester, nombre dado a los profesionales que actúan con esas pruebas) ya posee conocimiento de todas las informaciones esenciales de la empresa, como topografía, contraseñas, IPs, logins y todos los demás datos que se refieren a la red, servidores, estructura, posibles medidas de seguridad, firewalls, etc.

Con estas informaciones preliminares, la prueba puede dirigir certero su ataque y descubrir lo que necesita ser mejorado y reorientado. Por ser un volumen alto de información preliminar, generalmente este tipo de Pentest es realizado por miembros del propio equipo de TI de la empresa.

Caja Negra o Black Box

La prueba Black Box, o “Caja Negra”, es casi como una prueba a ciegas, pues sigue la premisa de no poseer gran cantidad de información disponible sobre la corporación. Aunque sea dirigido, pues alcanzará a la empresa contratante y descubrirá sus vulnerabilidades, el Pentest de Caja Negra es el más cercano a seguir las características de un ataque externo.

Dadas estas características, sin gran mapeo de informaciones, actuará de forma extremadamente similar a la de cibercriminales – lo que es una gran experiencia, si no parte de forma maliciosa y sirve apenas como un método de reconocer fragilidades en la estructura de red.

Caja Gris o Gray Box

Definido como una mezcla de los dos tipos anteriores, el Gray Box – o “Caja Gris” – ya posee cierta información específica para realizar la prueba de intrusión. Sin embargo, esta cantidad de información es baja y no se compara a la cantidad de datos disponibles en un Pentest de Caja Blanca.

Dada esta forma, la prueba de Caja Gris invertirá tiempo y recursos para identificar tales vulnerabilidades y amenazas, basándose en la cantidad de información específica que tiene. Es el tipo de Pentest más recomendado, si existe la necesidad de contratar alguno de estos servicios.

¿Qué actividades comprende un Pentesting?

Un Pentesting comprende múltiples etapas con diferentes tipos de actividades en distintos ámbitos y entornos. La profundidad con que se lleven a cabo las actividades dependerá de ciertos factores, entre los que se destaca el riesgo que puede generar hacia el cliente alguno de los métodos que se apliquen durante la evaluación.

Se establece un previo acuerdo con el cliente para llevar a cabo las diferentes fases del análisis, que se describen a continuación:

Fase de reconocimiento: Posiblemente, esta sea una de las etapas que más tiempo demande. Asimismo, se definen objetivos y se recopila toda la información posible que luego será utilizada a lo largo de las siguientes fases. La información que se busca abarca desde nombres y direcciones de correo de los empleados de la organización, hasta la topología de la red, direcciones IP, entre otros. Cabe destacar que el tipo de información o la profundidad de la pesquisa dependerán de los objetivos que se hayan fijado en la auditoría.

Fase de escaneo: Utilizando la información obtenida previamente se buscan posibles vectores de ataque. Esta etapa involucra el escaneo de puertos y servicios. Posteriormente se realiza el escaneo de vulnerabilidades que permitirá definir los vectores de ataque.

Fase de enumeración: El objetivo de esta etapa es la obtención de los datos referente a los usuarios, nombres de equipos, servicios de red, entre otros. A esta altura de la auditoría, se realizan conexiones activas con el sistema y se ejecutan consultas dentro del mismo.

Fase de acceso: En esta etapa finalmente se realiza el acceso al sistema. Esta tarea se logra a partir de la explotación de aquellas vulnerabilidades detectadas que fueron aprovechadas por el auditor para comprometer el sistema.

Fase de mantenimiento de acceso: Luego de haberse obtenido el acceso al sistema, se busca la manera de preservar el sistema comprometido a disposición de quien lo ha atacado. El objetivo es mantener el acceso al mencionado sistema perdurable en el tiempo.

Si bien las fases que componen a la operatoria de un Pentesting son las mencionadas anteriormente, cabe señalar que a partir de los resultados obtenidos se genera la documentación correspondiente con los detalles que comprendieron la auditoría. Esta documentación es la que verá el cliente, y es la que servirá como guía para tomar las decisiones futuras pertinentes.

Finalmente, es importante tomar los recaudos necesarios para evitar sufrir ataques e incidentes en la empresa o negocio. Asimismo la seguridad debe ser gestionada contemplando la necesidad de la realización de auditorías cada cierto tiempo, el cual se considere adecuado para nuestra empresa o negocio.

¿Como está la seguridad de tu empresa o negocio? ¿Ya has realizado un Pentesting? ¿Estas pensando en hacer un Pentesting? ¡Cuentanos más sobre lo que quieres hacer con respecto al tema del Pentesting!

Que es HUMINT

Human Intelligence (HUMINT), es la recolección de información por personal especialmente entrenado, por medio de contacto interpersonal ,usando una variedad de tácticas y métodos tanto activos como pasivos, cuyo objeto son otras personas de las cuales se puede extraer información o colaboración para obtenerla.

La Inteligencia de fuente humana (HUMINT), es la más antigua y tradicional, han sido, son los espías, infiltrados, agentes secretos, informadores, entrevistas, interrogatorios. Existen varios tipos:

Oficial de Enlace:
Es un miembro del servicio secreto acredito en una embajada, su misión es relacionarse y recibir o aportar con sus homólogos de ese país, en ocasiones puede ejercer de Jefe de inteligencia de las actividades de esas embajada en ese país.

Agente Operativo:
Seguimientos, introducciones en edificios para colocar escuchas, acciones operativas, dependiendo de los escrúpulos del servicio puede encargarse de asesinatos selectivos.

Infiltrado o Topo:
Se introduce en organizaciones terroristas, criminales o en otros servicios de inteligencia, empresas con el objetivo de obtener información, desestabilizar, o llegar a otro tipo de acciones asesinatos, sabotajes.

Agente de Campo:
Es el espía que se introduce en un país o determinada zona con el objeto de recoger información, de determinados objetivos o crear una red propia de colaboradores e informadores.

Informador o colaborador:
No es un miembro del servicio de inteligencia pero desde su posición, o puesto de responsabilidad dentro de una organización, transmite información.

La necesidad que tiene cualquier organización, ya sea pública o privada, de anticiparse a su competidor o adversario, ha provocado que siempre sea prioritario el conocer sus intenciones: ¿qué tiene pensado hacer?, ¿cómo lo hará?, ¿en dónde?, etc.

Este conocimiento, en la mayoría de las ocasiones solamente es posible conseguirlo mediante la intervención del agente de inteligencia humana (HUMINT), la mayoría de las veces denominado como espía.

Desde tiempos ancestrales, los grandes dirigentes y militares se han rodeado de hombres y mujeres de confianza que le han proporcionado la información necesaria para tomar sus decisiones. Estos datos se han obtenido mezclándose entre la gente, hablando con todos, pero sin decir nada, infiltrándose entre los enemigos.

Lo que al principio estaba orientado únicamente a la esfera política y militar se ha ido extendiendo cada vez más a la actividad empresarial. Esto es debido a que conocer las intenciones de nuestros competidores, así como prevenir posibles fugas de información de nuestra empresa, se traduce en beneficios económicos.

Hoy en día la sociedad está cada vez más basada en la tecnología, y existe la creencia generalizada de que esta protege nuestros activos (ya sea a nivel particular como a nivel empresarial) de una manera segura. Pero la realidad es otra completamente distinta.

Con bastante frecuencia oímos noticias sobre fugas de información de una empresa a otra, de servicios de inteligencia que tienen información supuestamente clasificada, de famosos que ven cómo sus intimidades salen a la luz o políticos que ven truncadas sus carreras porque se airean ciertas indiscreciones… Y normalmente, detrás de todo esto se encuentra la mano (y el oído) del hombre… El HUMINT.

Pero ¿tenemos claro que tipo de actividades se llevan a cabo en HUMINT? ¿Son de aplicación en el ámbito civil y empresarial o quedan circunscritas únicamente a los servicios de inteligencia?

Para responder a la pregunta anterior primero hay que saber cuales son las actividades HUMINT típicas, y que están relacionadas con la fuente de la que se obtiene información, que como se ha dicho al principio son personas.

Aunque las clasificaciones, en muchas ocasiones, solo valen para el que las hace, una bastante aceptada sobre las actividades HUMINT es la siguiente:

Entrevistas.
Actividad en la cual una persona facilita, consciente o inconscientemente, información, conociendo o no la verdadera identidad de su interlocutor y la importancia de la información que esta facilitando.

Interrogatorios.
Actividad en la cual se intenta obtener información de manera sistemática de personas detenidas o capturadas, sin su consentimiento.

Gestión de contactos y de agentes.
Aunque hay diferencias entre agentes y contactos, en líneas generales, esta es una actividad en la que se intenta captar personas para obtener información sobre un organización o individuos concretos.

Relaciones de enlaces de inteligencia.
Es una actividad que consiste en el intercambio de personal entre dos organizaciones, amigas o neutrales, para facilitar el trasvase de información.

Vigilancia
Actividad consistente en la obtención de información sobre personas, lugares o actividades de interés, de manera continua y que se puede prolongar en el tiempo.

Reconocimiento
Actividad de obtención de información llevada acabo de manera puntual sobre determinados puntos o zonas de interés. El reconocimiento, al contrario que la vigilancia, no es continuo en el tiempo.

Las actividades HUMINT, anteriormente citadas, las podemos dividir en dos bloques: un primero en el cual existe contacto directo e interacción con la fuente, mientras que en la vigilancia y el reconocimiento no lo hay.

¿Sabías esto, practicas HUMINT en tu negocio o empresa? ¿Lo comenzarás a utilizar?

Que es OSINT

OSINT (Open Source Intelligence). La inteligencia en fuentes abiertas u OSINT es parte del proceso de reconocimiento que consiste en utilizar cualquier fuente de información pública que pueda proporcionar información sobre una empresa, organización o individuo.

Como investigador puedes utilizar esta información para responder preguntas.
Utilizando técnicas OSINT se puede obtener información de personas y empresas.

La inteligencia de fuentes abiertas (OSINT por sus siglas en inglés) es una metodología desarrollada por los principales servicios de inteligencia y seguridad nacional a nivel mundial. Consiste en aprovechar la enorme cantidad de información disponible para todo público (bibliotecas, prensa escrita, medios de comunicación tradicionales, medios electrónicos, redes sociales, internet profunda) con el fin de convertirla en inteligencia accionable.

Las fuentes de información OSINT hacen referencia a cualquier información desclasificada y públicamente accesible en Internet de forma gratuita.

Existen multitud de fuentes abiertas a partir de las cuales se puede obtener información relevante, entre las que destacan:

  • Medios de comunicación: revistas, periódicos, radio, etc.
  • Información pública de fuentes gubernamentales.
  • Foros, redes sociales, blogs, wikis, etc.
  • Conferencias, simposios, «papers», bibliotecas online, etc.

Algunos ejemplos de la utilización de OSINT son los siguientes:

  • Conocer la reputación online de un usuario o empresa.
  • Realizar estudios sociológicos, psicológicos, lingüísticos, etc.
  • Auditoria de empresas y diferentes organismos con el fin de evaluar el nivel de privacidad y seguridad.
  • Evaluar tendencias de mercados.
  • Identificación y prevención de posibles amenazas en el ámbito militar o de la seguridad nacional.
  • Como aspecto negativo, es utilizado por cibercriminales para lanzar ataques APT y «Spear Phishing».

La inteligencia de fuentes abiertas surge como una alternativa que permite mejorar de manera significativa el proceso de toma de decisiones mediante la explotación eficiente de miles de recursos informativos.

Todos los recursos informativos están disponibles para cualquier persona en cualquier parte del mundo, de manera impresa o electrónica, sin embargo, Cuando aumenta la calidad de la información, las decisiones son más acertadas y derivan en mejores resultados.

El proceso OSINT consta de las siguientes fases:

Fases de OSINT

Requisitos: es la fase en la que se establecen todos los requerimientos que se deben cumplir, es decir, aquellas condiciones que deben satisfacerse para conseguir el objetivo o resolver el problema que ha originado el desarrollo del sistema OSINT.

Identificar fuentes de información relevante: consiste en especificar, a partir de los requisitos establecidos, las fuentes de interés que serán recopiladas. Hay que tener presente que el volumen de información disponible en Internet es prácticamente inabordable por lo que se deben identificar y concretar las fuentes de información relevante con el fin de optimizar el proceso de adquisición.

Adquisición: etapa en la que se obtiene la información a partir de los orígenes indicados.
Procesamiento: consiste en dar formato a toda la información recopilada de manera que posteriormente pueda ser analizada.

Análisis: es la fase en la que se genera inteligencia a partir de los datos recopilados y procesados. El objetivo es relacionar la información de distintos orígenes buscando patrones que permitan llegar a alguna conclusión significativa.

Presentación de inteligencia: consiste en presentar la información obtenida de una manera eficaz, potencialmente útil y comprensible, de manera que pueda ser correctamente explotada.

Problemas

Se pueden identificar principalmente 2 problemas a la hora de utilizar un sistema OSINT:

Demasiada información: como ya se ha puesto de manifiesto, la cantidad de información pública disponible en Internet es más que notable. Es por ello, que se debe realizar un proceso muy exhaustivo a la hora de identificar y seleccionar las fuentes de información de interés que van a ser recopiladas, y que posteriormente servirán para la generación de inteligencia. El hecho de utilizar un catálogo extenso de fuentes conlleva obviamente un mayor gasto a la hora de implementar el sistema, y en el caso de no tener disponibles los recursos necesarios, provoca una significativa ralentización del mismo.

Fiabilidad de las fuentes: es importante valorar previamente las fuentes que van a nutrir el sistema de información ya que una selección errónea de las mismas puede provocar resultados erróneos y desinformación.

Entonces, realizas OSINT en tu negocio o empresa? Lo implementarás? Anímate a dar un paso adelante a tu competencia.

Como utilizar la Geolocalización con Google Maps

Hola a todos, espero se encuentren muy bien, ahora les explicaré como utilizar la API de Google Maps para usar la geolocalización. Haremos un pequeño ejemplo con HTML, CSS y JS. Para obtener más información de la API de Google Maps visita la web de oficial

Primero es de saber que utilizar la API de Google Maps hay que integrarla en nuestro documento HTML, lo hacemos llamando la librería desde el CDN de Google así

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>

En el ejemplo utilizaré el Framework jQuery, pueden utilizar un CDN o un archivo local. El HTML de este ejemplo es muy simple, solo pondré el contenido del body 

<div class="map" id="mapaUbicar"></div>
<input type="text" value="" name="ubicacion" id="ubicacion">

Tenemos un div vacío y un input, he puesto el input a modo de mostrar como capturar las coordenadas y asignarselas al input, es algo bastante común en los desarrollo web de weapps. Bien, ahora les pondré un pequeño CSS para que se vea mejor el mapa y el contenido de la input.

.map {
	width:100%;
	height:450px;
}
#ubicacion {
	width:99%;
	padding:5px;
	margin:5px 0;
}

Lo que hacemos es ponerle el ancho completo y una altura al div que contendrá el mapa, a la input le ponemos un ancho, un padding y un margin, es muy sencillo el CSS.

Ahora vamos a la parte gruesa, aun que es muy sencillo también, les explicaré por partes

jQuery(document).ready(function(e) {
	//Inicializamos la detección de nuestra posición por medio de esta función
        obtener_posicion_actual();
});

He creado una función para inicializar la detección de nuestra posición actual.

obtener_posicion_actual = function(options) {
	var defaults = {
		maximumAge: 500000,
		enableHighAccuracy: true,
		timeout: 600000
	}
	jQuery.extend(defaults, options);
	
	if (navigator.geolocation) {
		navigator.geolocation.getCurrentPosition(exito, fallo, defaults);
	}
}

Esta función recibe un objeto Javascript como parámetro, también puede ir vacío, lleva 4 parámetros:

  • maximumAge: Es un valor long positivo que indica la edad máxima en milisegundos de una posible posición “cacheada” que es aceptable retornar. Por defecto en esta función he puesto que sea 50,000 milisegundos.
  • enableHighAccuracy: Es un Boolean que indica que la aplicación quiere recibir los mejores resultados posibles. Si es true y si el dispositivo es capaz de proporcionar una posición más precisa, así lo hará. Por defecto es true.
  • timeout: Es un valor long positivo que representa el máximo período de tiempo (en millisegundos) que se le permite tomar al dispositivo para retornar a una posición. Por defecto en esta función he puesto que sea 60,000 milisegundos.

Luego preguntamos si el navegador soporta la geolocalización, si es así utilizamos: navigator.geolocation.getCurrentPosition(exito, fallo, defaults); donde exito y fallo son dos funciones, una para éxito si ha logrado obtener la posición actual y la otra por si hay un fallo, se falla puede devolver 1 de 4 códigos para decirnos que es lo que pasó, pueden ser: 0, 1, 2 o 3. Les coloco el código de ambas funciones y verán que es cada código de error. El último parametro es el objeto que le pasamos a la función defaults.

function exito(pos) {         
	var coors = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude); 
	mapa = nuevo_mapa({
		id:'mapaUbicar',
		zoom: 13,
		center: coors
	}); 
	
	agregar_marcador({
		lat:pos.coords.latitude,
		lon:pos.coords.longitude
	},mapa);           
}        
	
function fallo(error) {           
	if (error.code == 0) {
		alert("Oops! No se puede obtener la posición actual.");
	}
	if (error.code == 1) {
		alert("Oops! Algo ha salido mal.");
	}
	if (error.code == 2) {
		alert("Oops! No has aceptado compartir tu posición.");
	}
	if (error.code == 3) {
		alert("Oops! Hemos superado el tiempo de espera");
	}        
}

Como vemos en código anterior, la función exito recibe como parámetro una posición, la cuál es tomada en la función que la llama, en base a la posición se obtiene en coors una latitud y longitud para ser usada en la API de Google Maps. Luego llamamos una función para crear un mapa, esta recibe un objeto:

  • id: Id del elemento HTML que contendrá el mapa, en nuestro caso la div vacía.
  • zoom: Zoom que queremos que tenga nuestro mapa al iniciarse
  • center: las coordenadas del centro que queremos ubicar, le pasamos las de nuestra posición actual.

Luego agregamos un marcador, así mostramos con un marker la posición donde nos encontramos, le pasamos la latitud y longitud para que se dibuje en el mapa.

La función fallo recibe como parámetro un código de error:

  • 0: No se puede obtener la posición actual.
  • 1: Hay algo que ha salido mal.
  • 2: No aceptaste darle permisos al navegador para que detecte tu posición actual.
  • 3: Se superó el tiempo de espera y no hubo respuesta.

Veamos la función para crear un mapa:

nuevo_mapa = function(options){
	var defaults = {
		id: '',
		zoom: 5,
		center: new google.maps.LatLng(10.386748, -75.504615),
		mapTypeId: google.maps.MapTypeId.ROADMAP
	}
	jQuery.extend(defaults, options);
   
	mapa = new google.maps.Map(document.getElementById(defaults.id), defaults);
	
	return mapa;
}

A esta función le pasamos como parámetro el objeto antes mencionado para la creación del mapa. finalmente usamos mapa = new google.maps.Map(document.getElementById(defaults.id), defaults); donde mapa es una instancia de un objeto tipo mapa de Google Maps y retornamos la variable creada para que se pueda utilizar fuera.

Ahora veamos la función que crea el marcador:

agregar_marcador = function(location,mapa) {
	var marker = new google.maps.Marker({
		position: new google.maps.LatLng(location.lat,location.lon),
		map: mapa,
		draggable: true
	});
	
	google.maps.event.addListener(marker, 'dragend', function() {
		pos = marker.getPosition();
		input = '#ubicacion';
		geocoder = new google.maps.Geocoder();
		geocoder.geocode({
			latLng: pos
		}, function(results, status){
			if (status == google.maps.GeocoderStatus.OK){
				jQuery(input).val(results[0].geometry.bounds.R.R+','+results[0].geometry.bounds.j.j);
			} else {
				alert('No se pudo determinar la posición: '+status);
			}
		});
	});
}

Esta función quizá sea la más compleja, no por la creación del marcador, sino por el listener que escucha cuando movemos el marcador. Lo primero que vemos es una variable marker, con ella agregamos el marcador al mapa, utiliza la posición que se ha capturado cuando ha obtenido nuestra posición actual, se le pasa como objeto location en esta función, luego se le pasa la referencia al mapa que se está utilizando y finalmente el parámetro draggable : true para que el marker se pueda arrastrar dentro del mapa.

Luego vemos un addListener que es un metodo de un objeto de Google Maps, se le pasa como parámetro el marcador, el evento a escuchar ‘dragend’ (Finalización del arrastrado por así traducirlo) y un callback, creamos una función anónima, con pos = marker.getPosition(); obtenemos la posición donde soltamos el marcador luego de arrastrarlo, luego creamos un objeto geocoder, le pasamos latLng, o sea, la posición donde se soltó el marker y una función haciendo de callback, esta función se le pasa un result y un status.

Verificamos que el staus sea el adecuado, en este caso buscamos un OK, entonces le asignamos la posición del marker al input, al result en la posicón 0 buscamos el objeto geometry, luego el objeto bounds, luego el bojeto R y finalmente el objeto R y ese valor almacenado en ese objeto le pasamos como latitud, para la longitud es de igualmanera, pero en lugar de R usamos j. Si la respuesta del status es diferente a OK mostraremos un alert indicando que no se pudo obtener la posición y nos agrega el status obtenido.

El código completo de Javascript sería así:

jQuery(document).ready(function(e) {
	obtener_posicion_actual();
});
		
agregar_marcador = function(location,mapa) {
	var marker = new google.maps.Marker({
		position: new google.maps.LatLng(location.lat,location.lon),
		map: mapa,
		draggable: true
	});
	
	google.maps.event.addListener(marker, 'dragend', function() {
		pos = marker.getPosition();
		input = '#ubicacion';
		geocoder = new google.maps.Geocoder();
		geocoder.geocode({
			latLng: pos
		}, function(results, status){
			if (status == google.maps.GeocoderStatus.OK){
				jQuery(input).val(results[0].geometry.bounds.R.R+','+results[0].geometry.bounds.j.j);
			} else {
				alert('No se pudo determinar la posición: '+status);
			}
		});
	});
}

nuevo_mapa = function(options){
	var defaults = {
		id: '',
		zoom: 5,
		center: new google.maps.LatLng(10.386748, -75.504615),
		mapTypeId: google.maps.MapTypeId.ROADMAP
	}
	jQuery.extend(defaults, options);
   
	mapa = new google.maps.Map(document.getElementById(defaults.id), defaults);
	
	return mapa;
}

function exito(pos) {         
	var coors = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude); 
	mapa = nuevo_mapa({
		id:'mapaUbicar',
		zoom: 13,
		center: coors
	}); 
	
	agregar_marcador({
		lat:pos.coords.latitude,
		lon:pos.coords.longitude
	},mapa);           
}        
	
function fallo(error) {           
	if (error.code == 0) {
		alert("Oops! No se puede obtener la posición actual.");
	}
	if (error.code == 1) {
		alert("Oops! Algo ha salido mal.");
	}
	if (error.code == 2) {
		alert("Oops! No has aceptado compartir tu posición.");
	}
	if (error.code == 3) {
		alert("Oops! Hemos superado el tiempo de espera");
	}        
}      
		
obtener_posicion_actual = function(options) {
	var defaults = {
		maximumAge: 500000,
		enableHighAccuracy: true,
		timeout: 600000,
		puntos : false
	}
	jQuery.extend(defaults, options);
	
	if (navigator.geolocation) {
		navigator.geolocation.getCurrentPosition(exito, fallo, defaults);
	}
}

Esperamos que esto te sea de ayuda para tus desarrollos en Javascript y con la API de Google Maps.

Algo muy importante a destacar es que para poder usar la geolocalización de Google Maps debes ejecutar el código en un servidor, puede ser un servidor en internet o un servidor local (XAMMP, MAMP, WAMP, LAMP, Bitnami, etc)

LocalStorage, almacenamiento local con HTML5

localstorage

Seguramente ya escuchaste sobre el almacenamiento local de HTML5. Ahora veremos como utilizar LocalStorage.

Primero tenemos que tener en cuenta que LocalStorage es el almacenamiento que no expira y tiene los siguientes métodos:

  • getItem ( key )
  • setItem ( key , value )
  • removeItem ( key ).

La utilización de cada uno es muy simple, veamos el primero:

  1. getItem( key ) : Obtiene la información almacenada, se le pasa como parámetro una key que nosotros hayamos escogido al momento de guardarla, de esta manera logramos diferenciarla de las demás.
  2. setItem( key, value ) : Guardamos nuestra información deseada en una LocalStorage, se le pasa un key para identificarlas y un value, este value debe ser un String, esto es muy importante, una LocalStorage solo puede guardar String.
  3. removeItem( key ) : Para eliminar una LocalStorage se le debe pasar una key, la LocalStorage no tiene tiempo de vida, si no se elimina estará ahi guardada.

Un ejemplo de como utilizar estos métodos de LocalStorage sería así:

if (window.localStorage) {
  //Agregamos un item
  localStorage.setItem("nombre_app", "pepe");
  //Obtenemos el item
  var nombre = localStorage.getItem("nombre_app");
  //Eliminamos el item
  localStorage.removeItem("nombre_app");
}
else {
  throw new Error('Tu Navegador no soporta LocalStorage :(');
}

Ahora te podrás preguntar, ¿Pero, que puedo hacer con esto? Pues, las posibilidades son infinitas, podrás hacer webapps, sitios web con personalizaciones, aplicaciones móviles, etc.

Veamos un ejemplo pequeño y práctico.

<body>
<div class="container">
	<h1>LocalStorage</h1>
	
	<form id="ingreso-notas" action="" method="post">
		<ul class="list-unstyled">
			<li>
				<label for="codigo">Código</label>
				<input type="text" id="codigo" name="name" />
			</li>
			<li>
				<label for="nombre">Nombre</label>
				<input type="text" id="nombre" name="nombre" />
			</li>
			<li>
				<label for="nota">Nota</label>
				<input type="text" id="nota" name="nota" />
			</li>
			<li>
				<input type="submit" class="btn btn-secondary" id="codigo" name="name" />
			</li>
		</ul>
	</form>
	
	<ul class="list-inline box-style">
	     <li><button type="button" id="all" class="btn btn-primary">Ver Todo</button></li>
	</ul>
	<div id="result"></div>
</div>
<script src="js/jquery.js"></script>
<script src="js/jquery.validate.min.js"></script>
<script src="js/init.js"></script>
</body>

En el código anterior creamos un formulario para almacenar registros de notas, el ejemplo es muy sencillo, creas un usuario, le asignas un código como id, un nombre y una nota, al enviar el formulario guardará la información como LocalStorage. Lo que haremos al procesar la información es que crearemos un JSON y antes de guardarlo lo convertiremos en un String, de esta manera podemos volverlo JSON y añadir o quitar registros.

/* Muestra el json en formato legible */
jQuery("#all").click(function(){
    mostrar_json();
});

/* Delegamos la edición a los botones creados dinámicamente */
jQuery('body').delegate('.edit','click',function(){
	var element = jQuery(this);
	id = element.data('id');
	editar_entrada(id);
});

/* Delegamos la eliminación a los botones creados dinámicamente */
jQuery('body').delegate('.delete','click',function(){
	var element = jQuery(this);
	id = element.data('id');
	eliminar_entrada(id);
});

/* Agrega al json más items */
//Primero validamos utilizando el plugin Validate de jQuery
jQuery("#ingreso-notas").validate({
	rules: {
		codigo:{required : true},
		nombre:{required : true, minlength : 3},
		nota:{required : true, number : true}
  	},
  	messages: {
    	codigo: "Este campo es requerido",
		nombre: "El nombre es requerido y debe tener por lo menos 3 caracteres",
		nota: "La nota es requerido y debe tener solo dígitos",
  	},
  	submitHandler: function() {
		//Obtenemos los datos del form
                var codigo = jQuery('#codigo').val();
		var nombre = jQuery('#nombre').val();
		var nota = jQuery('#nota').val();
                
                //Creamos el JSON
		registro = {'codigo' : codigo, 'nombre' : nombre, 'nota' : nota};
                //Agregamos el registro al LocalStorage
		localStorage.setItem(codigo,JSON.stringify(registro));
                
                //Mostramos el resultado en la tabla
		mostrar_json();
		jQuery("form").get(0).reset()
		return false;
  	}
});

function editar_entrada(id){
	var nota;
        //Recorremos todos los datos de LocalStorage que tiene nuestro navegador
	for(i = 0; i < localStorage.length; i++){
		var registro = localStorage.key(i);

                //Comparamos si es e que estamos buscando y lo agregamos al formulario para poder editarlo
		if( registro == id ){
			nota = $.parseJSON(localStorage.getItem(registro));
			jQuery('#codigo').val(nota.codigo);
			jQuery('#nombre').val(nota.nombre);
			jQuery('#nota').val(nota.nota);
		}
	}
}

function eliminar_entrada(id){
	localStorage.removeItem(id);
	jQuery('#result').html('<div class="alert">Se eliminó la entrada</div>').fadeIn(800).delay(3000).fadeOut(800,function(){
		mostrar_json();
	});
}

//Mostramos los datos alamacenados en el LocalStorage
function mostrar_json(){
	var table = '<table class="table table-striped">';
	table += '<thead><tr>';
	table += '<th>Código</th><th>Estudiante</th><th>Nota</th><th>Acciones</th>';
	table += '</tr></thead><tbody>';
	
	for(i = 0; i < localStorage.length; i++){
		var registro = localStorage.key(i);
		try {
			nota = jQuery.parseJSON(localStorage.getItem(registro));
	    } catch(err) {
			break;
	    }
		
		table += '<tr>';
		table += '<td>'+nota.codigo+'</td>';
		table += '<td>'+nota.nombre+'</td>';
		table += '<td>'+nota.nota+'</td>';
		table += '<td><button type="button" class="btn btn-default edit" data-id="'+nota.codigo+'">Editar</button> <button type="button" class="btn btn-default delete" data-id="'+nota.codigo+'">Eliminar</button></td>';
		table += '</tr>';
	}
	
	table += '</tbody></table>';
	
	jQuery('#result').html(table);
	jQuery('#result').css('display','block');
}

En el código anterior tenemos varias funciones, las cuales nos darán la interactividad, mostrar_json() nos mostrará la información almacenada en el LocalStorage. editar_entrada(id) nos ayuda a colocar la información correspondiente en el formulario para poder editarla. eliminar_entrada(id) nos elimina el ítem que hemos seleccionado de la tabla.

/* Delegamos la edición a los botones creados dinámicamente */
jQuery('body').delegate('.edit','click',function(){
	var element = jQuery(this);
	id = element.data('id');
	editar_entrada(id);
});

Con este trozo de código le damos la facultad de poder editar a los botones agregados dinámicamente, por ello utilizamos la función delegate de jQuery, es lo mismo para la seccion de eliminar ítem o registro.

/* Delegamos la eliminación a los botones creados dinámicamente */
jQuery('body').delegate('.delete','click',function(){
	var element = jQuery(this);
	id = element.data('id');
	eliminar_entrada(id);
});

Ahora, la parte final.

/* Agrega al json más items */
jQuery("#ingreso-notas").validate({
	rules: {
		codigo:{required : true},
		nombre:{required : true, minlength : 3},
		nota:{required : true, number : true}
  	},
  	messages: {
    	codigo: "Este campo es requerido",
		nombre: "El nombre es requerido y debe tener por lo menos 3 caracteres",
		nota: "La nota es requerido y debe tener solo digitos",
  	},
  	submitHandler: function() {
		var codigo = jQuery('#codigo').val();
		var nombre = jQuery('#nombre').val();
		var nota = jQuery('#nota').val();
		registro = {'codigo' : codigo, 'nombre' : nombre, 'nota' : nota};
		localStorage.setItem(codigo,JSON.stringify(registro));
		mostrar_json();
		jQuery("form").get(0).reset()
		return false;
  	}
});

Utilizamos un conocido plugin de jQuery para validar los campos del form, lo que nos interesa en este momento es en el método submitHandler, obtenemos la información del formulario, la convertimos a JSON y la agregamos al LocalStorage, mostramos la información actualizada en la tabla, limpiamos el formulario y ponemos un return false para que el formulario no recargue la página.

El ejemplo es sencillo y con él podemos ver en acción los 3 métodos de LocalStorage y un poco de JSON para facilitarnos las cosas. Esperamos que esto les ayude un poco a entender LocalStorage y a facilitarles el desarrollo de sus aplicaciones y sitios web.