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:
- /programming/2374538/obscuring-database-ids
- /programming/1895685/should-i-obscure-primary-key-values
- http://joshua.schachter.org/2007/01/autoincrement.html
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.
fonte
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
100
e o de Bob101
, 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 ID3Js9kW3hTs7sa120
teve uma conta mais longa que o usuário com IDQ8Hs73kks0hEg
.No link que referenciei:
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 seja9
. 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.fonte
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.
fonte
/account/8hdy39s1lks062dfasd4
e mapear para uma conta real, não deverá ter acesso de qualquer maneira.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.
fonte
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.
fonte
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.
fonte
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á.
fonte