Ouvi dizer que a exposição de IDs de banco de dados (em URLs, por exemplo) é um risco à segurança, mas estou tendo problemas para entender o porquê.
Alguma opinião ou link sobre por que é um risco ou por que não é?
EDIT: é claro que o acesso é definido como escopo, por exemplo, se você não conseguir ver o recurso, foo?id=123
receberá uma página de erro. Caso contrário, o próprio URL deve ser secreto.
EDIT: se o URL for secreto, provavelmente conterá um token gerado com vida útil limitada, por exemplo, válido por 1 hora e pode ser usado apenas uma vez.
EDIT (meses depois): minha prática atual preferida para isso é usar UUIDS para identificações e expô-las. Se eu estiver usando números sequenciais (geralmente para desempenho em alguns bancos de dados) como IDs, eu gosto de gerar um token UUID para cada entrada como uma chave alternativa e expor isso.
Embora não seja um risco de segurança de dados, é absolutamente um risco de segurança de inteligência de negócios , pois expõe o tamanho e a velocidade dos dados. Vi empresas sendo prejudicadas por isso e escrevi sobre esse antipadrão em profundidade. A menos que você esteja construindo um experimento e não um negócio, eu sugiro que você mantenha seus IDs privados fora dos olhos do público. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e
fonte
Depende do que os IDs representam.
Considere um site que, por motivos competitivos, não queira tornar público quantos membros eles têm, mas o uso de IDs seqüenciais o revela de qualquer maneira no URL: http://some.domain.name/user?id=3933
Por outro lado, se eles usassem o nome de login do usuário: http://some.domain.name/user?id=alguns eles não divulgaram nada que o usuário ainda não soubesse.
fonte
O pensamento geral segue estas linhas: "Divulgue o mínimo possível de informações sobre o funcionamento interno do seu aplicativo".
A exposição do ID do banco de dados conta como divulgação de algumas informações.
Razões para isso é que os hackers podem usar qualquer informação sobre o funcionamento interno de seus aplicativos para atacá-lo ou um usuário pode alterar o URL para acessar um banco de dados que não deve ver.
fonte
Usamos GUIDs para IDs de banco de dados. Vazá-los é muito menos perigoso.
fonte
Se você estiver usando IDs inteiros em seu banco de dados, poderá facilitar a visualização dos dados pelos usuários, alterando as variáveis qs.
Por exemplo, um usuário pode facilmente alterar o parâmetro id neste qs e ver / modificar dados que não devem http: // someurl? Id = 1
fonte
Quando você envia IDs de banco de dados para seu cliente, você é forçado a verificar a segurança nos dois casos. Se você mantiver os IDs em sua sessão da Web, poderá escolher se deseja / precisa fazê-lo, o que significa potencialmente menos processamento.
Você está constantemente tentando delegar coisas ao seu controle de acesso;) Esse pode ser o caso do seu aplicativo, mas nunca vi um sistema de back-end tão consistente em toda a minha carreira. A maioria deles possui modelos de segurança projetados para uso não relacionado à Web e alguns tiveram funções adicionais adicionadas postumamente, e algumas delas foram fixadas fora do modelo de segurança principal (porque a função foi adicionada em um contexto operacional diferente, por exemplo) antes da web).
Por isso, usamos identificações locais de sessão sintética, porque ela oculta o máximo possível.
Há também o problema de campos-chave não inteiros, que podem ser o caso de valores enumerados e similares. Você pode tentar desinfetar esses dados, mas é provável que você acabe como pequenas tabelas suspensas .
fonte