Alura > Cursos de DevOps > Cursos de Segurança > Conteúdos de Segurança > Primeiras aulas do curso Desenvolvimento Seguro: estratégias de segurança para dados de entrada

Desenvolvimento Seguro: estratégias de segurança para dados de entrada

Lidando com SQL Injection - Apresentação

Boas-vindas ao curso de Desenvolvimento seguro: estratégias de segurança para dados de entrada.

Sou a Camila e serei sua instrutora!

Audiodescrição: Camila é uma mulher com os olhos castanhos escuros, cabelos longos, pretos e encaracolados. Usa uma camiseta preta e fone de ouvido também preto. Está sentada em uma cadeira e ao fundo há uma parede lisa com iluminação degradê do roxo para o azul.

Esse curso é para pessoas Devs que possuem interesse em trabalhar com desenvolvimento seguro de aplicações.

O que vamos aprender

Para isso, usaremos a Voll Med, uma API REST de uma aplicação que faz o gerenciamento de uma clínica médica.

Realizaremos o cadastro de médicos, pacientes e consultas. Em seguida, faremos o code review desses cadastros e aplicaremos técnicas de segurança.

Pré-requisitos

Par que você tenha a melhor experiência nesse curso é importante que você tenha conhecimento sobre:

A API Voll Med já faz todos esse passo a passo. Por isso é importante que você saiba identificá-los no banco de dados, afinal, faremos modificações nas interações.

Esperamos que você tenha se interessado pelo conteúdo!

Vamos nessa?

Lidando com SQL Injection - Conhecendo a API

Nesse curso trabalharemos com a API Voll Med, na qual faremos um code review.

Antes de fazermos uma análise de vulnerabilidade, conheceremos melhor a API.

Conhecendo a API

Para ter acesso Voll Med na sua máquina, basta acessar o repositório e clonar a API.

Feito isso, vamos analisá-la. Temos uma pasta nomeada de "src" que possui todos os arquivos em TypeScript, além de outros diretórios como auth, avaliacoes e consultas. Isso significa que a API faz diversas requisições relacionadas a esses serviços da clínica.

Nessa mesma pasta, também encontramos os arquivos data-source.ts e o server.ts que estão relacionados as configurações do banco de dados e servidor.

Fora da pasta encontramos o arquivo .env que possui algumas variáveis de ambiente que precisam ser configuradas para rodar o servidor.

E também arquivos de configurações, como o docker-compose.yaml, que roda o servidor por meio do Docker. Faremos isso agora.

Primeiro abrimos o terminal. Depois, passamos o comando docker-compose up seguido de "Enter".

docker-compose up

Assim, rodamos a aplicação. No nosso caso, deu um erro de conflito com a porta 3306, a qual estamos utilizando no banco de dados.

Para descobrirmos o processo que está utilizando esse comando escrevemos no terminal sudo lsof -i :3306, seguido de "Enter".

sudo lsof -i :3306

Descobrimos que quem está utilizando é o PID USER 1870. Precisaremos matá-lo, então, passamos o comando sudo kill 1870.

sudo kill 1870

Em seguida, passamos o comando docker-compose up. Agora deu certo!

Lembrando que é muito importante que você faça esse comando antes de começarmos a alterar a API.

Para interagir com a API utilizaremos o Insomnia. Ao abri-lo, na lateral esquerda da tela, encontramos diversas pastas como "Autenticação", "Pacientes" e "Especialistas".

Dentro dessas pastas encontramos as requisições http, protocolos utilizados para interagir com a API.

Desenvolvemos um conteúdo explicativo no Preparando Ambiente sobre como o Insomnia deve ser configurado.

Feito isso, voltamos para o VS Code. No terminal, notamos que o servidor está pronto para ser utilizado.

Além disso, como a API é dividida em pastas por funcionalidades, você pode encontrar arquivos controladores, Controller.ts ou entidades, Entity.ts.

Essa é a organização da API, que também utiliza algumas ferramentas, como o Typescript, o servidor pelo Express e o banco de dados no MySQL.

Caso você não tenha familiaridade com essas ferramentas, não se preocupe. Tudo o que manipularemos ao longo do curso faremos um passo a passo bem detalhado.

O próximo passo é analisar quais são as vulnerabilidades do Voll Med. A partir disso, poderemos identificar quais melhorias podemos aplicar.

Até o próximo vídeo!

Lidando com SQL Injection - Vulnerabilidade de SQL Injection

Agora que já conhecemos a API Voll Med e rodamos o comando docker-compose up, podemos fazer requisições.

Começamos abrindo o Insomnia. Na lateral esquerda, clicamos na pasta "Paciente" e depois em POST Cadastro Paciente.

Percebemos que a rota é feita por meio da url "localhost:3000/paciente". Nesse POST enviaremos dados por meio de um JSON que pede diversos dados como CPF.

Para isso, utilizaremos o gerador de CPF do 4devs no navegador. Ao acessá-lo, nos deparamos com alguns campos de preenchimento.

O primeiro se refere a pontuação do CPF, como não queremos, selecionamos a opção "Não". Depois, no campo "Estado de Origem do CPF" deixamos selecionado a opção "Indiferente". Após, clicamos no botão "Gerar CPF".

Clicamos para copiar o CPF que foi gerado. Depois, voltamos para o Insomnia para criar o cadastro do paciente.

Criando o cadastro do paciente

Na primeira linha de código, em cpf, colamos o número gerado no 4devs. Em nome, escrevemos Vinicius e em e-mail passamos vinicius@email.com. Em estaAtivo, manteremos como true.

Abaixo encontramos outros dados, como:

A única regra para criar novos pacientes é que o CPF seja único, portanto, como o restante dos dados já estavam preenchidos, manteremos.

O planosSaude está preenchido como [1], pois esse número indica um plano específico criado no front-end. Nesse caso o 1 se refere a Unimed.

Considerando tudo isso, o código fica da seguinte forma:

{
"cpf": "70792109090",
"nome": "Vinicius",
"email": "vinicius@email.com",
"estaAtivo":true,
"endereco": {
"cep": 38410272,
"rua": "Rua 28",
"numero": 1020,
"complemento": "casa",
"estado": "MG"

},
"senha": "senhaforte123",
"telefone": "27999335534",
"possuiPlanoSaude": true,
"planosSaude":[1],
"historico": ["sinusite, moderado"],
"imagemurl":
"https://media.discordapp.net/attachments/885931151980658698/1121873215606751232/shutterstock_1151921795.jpg"
}

No topo direito da tela, clicamos no botão "Send" para enviar os dados. Feito isso, o paciente é cadastrado. Aparentemente está tudo certo com nossa aplicação, até mesmo um id foi gerado para o paciente.

Na lateral esquerda do Insomnia, encontramos um GET do tipo Consulta por Paciente, clicamos nele. Verificaremos se o paciente Vinicius foi mesmo cadastrado.

No centro da tela, encontramos a seguinte url:

http://localhost:3000/paciente/consulta-por-paciente?userInput=Camila

Conseguimos entender que o userInput é um parâmetro que precisa ser enviado na url, nesse caso o nome do paciente. Sendo assim, apagamos o "Camila" e escrevemos "Vinicius". Feito isso, temos como resposta todos os dados do Vinicius.

Existem alguns cuidados que podemos tomar em relação a colocar nomes na url. Aprenderemos isso no vídeo seguinte.

Te esperamos lá!

Sobre o curso Desenvolvimento Seguro: estratégias de segurança para dados de entrada

O curso Desenvolvimento Seguro: estratégias de segurança para dados de entrada possui 148 minutos de vídeos, em um total de 56 atividades. Gostou? Conheça nossos outros cursos de Segurança em DevOps, ou leia nossos artigos de DevOps.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Segurança acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas