Segurança e melhores práticas de desenvolvimento web: MVC, gerenciamento de sessões e defesa contra ataques comuns

Padrão MVC

MVC (Model-View-Controller) é um padrão de design de software amplamente utilizado para simplificar o processo de desenvolvimento de aplicativos. Torna a estrutura do aplicativo mais clara, separando o acesso aos dados, a interface do usuário e a lógica de negócios.

Componentes do MVC

1. Modelo

  • Definição : Representa os dados e a lógica de negócios de um aplicativo.
  • Responsabilidades :
    • Interaja com o banco de dados
    • Operações lógicas para processamento de dados
  • Implementação em JavaWeb :
    • Use a classe POJO (Plain Old Java Object), que geralmente corresponde à tabela do banco de dados um para um
    • DAO (Data Access Object) é responsável pela interação do banco de dados
    • Camada de serviço implementa lógica de negócios
    • Estruturas ORM (Mapeamento Objeto-Relacional), como Hibernate, podem ser usadas para simplificar operações de banco de dados

2. Ver

  • Definição : Responsável por apresentar os dados do modelo aos usuários.
  • Responsabilidades : Exibir dados e fornecer interface de usuário.
  • Implementação em JavaWeb :
    • JSP (JavaServer Pages) comumente usado
    • Você também pode usar mecanismos de modelo modernos, como Thymeleaf

3. Controlador

  • Definição : Lidar com solicitações de usuários e coordenar modelos e visualizações.
  • Responsabilidades :
    • receber entrada do usuário
    • Chame a lógica de negócios do modelo
    • Visualização de atualização
  • Implementação em JavaWeb :
    • Usando Servlets da maneira tradicional
    • Usando classes anotadas @Controller na estrutura Spring

Objetos JSP integrados

JSP fornece vários objetos integrados que simplificam bastante o processo de desenvolvimento web. A seguir está uma visão geral dos principais objetos integrados:

  1. solicitação (HttpServletRequest)
    • Passe a solicitação enviada pelo cliente para o servidor
    • Contém parâmetros, URL, informações de cabeçalho, etc.
  2. resposta (HttpServletResponse)
    • Suporta a resposta enviada do servidor para o cliente
    • Cabeçalhos de resposta, códigos de status, etc. podem ser definidos
  3. páginaContexto (PageContext)
    • Fornece acesso a outros objetos integrados
    • Contém métodos para toda a página, como obter, definir e excluir propriedades
  4. sessão (HttpSession)
    • Armazenar informações de estado durante uma sessão
  5. aplicação (ServletContext)
    • Compartilhe dados em todo o aplicativo
  6. fora (JspWriter)
    • Envie conteúdo HTML para o cliente
  7. configuração (ServletConfig)
    • Contém parâmetros para inicializar o Servlet
  8. página (Objeto)
    • Representa o objeto Servlet atual
  9. exceção (lançável)
    • Usado apenas em páginas de erro (isErrorPage=true)
    • Contém informações de exceção

Esses objetos integrados facilitam muito o processamento de solicitações HTTP. Por exemplo:

  • Use requestpara obter o conteúdo da solicitação do usuário
  • sessionObtenha informações de status da sessão usando
  • outEnvie HTML para o cliente usando

Comparação JSP e Servlet

JSP (JavaServer Pages) e Servlet são tecnologias comumente usadas no desenvolvimento JavaWeb, usadas principalmente para gerar conteúdo web dinâmico. Embora seus objetivos sejam semelhantes, há diferenças óbvias na forma como são usados ​​e nos cenários aplicáveis.

1. Sintaxe e facilidade de uso

JSP

  • Baseado em HTML, permitindo que o código Java seja incorporado em HTML
  • O suporte para Expression Language (EL) e JSTL simplifica o acesso a dados e operações comuns
  • Mais adequado para gerar e exibir visualizações (View)

Servlet

  • Código Java puro
  • Relativamente complicado ao gerar HTML
  • Mais adequado para lidar com lógica de negócios complexa

2. Método de compilação

JSP

  • Compilar na primeira solicitação
  • Recompilar automaticamente após alterações de código, sem necessidade de reiniciar o servidor

Servlet

  • Compilado na inicialização do servidor ou na primeira solicitação
  • Depois de compilar uma vez, não há necessidade de recompilar. As alterações no código exigem a reinicialização do servidor.

3. Objetivo principal

JSP

  • Gerar e exibir visualizações (páginas HTML)
  • Adequado para lidar com lógica de exibição simples

Servlet

  • Lidar com a lógica de negócios
  • Lidar com operações de back-end, como envio de formulários e consulta de banco de dados

4. Aplicação em padrão MVC

No desenvolvimento real, JSP e Servlet são geralmente usados ​​juntos para implementar o padrão de design MVC (Model-View-Controller):

  • Controlador : Servlet processa solicitações de usuários e executa lógica de negócios
  • Modelo : implementação POJO (Plain Old Java Object), armazenando dados da camada de aplicação
  • Visualização : JSP exibe dados para usuários

Essa combinação aproveita ao máximo as vantagens de ambos e melhora a capacidade de manutenção e escalabilidade do código.

Comparação de sessões e cookies

Sessões e Cookies são tecnologias web importantes para armazenar informações do usuário, mas diferem significativamente em vários aspectos.

1. Local de armazenamento

  • Sessão : armazenada no lado do servidor, cada usuário possui uma sessão única.
  • Cookie : armazenado no cliente (navegador), configurado via cabeçalho de resposta HTTP.

2. Capacidade de armazenamento

  • Cookie : Pequena capacidade, geralmente não superior a 4 KB.
  • Sessão : Não há limite em teoria, mas muitos podem ocupar muita memória do servidor.

3. Tipo de dados

  • Cookie : só pode armazenar strings, caracteres especiais precisam ser codificados.
  • Sessão : pode armazenar qualquer tipo de dados (como strings, números, objetos, etc.).

4. Ciclo de vida

  • Biscoito :
    • Um tempo de expiração claro pode ser definido.
    • Quando não há configuração de tempo de expiração, ele só é válido na sessão atual do navegador.
  • Sessão :
    • Controlado pelo servidor, geralmente com prazo de validade definido.
    • O servidor pode ser excluído automaticamente quando o usuário fica inativo por um longo período de tempo.

5. Segurança

  • Cookie : armazenado no lado do cliente, possui baixa segurança e pode ser roubado ou modificado.
  • Sessão : armazenada no servidor, os usuários não podem acessá-la diretamente e a segurança é alta.

6. Cenários de aplicação

  • Cookie : Adequado para armazenar pequenas quantidades de dados com baixos requisitos de segurança.
  • Sessão : Adequado para armazenar grandes quantidades de dados com altos requisitos de segurança.

7. Impacto no desempenho

  • Cookie : transportado em todas as solicitações HTTP, o que pode afetar a eficiência da transmissão da rede.
  • Sessão : Não afeta a transmissão da rede, mas pode aumentar a carga do servidor.

Selecione sugestões

  • Precisa armazenar uma grande quantidade de dados e possui altos requisitos de segurança: use Session.
  • Apenas uma pequena quantidade de dados precisa ser armazenada e os requisitos de segurança não são elevados: utilize cookies.
  • Considere usá-los em combinação: o cookie armazena o ID da sessão e a sessão armazena dados específicos.

Login único: soluções quando os cookies estão desativados

Single Sign-On (SSO) é um método que permite aos usuários acessar vários sistemas ou serviços relacionados por meio de uma autenticação. Tradicionalmente, o SSO dependia de cookies para rastrear o estado da sessão do usuário. Contudo, quando os cookies são desativados, precisamos adotar alternativas. Aqui estão várias soluções possíveis, cada uma com seus prós e contras:

1. Reescrita de URL

Princípio: Anexe o identificador de sessão (como SessionID) ao URL.

vantagem:

  • Simples e fácil de implementar
  • Não depende de armazenamento do lado do cliente

deficiência:

  • Risco de segurança: SessionID pode ser interceptado ou vazado
  • URLs tornam-se longos e feios
  • Pode afetar o SEO

Cenário de uso: Adequado para sistemas internos com baixos requisitos de segurança

2. Ocultar campos do formulário

Princípio: Adicione campos ocultos ao formulário HTML para armazenar informações da sessão.

vantagem:

  • Relativamente seguro e não exposto diretamente no URL
  • Simples de implementar

deficiência:

  • Aplica-se apenas a interações baseadas em formulário
  • Não é possível lidar com solicitações que não sejam de formulário (como AJAX)

Cenário de uso: adequado para aplicações web tradicionais baseadas em formulários

3. Armazenamento na Web (localStorage/sessionStorage)

Princípio: Use a API Web Storage do HTML5 para armazenar informações de sessão no cliente.

vantagem:

  • Persistência de dados (localStorage) ou persistência de sessão (sessionStorage)
  • Maior capacidade de armazenamento
  • Não enviado automaticamente com solicitação HTTP, a transmissão de dados pode ser controlada

deficiência:

  • Requer suporte a JavaScript
  • Potenciais riscos de segurança XSS

Cenários de uso: adequados para aplicações web modernas, especialmente aplicações de página única (SPA)

4. Autenticação baseada em token (como JWT)

Princípio: O servidor gera um token contendo informações de identidade do usuário e o cliente armazena e inclui o token em cada solicitação.

vantagem:

  • Sem estado, fácil de expandir
  • Bom suporte entre domínios
  • Pode conter informações valiosas do usuário
  • Alta segurança (se implementada corretamente)

deficiência:

  • A implementação é relativamente complexa
  • O gerenciamento de tokens (por exemplo, atualização, revogação) requer considerações adicionais

Cenários de uso: Adequado para aplicações web modernas e APIs que exigem alta segurança e escalabilidade

Selecione sugestões

  • Para aplicativos com altos requisitos de segurança, evite usar reescrita de URL
  • Se for uma aplicação moderna baseada em HTML5, dê prioridade ao Web Storage ou abordagem baseada em token
  • Para sistemas que exigem um alto grau de segurança e escalabilidade, são recomendados métodos de autenticação baseados em token, como JWT
  • Sempre que possível, combine métodos para melhorar a compatibilidade e a segurança

Lembre-se, não importa o método escolhido, tenha a segurança em mente e siga as práticas recomendadas durante a implementação.

Exclusão de sessão em aplicativo Web

Em aplicações web, as sessões podem ser excluídas devido aos seguintes fatores:

1. Tempo limite da sessão

A maioria das estruturas permite definir tempos limite. Se uma sessão específica não acessar o servidor durante esse período, ela será automaticamente excluída.

  • Exemplo : No Java Servlet, o timeout pode ser definido através do web.xmlarquivo de configuração.<session-config>

2. Exclusão manual

O código do aplicativo pode excluir sessões explicitamente.

  • Exemplo : No Java Servlet, você pode usar HttpSession.invalidate()o método para excluir a sessão.

3. Reinicialização do servidor

  • Padrão : quando o servidor for reiniciado, todas as sessões na memória serão excluídas.
  • Exceção : alguns servidores podem persistir sessões no disco e restaurá-las após reinicializações.

4. Feche o navegador

  • Para sessões baseadas em cookies (a implementação mais comum), o cookie de sessão geralmente é excluído quando o navegador é fechado.
  • Isso não exclui imediatamente a sessão no lado do servidor, a menos que um tempo limite de sessão seja definido ou o servidor tome medidas.

5. Comportamento específico do servidor

O gerenciamento de sessões é feito pelo servidor web e pode variar entre diferentes servidores:

  • Alguns servidores realizam verificações de tempo limite periodicamente e excluem sessões expiradas.
  • Outros servidores podem verificar o tempo limite da sessão ao receber solicitações.

melhores práticas

  1. Defina tempos limite apropriados com base nas necessidades de segurança do seu aplicativo.
  2. Implemente a função de logout manual para que o usuário possa invalidar ativamente a sessão após concluir a operação.
  3. Considere usar cookies HTTPOnly seguros para armazenar IDs de sessão para maior segurança.
  4. Entenda a política de gerenciamento de sessão do servidor específico que você está usando.

Nota: O comportamento específico pode variar dependendo do servidor web, da estrutura do aplicativo e das definições de configuração.

O processo de criação de uma instância de Servlet no Tomcat

Como um contêiner Web que implementa a especificação Servlet, o Tomcat é responsável por criar e gerenciar o ciclo de vida dos objetos Servlet. A seguir está o processo detalhado de criação e gerenciamento de instâncias de Servlet no Tomcat:

1. Carregue a classe Servlet

Quando o Tomcat recebe uma solicitação e precisa criar uma classe Servlet específica:

  • Chame o carregador de classes (ClassLoader) para carregar a classe especificada
  • Se a classe já estiver carregada, pule esta etapa

2. Instancie a classe Servlet

  • Tomcat usa o mecanismo de reflexão Java Class.newInstance()para criar uma instância de Servlet
  • Este método chama o construtor sem parâmetros da classe Servlet
  • Nota: Se a classe não tiver um construtor sem parâmetros ou o construtor estiver inacessível (como privado), uma exceção será lançada

3. Inicialize o objeto Servlet

  • Tomcat chama init(ServletConfig config)o método da instância do Servlet
  • Passe ServletConfigo objeto, incluindo parâmetros de inicialização
  • Esta etapa permite que o Servlet execute quaisquer operações de configuração necessárias

4. Processe a solicitação (chame o método de serviço)

  • Após a conclusão da inicialização, o Tomcat chama o service()método Servlet para processar a solicitação.
  • service()Os métodos geralmente recebem dois parâmetros:
    • HttpServletRequestExemplo: Representa a solicitação do cliente
    • HttpServletResponseExemplo: Indica a resposta do servidor

5. Gerenciamento do ciclo de vida do servlet

  • As instâncias de servlet geralmente são singletons e apenas uma instância de cada classe de servlet é criada.
  • Em um ambiente multithread, cada solicitação do cliente é tratada por um thread separado
  • Os desenvolvedores precisam garantir a segurança do thread dos Servlets

6. Destruição de servlets

  • Quando o Servlet não é mais necessário ou o servidor é desligado, o Tomcat chama o destroy()método do Servlet
  • Este método é usado para liberar recursos e realizar operações de limpeza

Coisas a serem observadas

  1. Mecanismo de reflexão : newInstance()os métodos fazem parte da API de reflexão Java, permitindo que objetos sejam criados dinamicamente em tempo de execução
  2. Segurança de thread : Como o Servlet é um singleton, atenção especial precisa ser dada às questões de segurança de thread em um ambiente multithread.
  3. Considerações de desempenho : o recurso singleton do Servlet ajuda a melhorar o desempenho, mas também traz desafios de segurança de thread.
  4. Tratamento de erros : ao longo de todo o processo, o Tomcat precisa tratar adequadamente possíveis exceções, como falhas no carregamento de classes, erros de instanciação, etc.

Através deste processo, o Tomcat pode gerenciar com flexibilidade o ciclo de vida do Servlet e realizar as funções principais do contêiner Servlet.

Ataques de injeção de SQL e suas medidas de prevenção

A injeção de SQL é uma forma comum e perigosa de ataque à rede. Os invasores tentam manipular consultas de banco de dados inserindo código SQL malicioso na entrada do usuário para obter informações confidenciais ou adulterar dados. Para prevenir eficazmente ataques de injeção de SQL, as seguintes medidas principais podem ser tomadas:

  1. Use declarações preparadas
    • Princípio: Antes de executar a instrução SQL, determine a estrutura da consulta e depois passe os parâmetros.
    • Vantagens: Os parâmetros não serão interpretados como códigos SQL, evitando efetivamente a injeção.
    • Implementação: como em Java usando PreparedStatementclasses.
  2. Use consultas parametrizadas
    • Semelhante às instruções preparadas, garante que a entrada do usuário seja tratada como dados e não como código.
    • Aplicável a diversas linguagens de programação e sistemas de banco de dados.
  3. Validação estrita de entrada do usuário
    • Filtre e valide todas as entradas do usuário.
    • Por exemplo: restrinja os nomes de usuário a letras e números.
    • Rejeite ou escape de personagens potencialmente perigosos.
  4. Implementar o princípio do menor privilégio
    • Controle rigorosamente as permissões de acesso ao banco de dados.
    • Dê aos usuários apenas as permissões mínimas necessárias para concluir as operações necessárias.
    • Mesmo que ocorra a injeção, o dano potencial pode ser limitado.

Ao combinar esses métodos, o risco de ataques de injeção de SQL pode ser reduzido significativamente. Deve-se notar que as medidas de segurança devem ser multifacetadas e não devem basear-se apenas num único método de defesa. A conscientização contínua sobre a segurança e as revisões regulares do código são igualmente importantes para ajudar a identificar e corrigir possíveis vulnerabilidades em tempo hábil.

Introdução ao ataque e defesa XSS

Ataque XSS

XSS (cross-site scripting) é um método de ataque que injeta scripts maliciosos em páginas da web para que esses scripts possam ser executados nos navegadores de outros usuários. Quando um usuário visita uma página da Web que contém scripts maliciosos, esses scripts serão executados no navegador do usuário para realizar operações maliciosas, como:

  • Obtenha informações do usuário
  • Adulteração de conteúdo da web
  • Execute ações não autorizadas

Maneiras de prevenir XSS

  1. Escape da entrada do usuário : escape de todos os dados fornecidos pelo usuário para garantir que sejam analisados ​​pelo navegador como texto simples e não executados como script.
  2. Política de segurança de conteúdo (CSP) : CSP é um mecanismo de segurança do navegador que pode restringir efetivamente a execução e o carregamento dos recursos do navegador. Por exemplo, restringir páginas da web para executar e carregar apenas scripts do mesmo nome de domínio pode impedir efetivamente o XSS.
  3. Verificação de entrada : verifica as informações enviadas pelo usuário e recusa-se a processá-las quando for constatado que contém conteúdo que pode causar injeção de XSS.
  4. Use cookies somente HTTP : use o sinalizador somente HTTP para modificar cookies contendo informações confidenciais para evitar que o conteúdo do cookie seja obtido ou modificado por JavaScript.
  5. Evite usar código JS inseguro : alguns métodos JS (como innerHTML) apresentam riscos de segurança e devem ser evitados tanto quanto possível.

Para se defender eficazmente contra ataques XSS, é melhor usar uma combinação dos métodos acima para construir um mecanismo de defesa multicamadas. Auditorias e atualizações regulares de segurança também são medidas importantes para manter seu site seguro.

FCRCS

CSRF (Cross-site Request Forgery) é um ataque à segurança de rede que explora a identidade autenticada de um usuário em um site confiável para realizar ações não autorizadas. O processo de ataque é o seguinte:

  1. O invasor constrói um site ou link malicioso.
  2. Induzir o usuário alvo a clicar no link ou visitar um site malicioso.
  3. Se o usuário estiver conectado ao site de destino, suas informações de autenticação de identidade (como cookies) serão enviadas automaticamente com a solicitação.
  4. O invasor usa essas informações de autenticação para enviar solicitações forjadas ao site de destino como usuário.
  5. O site de destino não consegue dizer se essas solicitações são iniciadas por usuários reais e, portanto, realizam operações não autorizadas.

O perigo de um ataque CSRF é que ele pode ignorar a autenticação de identidade e realizar diversas operações sem o conhecimento do usuário, como modificar informações da conta, realizar transações, etc. Para evitar ataques CSRF, os sites precisam implementar medidas de segurança adicionais, como o uso de tokens anti-CSRF, verificação de cabeçalhos de referência, etc.

Acho que você gosta

Origin blog.csdn.net/tulingtuling/article/details/141095679
Recomendado
Clasificación