(def pessoa {:nome "Cácio José da Costa Silva"
:empresa "Alura"
:cargo "Instrutor e pagodeiro nas horas vagas"})Produtividade no desenvolvimento com Spring Boot e ChatGPT
Testes automatizados e qualidade com GitHub Copilot
Aumentando a qualidade com SAST e DSAT
15/07
14h a 17h
17/07
14h a 17h
19/07
14h a 17h
22/07
14h a 17h
24/07
14h a 17h
26/07
14h a 17h
29/07
14h a 17h
31/07
14h a 17h
Git e GitHub;
SQL;
Java e Spring Framework;
Protocolo HTTP;
Maven;
Integração de sistemas;
Docker.
Git;
Intellij IDEA (ou outra IDE);
Java e Maven;
Postman (idealmente);
Acesso ao ChatGPT e GitHub Copilot.
...vamos nos conhecer? 😃
Nome?
Área e faz o quê?
Programa em que linguagens?
Já usa IA generativa?
Módulo 1
Usos no desenvolvimento de software
Geração de Código
Refatoração e Otimização de Código
Automatização de Testes
Detecção de Bugs
Documentação
Design e Arquitetura de Software
Análise de Código e Revisão
Gerenciamento de Projetos
Prompts e limitações
Resposta nem sempre são perfeitas
Treinado com dados da internet
Pequenas mudanças no prompt podem gerar resposta diferentes
Limitações
Memória
Viés
Consistência
Alguns cuidados
Diretrizes gerais
Seja simples
Prompts simples funcionarão para a maioria dos caso
Tenha em mente os critérios de sucesso
Se você não sabe até onde quer chegar, vai vagar perdidamente
Viés
Consistência
Estrutura
Tarefa:
gere uma funcionalidade para listar todos os médicos.
Etapas:
Crie o Repository, o Service e o Controller para esta funcionalidade.
Contexto:
Esta é a entidade Medico que será consultada no banco de dados: CÓDIGO_DA_CLASSE.
Restrições:
A consulta deve ser ordenada pelo nome do médico. Ser paginada. E o tamanho da página deve ter 20 registros. O controller receberá o Pageable no método da funcionalidade.
Objetivo:
O objetivo é permitir que clientes consultem a a API de médicos.
Saída:
Explique as suas decisões na saída.
Suponha que o governo determine uma mudança no formato do número do CRM dos médicos, que a partir de agora deve seguir o seguinte padrão: XXXXXX-XX/UF.
Na classe DadosCadastroMedico, o atributo crm está anotado com @Pattern(regexp = "\\d{4,6}")
Com auxílio do ChatGPT:
Como foi? Seria mais fácil fazer sozinho?
Com auxílio do ChatGPT:
Com auxílio do ChatGPT:
DESAFIO: Tente acrescentar relatório de cobertura de testes no projeto.
Descrevendo o projeto
"Vou iniciar um projeto de desenvolvimento de um sistema de controle de um estacionamento de veículos. Preciso identificar os requisitos desse sistema entrevistando os futuros usuários. Que perguntas você sugere para um questionário que me ajude a identificar esses requisitos?"
PROMPT:
Especificando requisitos não funcionais
"Escreva uma lista de requisitos funcionais para controlar a operação de um estacionamento de veículos."
PROMPT:
Refinando requisitos
"Reescreva, considerando que haverá segmentação de veículos por motocicleta, automóvel e caminhão, tanto sem reboque quanto com reboque."
PROMPT:
Estimando esforço e prazo
"Considerando uma equipe formada por 1 dev sênior e 2 plenos e que cada dev trabalhará 40 horas por semana, calcule de forma objetiva a estimativa de esforço em meses para desenvolvimento desta aplicação utilizando pontos por caso de uso."
PROMPT:
Requisitos não funcionais
"Escreva os requisitos técnicos com dimensionamento e recursos para a operação de um sistema web com base de dados MySQL, backend em Java com Spring Boot e frontend em React, para atender a uma demanda de 10.000 usuários por dia. Considere que o sistema terá 3 páginas estáticas e 10 páginas dinâmicas cujo processamento é de uma média de 3 queries simples indexadas e com um máximo de 50 registros. Não haverá CLOB ou BLOB nas queries.
PROMPT:
Diagramas UML
"Escreva um diagrama de casos de uso dos requisitos discutidos acima para o PlantUML."
PROMPT:
Com auxílio do ChatGPT:
Definição
"A engenharia de prompt pode ser vista como um processo que envolve a elaboração, otimização e ajuste de instruções, perguntas e solicitações — os "prompts" — com o intuito de extrair respostas e ações específicas de sistemas embasados em Inteligência Artificial (IA) e Processamento de Linguagem Natural (PLN)."
Fonte: Engenharia de prompt para DEVS : um guia para aprender a usar a IA antes que IA aprenda a usar você. Ricardo Pupo Larguesa e Vivian Matsui. 1ª edição
Comunicação eficiente
Síntese resumida
Mantenha uma síntese resumida da conversa após algumas interações.
Módulo 2
O que é?
Vantagens
Explicar o código de outra pessoa e sugerir melhorias
Propor correções de código
Gerar casos de teste
Gerar documentação de código
etc...
Alguns dados
Alguns dados
Alguns dados
Boas práticas de prompt
DISCUSSÃO: Foi mais simples do que usar o ChatGPT? Quais vantagens notou no uso do Copilot? O que não saiu bem?
DISCUSSÃO: Foi mais simples do que usar o ChatGPT? Quais vantagens notou no uso do Copilot? O que não saiu bem?
Vamos testar a funcionalidade de cadastrar e listar médicos:
Vamos simular a API do VIA CEP para testar a integração com uma API externa.
Módulo 3
Princípios
Fases, Shift Left e Shift Right
Atividades e práticas
Atividades e práticas
Atividades e práticas
Atividades e práticas
Atividades e práticas
Atividades e práticas
Atividades e práticas
"Você foi contratado por uma empresa para avaliar se o sistema desenvolvido por eles possui problemas de segurança."
(Threat modeling)
Common Vulnerabilities and Exposures é uma lista pública de registro de ameaças e vulnerabilidades em software
Potencial perda, dano ou destruição de algo valioso para a vítima (sistema, reputação, inteligência de negócio, etc)
Uma fraqueza ou brecha que pode ser explorada
Conjunto de técnicas e scripts
Algo, ou alguém, que pode explorar a vulnerabilidade (criminoso, um funcionário extorquido/subornado, malware, etc)
Precisamos dizer no documento:
ID da entrada: #1
Descrição:
GET /perfil/form-atualizacao
Host: vollmed.com.br
Authorization: $token
SAÍDA:
Status code: 200
Content-type: text/html
$HTML_FORM_ATUALIZACAO
| ID | NOME | DESCRIÇÃO |
|---|---|---|
| 1 | Médico | Profissional, autenticado, que usa o sistema para atender pacientes. |
| 2 | Paciente | Pessoa, autenticada, que procura por médicos e agenda consulta com eles. |
| 3 | Credenciais de banco | Usuário e senha compartilhados entre desenvolvedores. Possui acesso de leitura e escrita. |
| 4 | Desenvolvedores | Equipe que tem acesso ao ambiente e permissão para modificar o sistema. |
| 5 | Acesso SSH ao servidor | Não sabemos certamente. Mas o GitHub usa para implantar o sistema. |
| 6 | Acesso às imagens do bucket S3 | API acessa para salvar imagens e o navegador consegue exibir na página. |
Elabore o mapeamento de dependências externas para uma funcionalidade "Notificações Push no Sistema de E-commerce", conforme descrito abaixo.
"O sistema de e-commerce implementa um serviço de notificações push para manter os usuários engajados e informados sobre várias atividades e promoções. As principais características desta funcionalidade incluem:
1. Plataformas Suportadas:
- Aplicativos móveis (iOS e Android)
2. Um painel de controle permite que os usuários gerenciem suas preferências de notificação
3. Análise e Métricas:
- O sistema rastreia taxas de abertura, engajamento e conversão das notificações enviadas."
| Ameaça | Serviço de segurança | |
|---|---|---|
| S | Spoofing | Authentication |
| T | Tampering | Integrity |
| R | Repudiation | Non-repudiation |
| I | Information disclosure | Confidentiality |
| D | Denial of service | Availability |
| E | Elevation of privilege | Authorization |
Categorização da ameaça
Exemplo
"Um atacante consegue alterar o valor do depósito a ser realizado em sua conta."
Tampering => Integridade
Exemplo
"Um usuário mais avançado consegue acessar contracheque de outros trocando o ID na URL."
Information disclosure
=>
Confidencialidade
Exemplo
"Um estelionatário consegue roubar as credenciais de um idoso e realizar um empréstimo."
Spoofing => Autenticação
Exemplo
"Um atacante consegue, via backdoor, executar comandos como root no SO."
Elevation of privilege
=>
Autorização
Exemplo
"Um desenvolvedor coloca, no código, um contador para um loop infinito no décimo acesso de uma página."
Denial of service => Disponibilidade
Exemplo
"Sabendo que o sistema não rastreia algumas atividades, o chefe do RH manda pagar horas extras à sua amante e nega que tenha sido ele."
Repudiation => Irretratabilidade
| Critério | |
|---|---|
| D | Damagem (dano) |
| R | Reproductibility (reprodutibilidade) |
| E | Exploitability (explorabilidade) |
| A | Affected users (usuários afetados) |
| D | Discoverability |
Classificação de severidade
Classificação
Classificação
Calculando o risco da atualização de perfil
| Critério | Descrição | Nota |
|---|---|---|
| Damage | Conseguimos alterar o ID do perfil atualizado alterando o campo hidden com essa informação | 2 |
| Reproductibiity | Atacante pode reproduzir em qualquer submissão do formulário | 3 |
| Exploitability | Qualquer usuário com conhecimento de HTML e HTTP consegue explorar | 3 |
| Affected users | Potencial para afetar todos os usuários | 3 |
| Discoverability | Uma simples análise do formulário no navegado é suficiente para descobrir | 3 |
| Cáculo | (2 + 3 + 3 + 3 + 3) / 5 | 2.8 |
Considere que o formulário possui um campo hidden com o ID do paciente/médico que terá o perfil atualizado. E que o backend não valide se o ID corresponde ao usuário autenticado no sistema.
Classifique a vulnerabilidade usando STRIDE e calcule sua gravidade com DREAD.
"O nosso banco de dados está exposto para a internet. Imagine que descobriram uma vulnerabilidade na tecnologia que usamos no banco de dados que permite que um atacante roube os dados dele sem precisar de credenciais, apenas executando um script que os criminosos disponibilizaram nas comunidades deles."
Autenticação
Autorização
PUT /api/telefone
Host: vollmed.com.br
Authorization: Bearer $TOKEN
Content-type: application/json
{
userId: 111,
numero: 61984481019
}Autorização
/**
* URLs com identificadores numéricos
* pode ser alvos de vulnerabilidades
*/
GET /api/medicos/1234/agenda
/**
* Usuário pode tentar visualizar
* recursos sem autorização
*/
GET /api/medicos/1235/agenda
Autorização
Proteção de dados
Validação de dados e integridade
Tratamento de erros
{
"error": {
"message": "Algo de errado não está certo.",
"code": "ERR-345"
}
}Logs e auditoria
Como funciona
Inspeção do Código-Fonte:
Identificação de Anomalias:
Geração de Relatórios:
TruffleHog com Docker e GitHub Actions
name: TruffleHog Scan Test
on:
push:
branches:
- main
jobs:
trufflehog:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup TruffleHog
run: docker pull trufflesecurity/trufflehog:latest
- name: Run TruffleHog
run: |
docker run --rm -v "$PWD:/pwd" trufflesecurity/trufflehog:latest github --repo https://github.com/cacio-costa/vollmed.github/workflows/truffle-hog-scan.yaml
Configure o TruffleHog no projeto (link da documentação).
TruffleHog no pre-commit
repos:
- repo: local
hooks:
- id: trufflehog
name: TruffleHog
description: Detect secrets in your data.
entry: bash -c 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --fail'
language: system
stages: ["commit", "push"].pre-commit-config.yaml
Habilitando pre-commit
# Ferramenta que ajuda na criação do hook pre-commit
pip install pre-commit
# Cria pre-commit usando o arquivo YAML
pre-commit installConfigure o TruffleHog para executar no pre-commit hook do Git.
repos:
- repo: local
hooks:
- id: trufflehog
name: TruffleHog
description: Detect secrets in your data.
entry: bash -c 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --fail'
language: system
stages: ["commit", "push"]Realizar análise do Sonar no projeto.
Realize o teste de varredura de API com o Nuclei.