;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Milhões em jogo: game ajuda empresas a não cair em golpe de cibercriminosos

Nahel Abdul Hadi/Unsplash
Imagem: Nahel Abdul Hadi/Unsplash

Pedro Katchborian

Colaboração para Tilt

12/01/2020 04h00

Quando a segurança corporativa é afetada, o prejuízo pode ser bem maior do que uma senha roubada. Dados sigilosos de companhias podem ser comprometidos e provocar danos irreparáveis. A startup Hacker Rangers, de Campinas, interior de São Paulo, quer combater esse cenário e desenvolveu um jogo para que funcionários de empresas evitem golpes e fraudes.

A iniciativa também está de olho na Lei Geral de Proteção de Dados Pessoais (LGPD), que diz que todas as empresas nacionais deverão orientar os funcionários e trabalhadores terceirizados sobre as normas de segurança dos dados. A LGPD deve entrar em vigor em agosto de 2020. Uma proposta na Câmara dos Deputados defende adiar o início da vigência da lei para 2022.

Como a lei deve mexer no bolso de muita gente —multas devem ser aplicadas para quem não se atualizar sobre o tema— corporações devem proporcionar orientação aos seus funcionários. Neste panorama, a startup espera um aumento de faturamento de 500% nos próximos dois anos. Em 2018, a empresa faturou mais de R$ 1 milhão.

O jogo da Hacker Rangers permite que as empresas acompanhem o desempenho de seus funcionários ao ensinar boas práticas que possam evitar as fraudes. Ele é dividido em etapas e dá pontos aos jogadores de acordo com o cumprimento das tarefas. O game tem sistemas de patentes, medalhas, desafios, simulação de ataques de engenharia social e quizzes — tudo com um ranking semanal, mensal e geral.

Por meio da plataforma, os funcionários aprendem, por exemplo, sobre o risco de abrir um email com remetente desconhecido. Nos casos em que há tentativa de crime, os dados podem ser roubados ou um vírus instalado com um simples clique em um link. Depois que as informações são roubadas, os cibercriminosos podem pedir recompensas em dinheiro ou até mesmo revender esses dados. Segundo relatório da McAfee de 2018, os cibercrimes geram prejuízos que podem chegar a US$ 600 bilhões por ano.

Segundo Vinicius Perallis, diretor da empresa, a gamificação já é bastante utilizada para treinar equipes e aumentar a produtividade, mas ainda faltava a lacuna da cibersegurança. "Desenvolvemos a plataforma porque acreditamos que os funcionários são essenciais para garantir a segurança de dados dentro das empresas. Nosso produto coloca as pessoas como protagonistas no combate aos crimes cibernéticos", afirma.

Em setembro de 2019, o grupo Furlan Participações, do setor de construção civil em Campinas, adquiriu 30% da Hacker Rangers. O objetivo é que a compra acelere e escale a startup para transformá-la na maior empresa focada em gamificação na América Latina.

SIGA TILT NAS REDES SOCIAIS