[{"data":1,"prerenderedAt":911},["ShallowReactive",2],{"navigation_docs":3,"-atividades-atv-18-seguranca-devsecops":252,"-atividades-atv-18-seguranca-devsecops-surround":906},[4,96,189],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"⚙️ Engenharia de Software","i-lucide-book-open","\u002Fengenharia-software","1.engenharia-software",[10,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92],{"title":5,"path":7,"stem":11},"1.engenharia-software\u002Findex",{"title":13,"path":14,"stem":15},"📋 Plano de Ensino e Aplicações","\u002Fengenharia-software\u002Fengenharia-software-aplicacoes","1.engenharia-software\u002F01.engenharia-software-aplicacoes",{"title":17,"path":18,"stem":19},"Cap 01: Introdução e Natureza do Software","\u002Fengenharia-software\u002Fcap-01","1.engenharia-software\u002F02.cap-01",{"title":21,"path":22,"stem":23},"Cap 02: Modelos de Processo de Software","\u002Fengenharia-software\u002Fcap-02","1.engenharia-software\u002F03.cap-02",{"title":25,"path":26,"stem":27},"Cap 03: As Atividades do Processo","\u002Fengenharia-software\u002Fcap-03","1.engenharia-software\u002F04.cap-03",{"title":29,"path":30,"stem":31},"Cap 04: Metodologias Ágeis","\u002Fengenharia-software\u002Fcap-04","1.engenharia-software\u002F05.cap-04",{"title":33,"path":34,"stem":35},"Cap 05: Fundamentos de Requisitos","\u002Fengenharia-software\u002Fcap-05","1.engenharia-software\u002F06.cap-05",{"title":37,"path":38,"stem":39},"Cap 06: Elicitação e Levantamento","\u002Fengenharia-software\u002Fcap-06","1.engenharia-software\u002F07.cap-06",{"title":41,"path":42,"stem":43},"Cap 07: Especificação de Requisitos (ERS)","\u002Fengenharia-software\u002Fcap-07","1.engenharia-software\u002F08.cap-07",{"title":45,"path":46,"stem":47},"Cap 08: Validação e Gestão","\u002Fengenharia-software\u002Fcap-08","1.engenharia-software\u002F09.cap-08",{"title":49,"path":50,"stem":51},"Cap 09: Fundamentos da Modelagem","\u002Fengenharia-software\u002Fcap-09","1.engenharia-software\u002F10.cap-09",{"title":53,"path":54,"stem":55},"Cap 10: Diagrama de Casos de Uso (Conceitos)","\u002Fengenharia-software\u002Fcap-10","1.engenharia-software\u002F11.cap-10",{"title":57,"path":58,"stem":59},"Cap 11: Casos de Uso (Prática e Relações)","\u002Fengenharia-software\u002Fcap-11","1.engenharia-software\u002F12.cap-11",{"title":61,"path":62,"stem":63},"Cap 12: Diagrama de Classes (Conceitos)","\u002Fengenharia-software\u002Fcap-12","1.engenharia-software\u002F13.cap-12",{"title":65,"path":66,"stem":67},"Cap 13: Herança e Polimorfismo","\u002Fengenharia-software\u002Fcap-13","1.engenharia-software\u002F14.cap-13",{"title":69,"path":70,"stem":71},"Cap 14: Diagrama de Sequência","\u002Fengenharia-software\u002Fcap-14","1.engenharia-software\u002F15.cap-14",{"title":73,"path":74,"stem":75},"Cap 15: Diagramas Dinâmicos (Estados e Atividades)","\u002Fengenharia-software\u002Fcap-15","1.engenharia-software\u002F16.cap-15",{"title":77,"path":78,"stem":79},"Cap 16: Qualidade de Software (SQA)","\u002Fengenharia-software\u002Fcap-16","1.engenharia-software\u002F17.cap-16",{"title":81,"path":82,"stem":83},"Cap 17: Estratégias de Teste","\u002Fengenharia-software\u002Fcap-17","1.engenharia-software\u002F18.cap-17",{"title":85,"path":86,"stem":87},"Cap 18: Manutenção e Evolução","\u002Fengenharia-software\u002Fcap-18","1.engenharia-software\u002F19.cap-18",{"title":89,"path":90,"stem":91},"Cap 19: Gerência de Configuração (SCM)","\u002Fengenharia-software\u002Fcap-19","1.engenharia-software\u002F20.cap-19",{"title":93,"path":94,"stem":95},"Cap 20: Conclusão e Próximos Passos","\u002Fengenharia-software\u002Fcap-20","1.engenharia-software\u002F21.cap-20",{"title":97,"icon":98,"path":99,"stem":100,"children":101},"🛠️ Atividades","i-lucide-wrench","\u002Fatividades","2.atividades",[102,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185],{"title":103,"path":99,"stem":104},"📋 Orientações Gerais","2.atividades\u002Findex",{"title":106,"path":107,"stem":108},"📅 Cronograma","\u002Fatividades\u002Fcronograma","2.atividades\u002F01.cronograma",{"title":110,"path":111,"stem":112},"✏️ Atividade 01: Escopo e Personas","\u002Fatividades\u002Fatv-01-escopo","2.atividades\u002F02.atv-01-escopo",{"title":114,"path":115,"stem":116},"⚙️ Atividade 02: Processos de Software","\u002Fatividades\u002Fatv-02-processos","2.atividades\u002F03.atv-02-processos",{"title":118,"path":119,"stem":120},"📋 Atividade 03: Engenharia de Requisitos","\u002Fatividades\u002Fatv-03-requisitos","2.atividades\u002F04.atv-03-requisitos",{"title":122,"path":123,"stem":124},"📝 Atividade 04: User Stories e Backlog","\u002Fatividades\u002Fatv-04-backlog","2.atividades\u002F05.atv-04-backlog",{"title":126,"path":127,"stem":128},"🎭 Atividade 05: Casos de Uso (UML)","\u002Fatividades\u002Fatv-05-casos-uso","2.atividades\u002F06.atv-05-casos-uso",{"title":130,"path":131,"stem":132},"🖼️ Atividade 06: Prototipagem e Wireframes","\u002Fatividades\u002Fatv-06-prototipagem","2.atividades\u002F07.atv-06-prototipagem",{"title":134,"path":135,"stem":136},"🏛️ Atividade 07: Diagrama de Classes (UML)","\u002Fatividades\u002Fatv-07-classes","2.atividades\u002F08.atv-07-classes",{"title":138,"path":139,"stem":140},"🔀 Atividade 08: Diagrama de Sequência (UML)","\u002Fatividades\u002Fatv-08-sequencia","2.atividades\u002F09.atv-08-sequencia",{"title":142,"path":143,"stem":144},"🧪 Atividade 09: Qualidade e Testes","\u002Fatividades\u002Fatv-09-testes","2.atividades\u002F10.atv-09-testes",{"title":146,"path":147,"stem":148},"🏁 Atividade 10: Projeto Integrador Final","\u002Fatividades\u002Fatv-10-projeto-final","2.atividades\u002F11.atv-10-projeto-final",{"title":150,"path":151,"stem":152},"📊 Atividade 11: Diagrama de Atividades (UML)","\u002Fatividades\u002Fatv-11-atividades","2.atividades\u002F12.atv-11-atividades",{"title":154,"path":155,"stem":156},"🔄 Atividade 12: Diagrama de Transição de Estados (UML)","\u002Fatividades\u002Fatv-12-estados","2.atividades\u002F13.atv-12-estados",{"title":158,"path":159,"stem":160},"🏗️ Atividade 13: Arquitetura de Software e Padrões","\u002Fatividades\u002Fatv-13-arquitetura","2.atividades\u002F14.atv-13-arquitetura",{"title":162,"path":163,"stem":164},"🌐 Atividade 14: Modelagem de APIs REST e Swagger","\u002Fatividades\u002Fatv-14-apis-swagger","2.atividades\u002F15.atv-14-apis-swagger",{"title":166,"path":167,"stem":168},"🌿 Atividade 15: GitFlow e Trabalho Colaborativo","\u002Fatividades\u002Fatv-15-gitflow-colaboracao","2.atividades\u002F16.atv-15-gitflow-colaboracao",{"title":170,"path":171,"stem":172},"🚀 Atividade 16: Pipelines de CI\u002FCD com GitHub Actions","\u002Fatividades\u002Fatv-16-pipelines-cicd","2.atividades\u002F17.atv-16-pipelines-cicd",{"title":174,"path":175,"stem":176},"🐳 Atividade 17: Containerização de Ambientes com Docker","\u002Fatividades\u002Fatv-17-conteineres-docker","2.atividades\u002F18.atv-17-conteineres-docker",{"title":178,"path":179,"stem":180},"🔒 Atividade 18: Segurança no Desenvolvimento e OWASP","\u002Fatividades\u002Fatv-18-seguranca-devsecops","2.atividades\u002F19.atv-18-seguranca-devsecops",{"title":182,"path":183,"stem":184},"📈 Atividade 19: Métricas de Software, Estimativas e DORA","\u002Fatividades\u002Fatv-19-metricas-estimativas","2.atividades\u002F20.atv-19-metricas-estimativas",{"title":186,"path":187,"stem":188},"🏆 Atividade 20: Projeto Final Avançado (Fase 2)","\u002Fatividades\u002Fatv-20-projeto-final-avancado","2.atividades\u002F21.atv-20-projeto-final-avancado",{"title":190,"icon":191,"path":192,"stem":193,"children":194},"🖼️ Galeria de Projetos Integradores","i-lucide-image","\u002Fprojetos-integradores","3.projetos-integradores",[195,197,207,216,225,234,243],{"title":190,"path":192,"stem":196},"3.projetos-integradores\u002Findex",{"title":198,"path":199,"stem":200,"children":201},"🅿️ Projeto 01: Gestão de Estacionamentos","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002Findex",[202,203],{"title":198,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"README","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos\u002Freadme","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002F2.readme",{"title":208,"path":209,"stem":210,"children":211},"🔐 Projeto 02: Gerador de Senhas","\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002Findex",[212,213],{"title":208,"path":209,"stem":210},{"title":204,"path":214,"stem":215},"\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas\u002Freadme","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002F2.readme",{"title":217,"path":218,"stem":219,"children":220},"🍣 Projeto 03: Pedidos Restaurante","\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002Findex",[221,222],{"title":217,"path":218,"stem":219},{"title":204,"path":223,"stem":224},"\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante\u002Freadme","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002F2.readme",{"title":226,"path":227,"stem":228,"children":229},"📱 Projeto 04: Empréstimos Dispositivos","\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002Findex",[230,231],{"title":226,"path":227,"stem":228},{"title":204,"path":232,"stem":233},"\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos\u002Freadme","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002F2.readme",{"title":235,"path":236,"stem":237,"children":238},"📦 Projeto 05: Gestão de Estoque","\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002Findex",[239,240],{"title":235,"path":236,"stem":237},{"title":204,"path":241,"stem":242},"\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque\u002Freadme","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002F2.readme",{"title":244,"path":245,"stem":246,"children":247},"🛵 Projeto 06: Aplicativo de Delivery","\u002Fprojetos-integradores\u002Fpi-06-delivery","3.projetos-integradores\u002F06.pi-06-delivery\u002Findex",[248,249],{"title":244,"path":245,"stem":246},{"title":204,"path":250,"stem":251},"\u002Fprojetos-integradores\u002Fpi-06-delivery\u002Freadme","3.projetos-integradores\u002F06.pi-06-delivery\u002F2.readme",{"id":253,"title":178,"body":254,"description":900,"extension":901,"links":902,"meta":903,"navigation":572,"path":179,"seo":904,"stem":180,"__hash__":905},"docs\u002F2.atividades\u002F19.atv-18-seguranca-devsecops.md",{"type":255,"value":256,"toc":881},"minimark",[257,278,281,286,289,319,321,325,337,347,349,353,358,361,399,403,411,416,420,422,426,429,433,442,483,490,500,541,545,548,678,680,684,690,716,718,722,727,742,744,748,751,770,772,776,789,791,795,877],[258,259,260,261,265,266,269,270,273,274,277],"p",{},"Hoje, mergulharemos no universo do ",[262,263,264],"strong",{},"DevSecOps"," e do ",[262,267,268],{},"Desenvolvimento Seguro (Secure by Design)",". Aprenderemos a analisar vulnerabilidades antes mesmo de escrevermos o código, utilizando a metodologia de modelagem de ameaças ",[262,271,272],{},"STRIDE"," e as diretrizes internacionais da ",[262,275,276],{},"OWASP",".",[279,280],"hr",{},[282,283,285],"h2",{"id":284},"objetivo-da-aula","🎯 Objetivo da Aula",[258,287,288],{},"Ao final desta atividade, você será capaz de:",[290,291,292,296,302,309],"ul",{},[293,294,295],"li",{},"Compreender a importância da segurança proativa no ciclo de desenvolvimento de software.",[293,297,298,299,301],{},"Aplicar a metodologia ",[262,300,272],{}," para identificar ameaças na arquitetura do sistema.",[293,303,304,305,308],{},"Identificar as principais falhas do ",[262,306,307],{},"OWASP Top 10"," (como Injection e Broken Authentication).",[293,310,311,312,315,316,277],{},"Implementar defesas de código e configurações seguras em ",[262,313,314],{},"Java 17"," e ",[262,317,318],{},"Spring Boot",[279,320],{},[282,322,324],{"id":323},"o-cenário-prático-seu-desafio","🏢 O Cenário Prático (Seu Desafio)",[258,326,327,328,331,332,336],{},"Na ",[262,329,330],{},"TecProExpress",", a segurança costumava ser vista como \"problema do pessoal de redes\" ou \"algo para olhar depois que o software estiver pronto\". Essa mentalidade cobrou seu preço: na semana passada, um motorista mal-intencionado conseguiu manipular o parâmetro ",[333,334,335],"code",{},"id"," na URL da API e visualizou os dados pessoais de entrega e faturamento de outros clientes. Além disso, a tela de busca de fretes sofreu um ataque de injeção de SQL que quase apagou a tabela de produtos!",[338,339,340],"blockquote",{},[258,341,342,343,346],{},"\"Seu desafio como ",[262,344,345],{},"Engenheiro de Segurança de Aplicações (AppSec)"," é blindar a arquitetura da TecProExpress. Você conduzirá uma modelagem de ameaças STRIDE e programará mecanismos de proteção no Spring Boot para barrar ataques de injeção de código e vazamento de dados de autorização de forma definitiva.\"",[279,348],{},[282,350,352],{"id":351},"fundamentos-a-teoria-traduzida","🧠 Fundamentos: A Teoria Traduzida",[354,355,357],"h3",{"id":356},"_1-a-metodologia-stride-modelagem-de-ameaças","1. A Metodologia STRIDE (Modelagem de Ameaças)",[258,359,360],{},"Criada pela Microsoft, serve para mapear o que pode dar errado em um sistema com base em seis pilares fundamentais:",[290,362,363,369,375,381,387,393],{},[293,364,365,368],{},[262,366,367],{},"S","poofing (Falsificação de identidade): Alguém fingindo ser outro usuário.",[293,370,371,374],{},[262,372,373],{},"T","ampering (Adulteração de dados): Modificar dados em trânsito ou no banco.",[293,376,377,380],{},[262,378,379],{},"R","epudiation (Repúdio): Um usuário alegar que não realizou uma ação por falta de logs auditáveis.",[293,382,383,386],{},[262,384,385],{},"I","nformation Disclosure (Vazamento de informações): Expor dados confidenciais a pessoas não autorizadas.",[293,388,389,392],{},[262,390,391],{},"D","enial of Service (Negação de Serviço): Derrubar o sistema por sobrecarga de requisições.",[293,394,395,398],{},[262,396,397],{},"E","levation of Privilege (Elevação de privilégio): Um usuário comum executando funções de administrador.",[354,400,402],{"id":401},"_2-owasp-top-10","2. OWASP Top 10",[258,404,405,406,410],{},"A ",[407,408,409],"em",{},"Open Worldwide Application Security Project (OWASP)"," é uma fundação global sem fins lucrativos que mapeia e publica regularmente as 10 vulnerabilidades de segurança mais críticas e recorrentes em aplicações web no mundo todo.",[412,413,415],"h4",{"id":414},"vetores-de-ataque-comuns-vs-defesa-ativa","📊 Vetores de Ataque Comuns vs Defesa Ativa",[417,418],"mermaid",{"code":419},"flowchart TD\n    subgraph Vetores [\"Vetores de Ataque (Ameaças)\"]\n        A1[\"Injeção de SQL (SQLi)\"]\n        A2[\"Manipulação de URL (BOLA\u002FIDOR)\"]\n        A3[\"Brute Force (Senha Fraca)\"]\n    end\n\n    subgraph Defesas [\"Mecanismos de Defesa (Spring Boot)\"]\n        D1[\"Uso de Spring Data JPA \u002F Prepared Statements\"]\n        D2[\"Controle de Acesso baseado em Roles (Spring Security)\"]\n        D3[\"Criptografia BCrypt + Rate Limiting\"]\n    end\n\n    A1 -->|Mitigado por| D1\n    A2 -->|Mitigado por| D2\n    A3 -->|Mitigado por| D3\n\n    style Vetores fill:#ffebee,stroke:#c62828,stroke-width:2px\n    style Defesas fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px\n",[279,421],{},[282,423,425],{"id":424},"exemplo-guiado-codificação-segura-e-defesa-ativa","📖 Exemplo Guiado: Codificação Segura e Defesa Ativa",[258,427,428],{},"Vamos analisar um exemplo de código vulnerável em Spring Boot e como corrigi-lo imediatamente usando boas práticas de programação.",[354,430,432],{"id":431},"_1-evitando-a-injeção-de-sql-sql-injection","1. Evitando a Injeção de SQL (SQL Injection)",[258,434,435,438,439,277],{},[262,436,437],{},"Cenário vulnerável (O que NÃO fazer):"," Concatenar strings diretamente na consulta SQL permite que o atacante envie comandos maliciosos na variável ",[333,440,441],{},"input",[443,444,449],"pre",{"className":445,"code":446,"language":447,"meta":448,"style":448},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F VULNERÁVEL! Permite SQL Injection\npublic List\u003CPedido> buscarPedidosPorCidade(String input) {\n    String query = \"SELECT * FROM pedidos WHERE cidade = '\" + input + \"'\";\n    return entityManager.createNativeQuery(query, Pedido.class).getResultList();\n}\n","java","",[333,450,451,459,465,471,477],{"__ignoreMap":448},[452,453,456],"span",{"class":454,"line":455},"line",1,[452,457,458],{},"\u002F\u002F VULNERÁVEL! Permite SQL Injection\n",[452,460,462],{"class":454,"line":461},2,[452,463,464],{},"public List\u003CPedido> buscarPedidosPorCidade(String input) {\n",[452,466,468],{"class":454,"line":467},3,[452,469,470],{},"    String query = \"SELECT * FROM pedidos WHERE cidade = '\" + input + \"'\";\n",[452,472,474],{"class":454,"line":473},4,[452,475,476],{},"    return entityManager.createNativeQuery(query, Pedido.class).getResultList();\n",[452,478,480],{"class":454,"line":479},5,[452,481,482],{},"}\n",[258,484,485,486,489],{},"Se o atacante passar o valor ",[333,487,488],{},"Joinville' OR '1'='1",", a query executará retornando todos os pedidos do banco de dados!",[258,491,492,495,496,499],{},[262,493,494],{},"Cenário Seguro (Como implementar):"," Usar consultas parametrizadas (",[262,497,498],{},"Prepared Statements",") ou Spring Data JPA, que higienizam as entradas automaticamente.",[443,501,503],{"className":445,"code":502,"language":447,"meta":448,"style":448},"\u002F\u002F SEGURO! Parâmetros higienizados pelo JPA\u002FHibernate\npublic List\u003CPedido> buscarPedidosPorCidadeSeguro(String input) {\n    String query = \"SELECT p FROM Pedido p WHERE p.cidade = :cidade\";\n    return entityManager.createQuery(query, Pedido.class)\n                        .setParameter(\"cidade\", input)\n                        .getResultList();\n}\n",[333,504,505,510,515,520,525,530,536],{"__ignoreMap":448},[452,506,507],{"class":454,"line":455},[452,508,509],{},"\u002F\u002F SEGURO! Parâmetros higienizados pelo JPA\u002FHibernate\n",[452,511,512],{"class":454,"line":461},[452,513,514],{},"public List\u003CPedido> buscarPedidosPorCidadeSeguro(String input) {\n",[452,516,517],{"class":454,"line":467},[452,518,519],{},"    String query = \"SELECT p FROM Pedido p WHERE p.cidade = :cidade\";\n",[452,521,522],{"class":454,"line":473},[452,523,524],{},"    return entityManager.createQuery(query, Pedido.class)\n",[452,526,527],{"class":454,"line":479},[452,528,529],{},"                        .setParameter(\"cidade\", input)\n",[452,531,533],{"class":454,"line":532},6,[452,534,535],{},"                        .getResultList();\n",[452,537,539],{"class":454,"line":538},7,[452,540,482],{},[354,542,544],{"id":543},"_2-proteção-de-acesso-com-spring-security","2. Proteção de Acesso com Spring Security",[258,546,547],{},"Configuração para restringir privilégios em endpoints sensíveis da API (Evitando elevação de privilégios e Broken Access Control):",[443,549,551],{"className":445,"code":550,"language":447,"meta":448,"style":448},"@Configuration\n@EnableWebSecurity\npublic class SecurityConfig {\n\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        http\n            .csrf(csrf -> csrf.disable()) \u002F\u002F CSRF desabilitado apenas para fins didáticos de API\n            .authorizeHttpRequests(auth -> auth\n                \u002F\u002F Endpoints públicos\n                .requestMatchers(\"\u002Fapi\u002Fpublic\u002F**\").permitAll()\n                \u002F\u002F Apenas motoristas autenticados podem ver entregas\n                .requestMatchers(\"\u002Fapi\u002Fentregas\u002F**\").hasRole(\"MOTORISTA\")\n                \u002F\u002F Apenas gerentes podem deletar registros ou ver relatórios\n                .requestMatchers(\"\u002Fapi\u002Fadmin\u002F**\").hasRole(\"GERENTE\")\n                .anyRequest().authenticated()\n            )\n            .httpBasic(Customizer.withDefaults()); \u002F\u002F Autenticação básica simples\n        \n        return http.build();\n    }\n}\n",[333,552,553,558,563,568,574,579,584,589,595,601,607,613,619,625,631,637,643,649,655,661,667,673],{"__ignoreMap":448},[452,554,555],{"class":454,"line":455},[452,556,557],{},"@Configuration\n",[452,559,560],{"class":454,"line":461},[452,561,562],{},"@EnableWebSecurity\n",[452,564,565],{"class":454,"line":467},[452,566,567],{},"public class SecurityConfig {\n",[452,569,570],{"class":454,"line":473},[452,571,573],{"emptyLinePlaceholder":572},true,"\n",[452,575,576],{"class":454,"line":479},[452,577,578],{},"    @Bean\n",[452,580,581],{"class":454,"line":532},[452,582,583],{},"    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n",[452,585,586],{"class":454,"line":538},[452,587,588],{},"        http\n",[452,590,592],{"class":454,"line":591},8,[452,593,594],{},"            .csrf(csrf -> csrf.disable()) \u002F\u002F CSRF desabilitado apenas para fins didáticos de API\n",[452,596,598],{"class":454,"line":597},9,[452,599,600],{},"            .authorizeHttpRequests(auth -> auth\n",[452,602,604],{"class":454,"line":603},10,[452,605,606],{},"                \u002F\u002F Endpoints públicos\n",[452,608,610],{"class":454,"line":609},11,[452,611,612],{},"                .requestMatchers(\"\u002Fapi\u002Fpublic\u002F**\").permitAll()\n",[452,614,616],{"class":454,"line":615},12,[452,617,618],{},"                \u002F\u002F Apenas motoristas autenticados podem ver entregas\n",[452,620,622],{"class":454,"line":621},13,[452,623,624],{},"                .requestMatchers(\"\u002Fapi\u002Fentregas\u002F**\").hasRole(\"MOTORISTA\")\n",[452,626,628],{"class":454,"line":627},14,[452,629,630],{},"                \u002F\u002F Apenas gerentes podem deletar registros ou ver relatórios\n",[452,632,634],{"class":454,"line":633},15,[452,635,636],{},"                .requestMatchers(\"\u002Fapi\u002Fadmin\u002F**\").hasRole(\"GERENTE\")\n",[452,638,640],{"class":454,"line":639},16,[452,641,642],{},"                .anyRequest().authenticated()\n",[452,644,646],{"class":454,"line":645},17,[452,647,648],{},"            )\n",[452,650,652],{"class":454,"line":651},18,[452,653,654],{},"            .httpBasic(Customizer.withDefaults()); \u002F\u002F Autenticação básica simples\n",[452,656,658],{"class":454,"line":657},19,[452,659,660],{},"        \n",[452,662,664],{"class":454,"line":663},20,[452,665,666],{},"        return http.build();\n",[452,668,670],{"class":454,"line":669},21,[452,671,672],{},"    }\n",[452,674,676],{"class":454,"line":675},22,[452,677,482],{},[279,679],{},[282,681,683],{"id":682},"️-prática-obrigatória-1-matriz-de-ameaças-stride","🛠️ Prática Obrigatória 1: Matriz de Ameaças STRIDE",[258,685,686,689],{},[262,687,688],{},"Cenário:"," Analisando a segurança do seu projeto de grupo.",[691,692,693,698,701],"ol",{},[293,694,695,696,277],{},"Crie uma tabela Markdown contendo uma análise de ameaças do seu sistema utilizando a metodologia ",[262,697,272],{},[293,699,700],{},"Mapeie pelo menos 3 das 6 letras do STRIDE aplicadas ao seu projeto real.",[293,702,703,704,707,708,711,712,715],{},"Preencha as colunas: ",[262,705,706],{},"Elemento do Sistema"," (ex: Tela de Login), ",[262,709,710],{},"Ameaça Identificada"," (ex: Usuário interceptar tráfego) e ",[262,713,714],{},"Mitigação Proposta"," (ex: Uso obrigatório de HTTPS e senhas salvas com Hash BCrypt).",[279,717],{},[282,719,721],{"id":720},"️-prática-obrigatória-2-higienização-de-código","🛠️ Prática Obrigatória 2: Higienização de Código",[258,723,724,726],{},[262,725,688],{}," Identificação e correção de falhas de segurança no código.",[691,728,729,739],{},[293,730,731,732,735,736,277],{},"Crie um arquivo Markdown demonstrando um trecho de código hipotético ou real do seu sistema que seja vulnerável a ",[262,733,734],{},"Injeção de SQL"," ou ",[262,737,738],{},"Falha de Autorização",[293,740,741],{},"Apresente, logo abaixo, a versão corrigida desse código (Refatoração de Segurança), explicando qual técnica foi aplicada para eliminar a vulnerabilidade.",[279,743],{},[282,745,747],{"id":746},"instruções-de-entrega-microsoft-teams","📤 Instruções de Entrega (Microsoft Teams)",[258,749,750],{},"Após auditar e implementar as melhorias de segurança:",[691,752,753,764,767],{},[293,754,755,756,759,760,763],{},"Salve a sua matriz de ameaças e os trechos de código com o nome ",[333,757,758],{},"Atividade_18.md"," na pasta ",[333,761,762],{},"es-atv-18-seguranca-devsecops\u002F"," do seu repositório GitHub.",[293,765,766],{},"Certifique-se de fazer o commit e push para o repositório público.",[293,768,769],{},"Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.",[279,771],{},[282,773,775],{"id":774},"checkpoint-de-lógica","💡 Checkpoint de Lógica",[777,778,781,784,785,788],"callout",{"color":779,"icon":780},"primary","i-lucide-megaphone",[262,782,783],{},"Importante:"," ",[262,786,787],{},"Reflexão Profissional:","\nSuponha que seu sistema utilize criptografia reversível (como AES) para salvar as senhas dos usuários no banco de dados, em vez de um algoritmo de hash criptográfico não-reversível (como BCrypt ou PBKDF2). Se um invasor conseguir acesso de leitura à tabela de usuários, por que salvar senhas com criptografia AES é perigoso? O que o invasor precisaria obter para ler todas as senhas em texto puro? (Resposta: A criptografia AES é bidirecional (simétrica), o que significa que se houver a chave de criptografia, o dado pode ser totalmente descriptografado para texto original. Se o invasor acessar o banco de dados e obter a chave de descriptografia que geralmente fica salva no código ou nas variáveis de ambiente do servidor, ele conseguirá reverter todas as senhas. Algoritmos de Hash como o BCrypt são unidirecionais e usam a técnica de Salting, tornando matematicamente impossível reverter o hash de volta à senha original, garantindo proteção mesmo que o banco de dados seja roubado). 🛡️🔑🧠",[279,790],{},[282,792,794],{"id":793},"rubrica-formativa-de-avaliação","📊 Rubrica Formativa de Avaliação",[796,797,799,800,799,823],"table",{"style":798},"width:100%; border-collapse: collapse; font-family: sans-serif; margin: 20px 0; border: 1px solid #ddd; box-shadow: 0 4px 8px rgba(0,0,0,0.1);","\n  ",[801,802,803,804,799],"thead",{},"\n    ",[805,806,808,809,808,814,808,817,808,820,803],"tr",{"style":807},"background-color: #2c3e50; color: white;","\n      ",[810,811,813],"th",{"style":812},"padding: 12px; border: 1px solid #ddd; text-align: left;","Critério de Avaliação",[810,815,816],{"style":812},"Insuficiente (0% - 40%)",[810,818,819],{"style":812},"Regular (41% - 70%)",[810,821,822],{"style":812},"Excelente (71% - 100%)",[824,825,803,826,803,845,803,861,799],"tbody",{},[805,827,808,829,808,836,808,839,808,842,803],{"style":828},"background-color: #f8f9fa;",[830,831,833],"td",{"style":832},"padding: 10px; border: 1px solid #ddd;",[262,834,835],{},"Modelagem de Ameaças (STRIDE)",[830,837,838],{"style":832},"Tabela STRIDE ausente ou sem relação com os módulos do sistema.",[830,840,841],{"style":832},"Preenche 3 letras da matriz STRIDE mas com mitigações genéricas.",[830,843,844],{"style":832},"Matriz de Ameaças STRIDE completa identificando vulnerabilidades reais de arquitetura e mitigação técnica sólida (ex: HTTPS, BCrypt, RBAC).",[805,846,808,847,808,852,808,855,808,858,803],{},[830,848,849],{"style":832},[262,850,851],{},"Refatoração de Segurança & Prepared Statements",[830,853,854],{"style":832},"Não consegue identificar trechos vulneráveis a SQL Injection ou Broken Access Control.",[830,856,857],{"style":832},"Identifica a vulnerabilidade mas refatora sem usar consultas parametrizadas.",[830,859,860],{"style":832},"Demonstração impecável de código vulnerável vs. código refatorado seguro utilizando Prepared Statements\u002FJPA e Spring Security RBAC.",[805,862,808,863,808,868,808,871,808,874,803],{"style":828},[830,864,865],{"style":832},[262,866,867],{},"Entrega no GitHub",[830,869,870],{"style":832},"Entrega fora da pasta `es-atv-18-seguranca-devsecops\u002F`.",[830,872,873],{"style":832},"Arquivo entregue sem os blocos de código formatados.",[830,875,876],{"style":832},"Submete `Atividade_18.md` com tabelas STRIDE e trechos de código limpos e documentados no repositório.",[878,879,880],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":448,"searchDepth":461,"depth":467,"links":882},[883,884,885,891,895,896,897,898,899],{"id":284,"depth":461,"text":285},{"id":323,"depth":461,"text":324},{"id":351,"depth":461,"text":352,"children":886},[887,888],{"id":356,"depth":467,"text":357},{"id":401,"depth":467,"text":402,"children":889},[890],{"id":414,"depth":473,"text":415},{"id":424,"depth":461,"text":425,"children":892},[893,894],{"id":431,"depth":467,"text":432},{"id":543,"depth":467,"text":544},{"id":682,"depth":461,"text":683},{"id":720,"depth":461,"text":721},{"id":746,"depth":461,"text":747},{"id":774,"depth":461,"text":775},{"id":793,"depth":461,"text":794},"Bem-vindo a mais uma etapa crítica da sua jornada na Engenharia de Software! Até aqui, aprendemos a modelar, testar, automatizar e containerizar sistemas. Mas de que adianta um sistema incrivelmente rápido, com CI\u002FCD verde e rodando em Docker, se ele puder ser facilmente invadido por um hacker, vazando dados confidenciais dos usuários? 😱🔓","md",null,{},{"title":178,"description":900},"TE0UfOAswBBEp-mT7a6OB1FsrutUddqci5GP1IjVmSo",[907,909],{"title":174,"path":175,"stem":176,"description":908,"children":-1},"Bem-vindo a mais uma etapa prática da sua jornada na Engenharia de Software! Após automatizarmos nossos testes no pipeline de CI\u002FCD, agora resolveremos um dos problemas mais clássicos e irritantes no desenvolvimento de software: \"Na minha máquina funciona, por que não funciona no servidor de produção?\" 🤦‍♂️💻",{"title":182,"path":183,"stem":184,"description":910,"children":-1},"Bem-vindo a mais uma etapa indispensável da sua formação em Engenharia de Software! Nas últimas semanas, focamos intensamente em aspectos técnicos: codificação, arquitetura, testes, infraestrutura e segurança. Hoje, assumiremos o papel de Gestores de TI e Líderes Técnicos (Tech Leads) para responder a uma das perguntas mais desafiadoras feitas pelos diretores de qualquer empresa: \"Quando o sistema estará pronto e quão eficiente é a nossa equipe de engenharia?\" ⏰💼",1788375146252]