Artigo do tipo Exemplos Práticos
Recursos especiais neste artigo:
Conteúdo sobre Boas Práticas

Para que serve este artigo:

Neste artigo, trataremos dos principais recursos nativos do SDK do iOS utilizados para realizar transferência de dados entre os dispositivos móveis da Apple e servidores externos a eles. Abordaremos a importância de verificarmos a origem de cada requisição realizada e suas respectivas respostas, certificando que os dados sejam trafegados em ambientes conhecidos e seguros, maximizando cada vez mais o nível de segurança dos aplicativos. Iremos abordar tanto a utilização de classes e recursos de alto e baixo nível, podendo inclusive interagir em um nível de granularidade maior no que tange à protocolos de rede.

Atualmente, inúmeros são os aplicativos que envolvem a transferência de informações pessoais dos usuários, tais como números de cartão de crédito e CPF, entre os dispositivos móveis e os servidores nos quais estas informações serão processadas. Com isto, faz-se necessário transferir os dados de maneira segura, minimizando ao máximo as possibilidades de violação dos mesmos. Isso ganha ainda mais importância se obsevarmos uma contínua penetração dos smartphones no mercado, aumentado exponencialmente a quantidade de usuários utilizando aplicativos deste contexto.

Dessa forma, veremos algumas das melhores práticas a serem aplicadas durante o desenvolvimento de aplicativos para que se obtenha a maior segurança possível nos momentos em que será necessária a transferência de dados entre os dispositivos móveis da Apple e os servidores nos quais estes mesmos dados serão processados.

Os dispositivos móveis nos trazem não apenas a possibilidade de estarmos conectados durante todo o tempo, como também de realizarmos tarefas que podemos considerar críticas, como efetuar todo tipo de transação bancária em qualquer lugar que estivermos – e que tenhamos conectividade, claro.

É necessário levarmos em consideração que não temos o controle dos locais através dos quais os usuários se conectam a internet. Esta conexão pode ser realizada através de redes privadas – em casa, no local de trabalho, como também através de redes públicas – restaurantes, aeroportos, shopping centers, etc. Este fator eleva a preocupação que os desenvolvedores devem ter ao escreverem códigos que irão trafegar dados críticos dos dispositivos móveis para os servidores nos quais estes serão processados.

Para obter a máxima segurança possível, é importante que as requisições sejam feitas através de um canal seguro de transações. Neste caso, deve-se utilizar HTTPS. Outra medida importante a ser adotada é a criptografia dos dados coletados no dispositivo móvel, sendo esta feita em nível de código.

Apesar de sabermos que os dados trafegados por HTTPS já são criptografados pela camada de transporte, seja via SSL ou seu sucessor, o TLS, existem históricos de violação deste tipo de comunicação.

Para cada um dos cenários, faz-se necessário implementar os métodos mais adequados, a fim de se obter o correto tratamento das transações para as possíveis variantes que podem decorrer das mesmas.

Quando uma requisição HTTPS é feita através de um browser, caso ocorra qualquer situação que possa levantar suspeita com relação ao certificado, um aviso é emitido para que o usuário opte por continuar navegando naquele site ou aborte a operação. Já nas requisições realizadas através dos aplicativos, por padrão este tipo de aviso não é emitido, abrindo uma grande brecha de segurança. Portanto, é importante que sejam implementados métodos e aplicadas tratativas em nível de código para obter a maior segurança possível.

Implementando métodos de conexão

Neste primeiro exemplo utilizaremos as classes do framework Foundation, implementando os métodos de delegate da classe NSURLConnection que serão disparados a partir de uma requisição realizada.

Na Listagem 1 é realizada uma requisição utilizando um host com HTTPS.

Listagem 1. Realizando uma requisição.

NSURL *url = [NSURL URLWithString:@”http://seguro.devmedia.com.br/”]
  NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
  initWithURL:url];
  conn = [[NSURLConnection alloc] initWithRequest:request 
  delegate:self];
 ... 

Quer ler esse conteúdo completo? Tenha acesso completo