É um excesso de engenharia se eu adicionar proteção contra as ações intencionais de um usuário (para dizer o mínimo), se o dano que o usuário pode incorrer não está relacionado ao meu código?
Para esclarecer, estou expondo um serviço JSON RESTful simples como este:
GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item
O serviço em si não se destina a ser usado através de um navegador, mas apenas a partir de aplicativos de terceiros, controlados pelo usuário (como aplicativos de telefone, aplicativo de desktop etc.). Além disso, o serviço em si deve ser sem estado (ou seja, sem sessão).
A autenticação é feita com autenticação básica sobre SSL.
Estou falando de um possível comportamento "prejudicial" como este:
O usuário digita o URL GET em um navegador (sem motivo, mas ...). O navegador solicita a autenticação básica, processa-a e armazena a autenticação para a sessão de navegação atual. Sem fechar o navegador, o usuário visita um site mal-intencionado, que possui um javascript CSRF / XSRF malicioso que faz um POST para o nosso serviço.
O cenário acima é altamente improvável e sei que, do ponto de vista comercial, não devo me preocupar muito. Mas, para melhorar a situação, você acha que, se o nome de usuário / senha também forem necessários nos dados do JSON POST, isso ajudará?
Ou devo abandonar completamente a autenticação básica, livrar-me do GET e usar apenas POST / PUT com informações de autorização? Como as informações recuperadas através do GET também podem ser sensíveis.
Por outro lado, o uso de cabeçalhos personalizados considerou a implementação REST pura? Posso largar a autenticação básica e usar cabeçalhos personalizados. Dessa forma, pelo menos o ataque CSRF de um navegador pode ser evitado, e os aplicativos que usam o serviço definirão o nome de usuário / senha no heather personalizado. O que é ruim para essa abordagem é que agora o serviço não pode ser consumido a partir de um navegador.
fonte
Respostas:
Excesso de engenharia? De modo nenhum. As medidas anti-XSRF são uma parte necessária de qualquer aplicativo ou serviço da Web seguro. Pode ou não ser "altamente improvável" alguém escolher atacá-lo, mas isso não torna o seu software menos inseguro.
Os sistemas geralmente são atacados usando o XSRF e, embora os resultados sejam menos imediatos - obviamente ruins do que a injeção de SQL ou o XSS, eles são ruins o suficiente para comprometer todos os recursos interativos do usuário.
Isso significa que você não pode ter uma interface RESTful "pura", onde os únicos parâmetros são as propriedades da própria chamada. Você deve incluir algo na solicitação que um invasor não conseguiu adivinhar. Isso poderia ser o par nome de usuário por senha, mas que está longe de ser a única escolha possível. Você pode ter o nome de usuário e o token gerados a partir de um hash salgado da senha. Você pode ter tokens emitidos pelo próprio serviço no momento da autenticação (que pode ser lembrado na sessão ou verificado criptograficamente).
Não, as solicitações GET são usadas para solicitações de leitura que não possuem operação de gravação ativa (elas são "idempotentes"). São apenas operações de gravação que exigem proteção XSRF.
fonte
<script>
tag, deliberadamente (“JSONP”) ou acidentalmente ( JSON desprotegido ).Nunca confie em nada. Toda solicitação é um ataque. Todo usuário é um hacker. Se você desenvolver com essa mentalidade, seu aplicativo será muito mais seguro, estável e menos propenso a ser invadido por um usuário mal-intencionado. Basta uma pessoa inteligente para encontrar uma maneira de contornar sua segurança para que você esteja com sérios problemas com seus dados (um dos recursos mais valiosos ).
Se você identificou uma falha de segurança no seu aplicativo, faça tudo o que achar necessário para preencher a lacuna. Sua API, em especial, deve ser o software menos confiável que existe. Eu exigiria as credenciais e aceitaria solicitações de postagem.
fonte
Se o código for estabelecido e mantido, os casos extremos devem ser analisados e tratados caso a caso.
CORRIGIDO POR ALGUNS ERROS NA MINHA PARTE:
GET ainda deve ser usado como parte de um serviço RESTful adequado; a autenticação ainda deve estar presente em qualquer caso. O que eu estava tentando supor era que, para fins de segurança, GET é o mesmo que POST, mas o post faz seu trabalho sem colocar as informações em uma barra de endereços, o que tende a ser a grande diferença de segurança (e por que eu não gosto de GET), mas como postado por @Lee,
Como isso será usado por aplicativos de terceiros, deve-se seguir as boas práticas para um serviço RESTful, para que o implementador final não fique confuso nessa parte.
fonte
Você deve considerar todas as eventualidades plausíveis, incluindo o usuário ativamente malicioso e (com êxito) a engenharia reversa de quaisquer barreiras de "segurança pela obscuridade".
Mas, ao mesmo tempo, você deve avaliar o impacto de um hack de sucesso e a probabilidade de uma tentativa ocorrer. Por exemplo:
É menos provável que um serviço interno protegido por um firewall sólido seja sujeito a ataques do que um serviço na Internet pública.
O impacto de alguém derrubar um fórum de discussão de clientes é menor do que o roubo de cartões de crédito de clientes.
Meu argumento é que a "segurança total" é "infinitamente cara" ... e praticamente inatingível. Idealmente, você deve tomar suas decisões sobre onde traçar a linha com base em uma análise completa de custo-benefício.
fonte