Ocultação / ofuscação de IDs de banco de dados voltados para o público é realmente uma “melhor prática”?

23

Ouvi pessoas palestrando aqui e ali na internet que é uma boa prática ocultar os IDs de bancos de dados voltados para o público em aplicativos da web. Suponho que eles significam principalmente em formas e em urls, mas nunca li nada além de um bocado sobre o assunto.

EDIT : Claro, agora que pergunto isso, encontro alguns recursos sobre o assunto:

Esses links satisfizeram um pouco da minha curiosidade, mas as postagens da SO não têm muitos votos e não estão necessariamente centradas no tópico neste contexto, por isso não tenho certeza do que fazer, e algumas afirmam que a terceira link é falso. Vou deixar o resto do meu post intacto:


Entendo as diferenças entre obscuridade e segurança, e também como os dois podem trabalhar juntos, mas não consigo imaginar por que isso seria necessário.

Existe alguma verdade nisso, é apenas paranóia ou é totalmente totalmente falso?

Posso pensar em maneiras de fazer isso, mas é claro que adiciona muita complexidade ao código do aplicativo. Sob que circunstâncias isso seria útil? Se isso é algo que as pessoas costumam fazer, como é geralmente implantado? Hashing os identificadores? Algo mais? Parece muito trabalho para não haver muita segurança extra. Não estou procurando soluções reais, só quero ter uma idéia de como / por que as pessoas fariam isso no mundo real.

Isso é realmente considerado uma "melhor prática" ou é apenas uma micro-otimização de pouco valor?

NOTA : Acho que algumas pessoas podem ter entendido a idéia errada: não estou sugerindo que identificações difíceis de adivinhar seriam o único mecanismo de segurança, obviamente haveria as verificações de acesso habituais. Vamos supor que eles estejam no lugar e que simplesmente conhecer o id ou o hash de um registro não é suficiente para conceder acesso.

Wesley Murch
fonte

Respostas:

28

Não acho que seja tão importante, mas há alguns cenários em que isso pode ser importante, dependendo de outras decisões que você tomar.

Por exemplo, se você expusesse um ID de pedido gerado sequencialmente e tivesse um ataque de engenharia social com alguém ligando para o suporte ao cliente e dizendo "ei, acabei de gastar US $ 2000 em um computador novo e vocês me enviaram um pedido de outro cara para por um cabo de US $ 15, agora estou com US $ 2000 ", você pode gastar muito tempo tentando verificar o problema antes de concluir que é falso ou enviar um computador novo para o falsificador.

Existem variações semelhantes, menos sofisticadas, mas embaraçosas, sobre o tema; se um bandido incrementar um ID do pedido em um link enviado por e-mail para um recibo e se nenhuma validação adicional for feita para verificar se a pessoa que clicou no link tem o direito de visualizar o ID do pedido, de repente você está expondo inconscientemente informações particulares do cliente para a pessoa errada.

Nesses casos, se os números não forem seqüenciais, a exposição é levemente atenuada, pois é menos provável que a estimativa produza resultados interessantes. Por outro lado, agora você precisa de uma maneira conveniente de fazer referência a um ID de pedido em interações de suporte ao cliente que não resultarão em longas conversas repetidas com interações por telefone, enquanto seu representante tenta distinguir entre B, PD e T no número de ordem BPT2015D.

Eu diria que é muito difícil chamar essa ofuscação de "melhor prática", mas em certos cenários, pode reduzir a facilidade de explorar outra fraqueza no seu código de validação ou autorização. Por outro lado, não importa realmente se alguém sabe que você escreveu a postagem de blog # 1 ou # 2559. Se o ID não for uma informação valiosa, mesmo com conhecimento adicional, o argumento de que ofuscá-lo é uma prática recomendada terá menos peso.

Há um segundo argumento em potencial: o identificador do banco de dados pode levar você a uma implementação (ou instância) específica do banco de dados e quando sua empresa é comprada ou escolhe um concorrente e agora você precisa mesclar dois sistemas legados, ou o CEO sai bebendo com o representante do DynoCoreBase e eles decidem que agora você moverá todos os seus dados para o DynoCoreBase versão 13h e deseja que todas as chaves primárias sejam guias, e você deve criar algum tipo de camada de mapeamento para traduzir os IDs antigos em novos IDs para que URLs antigos não sejam quebrados, mas se esses cenários são importantes para você depende muito mais da natureza de seus negócios (e do envolvimento do cliente com esses IDs) do que de qualquer prática recomendada geral.

JasonTrue
fonte
2
Sinto que você é o único que entendeu minha pergunta. Definitivamente, pode "reduzir a facilidade de explorar outra fraqueza", como você diz, mas de que valor é esse? Alguém determinado vai realmente adiar meu algo como um hash salgado? Eu pensei que isso era mais uma técnica de "vantagem profissional", mas não a vejo na prática (ou talvez eu não notaria se o fizesse ...). Como você disse, conhecer o ID por si só não deve conceder acesso (acho que algumas pessoas perderam essa parte, eu a aceitei). Então, acho que concordo com sua avaliação geral.
Wesley Murch
9

Esta é a minha opinião:

Embora "segurança através da obscuridade" obviamente não seja suficiente, a obscuridade pode ajudar a segurança, mesmo que seja um pouco. Você precisa decidir se esse pouco de segurança psuedo vale o esforço extra necessário para implantar algo assim no seu aplicativo.

Há outro motivo fora da segurança em que posso pensar para implementar isso:

Privacidade

Digamos que estamos lidando com IDs de usuário no URL. Se o ID de usuário de Joe for 100e o de Bob 101, provavelmente será óbvio que a conta de Joe foi criada primeiro. Embora isso possa não importar na maioria dos aplicativos, isso pode importar para alguns. Este é um exemplo de privacidade estritamente através da obscuridade, portanto, a menos que você tenha um sistema muito sofisticado de ofuscar os IDs de usuário, pode ser fácil dissolver e descobrir se o usuário com ID 3Js9kW3hTs7sa120teve uma conta mais longa que o usuário com ID Q8Hs73kks0hEg.

No link que referenciei:

A primeira é que, dada a URL de algum objeto, você pode descobrir as URLs dos objetos que foram criados em torno dele. Isso expõe o número de objetos em seu banco de dados a possíveis concorrentes ou outras pessoas que você talvez não deseje ter essas informações (como demonstrado pelos Aliados que adivinham os níveis de produção de tanques alemães observando os números de série).

O uso de uma identificação de incremento automático expõe publicamente o número de objetos no banco de dados e pode expor quais foram criados primeiro e quais são mais novos. Essas informações podem revelar o fato de que uma empresa é nova ou não está indo bem. Por exemplo: digamos que você solicite um livro e seu ID de pedido seja 1. Pode ser aparente que seu pedido foi o primeiro no sistema, o que pode ser irritante. Digamos que você volte e peça outro e seu ID de pedido seja 9. Isso fornece a informação de que apenas sete pedidos foram feitos no período entre seus dois pedidos. Isso pode ser uma informação valiosa para os concorrentes. Nesse caso, o ID numérico de incremento automático provavelmente é melhor ofuscado.

Wesley Murch
fonte
2

A palavra "Obscuro" é provavelmente um pouco enganadora aqui e pode levar as pessoas a pensar em "ofuscar" ou "esconder parcialmente".

A recomendação é que você nunca inclua nenhuma chave de banco de dados gerada internamente como parte de uma URL pública se esses registros de banco de dados contiverem dados confidenciais.

É muito fácil jogar com os números na URL e acessar outros registros.

James Anderson
fonte
1
Sim, eu quis dizer ofuscar no título e em alguns outros casos - desculpe por isso. Ainda bem que você sabe o que eu quis dizer. Eu entendi a questão de "brincar com os números", mas esse é o meu ponto - seu aplicativo não deve ser protegido, tornando os IDs um pouco mais difíceis de adivinhar e cruzando os dedos. Se alguém pousar /account/8hdy39s1lks062dfasd4e mapear para uma conta real, não deverá ter acesso de qualquer maneira.
Wesley Murch
2

Vou contra o mainstream e digo que usar um identificador aleatório e longo é, na minha opinião, uma forma bastante decente de segurança.

Deve ficar claro para quem tem acesso a esses dados que ele é tão sensível quanto uma senha. E, é claro, tem a desvantagem de que, se for para a natureza, pode ser mais difícil mudar.

Mas ele tem algumas vantagens sobre o par usual de nome de usuário e senha. Primeiro, o usuário não tem escolha, portanto, você pode ter certeza de que é essencialmente impossível adivinhar. Não faz sentido criar um site perfeitamente seguro quando o administrador escolhe seu primeiro nome como senha. Segundo, cada item tem um identificador diferente; portanto, se um obtém acesso a um item, isso não ajuda no outro.

Obviamente, quanto mais camadas de segurança houver, melhor. Mas esse método sozinho pode ser mais seguro do que algumas credenciais.

Andrea
fonte
1
Concordo. Qualquer que seja o método de segurança que você esteja usando, tudo se resume ao envio de bytes inimagináveis ​​por fio. Se feito corretamente, você está enviando um ID que é tão bom quanto criptografado, que não vaza nenhuma informação sobre o seu espaço de ID, e eu argumentaria que é mais forte do que o que as pessoas estão falando quando usam "segurança pela obscuridade". "
Marc Stober
0

Existem dois aspectos para isso: usabilidade e segurança.

As IDs obscurecedoras em termos de segurança são inúteis; o importante é que o ID nunca deve ser a única 'chave' para qualquer recurso não público. Isso significa que, se você deseja conceder aos usuários selecionados acesso a uma determinada página, basta exigir que o ID da página no URL não seja suficiente, é necessário implementar um mecanismo de segurança real, como um nome de usuário / senha de login ou autenticação de chave pública / privada, bem como a devida autorização (ou seja, o sistema deve poder julgar caso a caso se o usuário X tem permissão para acessar o recurso Y e agir em conformidade).

Em termos de usabilidade, o conselho geral é manter as chaves artificiais ocultas: elas não têm nenhum significado para o usuário e, revelando-as de maneiras óbvias, você introduz uma dependência extra, que é particularmente difícil de lidar porque mora fora o reino do software - as pessoas vão escrever, e-mail, fax, impressão, marcador, etc., os ID de, e se você nunca mudá-los, você está em alguns bilhetes de apoio irritantes.

tdammers
fonte
Em um aplicativo da web, não consigo pensar em exemplos em que as pessoas anotariam um ID interno por qualquer motivo. Eu posso entender por e-mail uma URL ou algo (ou um favorito) que tenha um ID, mas, nesse caso, não vejo onde a usabilidade entra em jogo. Não sugeri alterá-los no meio do caminho, mas entendo como isso seria um problema.
23412 Wesley Murch
@ Madmartigan: Não é tão incomum com sistemas de informação personalizados. Os usuários precisam fazer certas coisas e, às vezes, o aplicativo não as suporta diretamente, ou está completamente quebrado, ou talvez passar diretamente pelo ID seja mais fácil do que seguir o caminho que os arquitetos de software imaginavam. As pessoas podem ser muito criativas com essas coisas e, antes que você perceba, essas identidades 'internas' começam a levar suas próprias vidas.
tdammers
0

Não , você absolutamente, positivamente , não deseja permitir o acesso a recursos arbitrários apenas conhecendo seu ID interno. Esta é a internet, qualquer que seja malicioso, criminal, ou simples presença infantil que você pode imaginar de existir, realmente existe , e mais cedo ou mais tarde eles vão vir para o seu site. A menos que tudo o que você possa servir seja completamente público para todos (e se você tiver pelo menos um cliente, o que certamente não é o caso), você deve restringir o acesso àqueles que estão realmente autorizados a recebê-lo.

A solução usual é usar tokens de autorização de algum tipo armazenados em uma sessão criptografada e verifica se algo deve estar visível para o usuário autenticado antes de realmente enviá-lo. Esse pode ser um gerenciador de segurança real, como aquele que acompanha o JDK ou qualquer outro componente que cumpre a mesma função, desde que seja consistente. (Expor IDs internos a alguém que já está autenticado ou não também é uma pergunta interessante com vários prós e contras, mas é menos essencial à segurança.)

É difícil calcular o valor de fazer isso até que você seja realmente atacado por alguém que se refere a negócios. Então geralmente é a diferença entre sair do negócio e apenas dar de ombros para mais um kiddie de script frustrado.

Kilian Foth
fonte
2
Eu acho que você pode ter entendido a idéia errada, não sugeri "permitir acesso a recursos arbitrários apenas conhecendo seu ID interno". Estou falando de ofuscar o ID sobre as medidas de segurança existentes. Obviamente, apenas conhecer o ID ou o hash não deve ser considerado autorização.
23412 Wesley Murch
0

Obviamente, depende da sensibilidade dos dados, mas, para segurança média, o mínimo que eu faria seria incluir o ID e um valor de soma de verificação.

Gere a soma de verificação adicionando salt (ou seja, uma coleção definida de caracteres aleatórios) antes e depois do ID e executando um MD5 no valor.

Em cada página que lê o valor do ID, ele deve gerar o valor da soma de verificação e compará-lo com o aprovado, negue a solicitação se não corresponder.

Se um hacker em potencial conseguir obter combinações válidas suficientes, poderá determinar o valor de Salt por força bruta, portanto, se você puder adicionar outra camada de segurança, como verificar o ID do usuário, isso também ajudará.

Gerador de código PHP
fonte