Expor IDs de banco de dados - risco de segurança?

133

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=123receberá 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.

orip
fonte

Respostas:

109

Dadas as condições adequadas, expor identificadores não é um risco à segurança. E, na prática, seria extremamente oneroso projetar um aplicativo da Web sem expor identificadores.

Aqui estão algumas boas regras a serem seguidas:

  1. Use segurança baseada em função para controlar o acesso a uma operação. Como isso é feito depende da plataforma e da estrutura que você escolheu, mas muitos suportam um modelo de segurança declarativo que redirecionará automaticamente os navegadores para uma etapa de autenticação quando uma ação exigir alguma autoridade.
  2. Use segurança programática para controlar o acesso a um objeto. Isso é mais difícil de fazer no nível da estrutura. Com mais frequência, é algo que você precisa escrever no seu código e, portanto, mais propenso a erros. Essa verificação vai além da verificação baseada em função, garantindo não apenas que o usuário tenha autoridade para a operação, mas também possua os direitos necessários no objeto específico que está sendo modificado. Em um sistema baseado em funções, é fácil verificar se apenas os gerentes podem dar aumentos, mas além disso, é necessário garantir que o funcionário pertença ao departamento do gerente em particular.
  3. Para a maioria dos registros do banco de dados, as condições 1 e 2 são suficientes. Mas adicionar IDs imprevisíveis pode ser considerado um pequeno seguro extra, ou "segurança em profundidade", se você adotar essa noção. Um local em que os identificadores imprevisíveis são necessários, no entanto, está nos IDs de sessão ou em outros tokens de autenticação, nos quais o próprio ID autentica uma solicitação. Estes devem ser gerados por um RNG criptográfico.
erickson
fonte
27
Na IMO, adicionar IDs imprevisíveis é uma abordagem de "segurança através da obscuridade" e pode levar a uma falsa sensação de segurança. É melhor focar em (1) e (2) e garantir que seu controle de acesso seja sólido.
Stucampbell
4
O uso de um RNG criptográfico definitivamente não é "segurança através da obscuridade". O atacante não está mais perto de adivinhar identificadores de objetos, mesmo quando sabe como você os gera. Segurança através da obscuridade significa que, se o algoritmo que você está usando for descoberto, ele poderá ser explorado. Não se refere a guardar segredos, como chaves ou o estado interno de um RNG.
Erickson
1
@ stucampbell Talvez, mas isso não significa que você não deva usar IDs imprevisíveis. Os erros acontecem, portanto, IDs imprevisíveis são um mecanismo de segurança extra. Além disso, o controle de acesso não é o único motivo para usá-los: IDs previsíveis podem revelar informações confidenciais, como o número de novos clientes em um determinado período. Você realmente não deseja expor essas informações.
usar o seguinte comando
1
@Stijn, você realmente não pode dizer que "realmente não quero" expor quantos clientes tenho. Quero dizer, o McDonald's tem um enorme cartaz dizendo que eles serviram 10 bilhões de hambúrgueres. Não é um risco de segurança, é uma preferência. Além disso, você precisa fazer o login antes de ver qualquer URL na maioria dos aplicativos em que nos preocuparíamos com isso. Portanto, saberíamos quem estava raspando dados.
Wayne Bloss
1
Uma coisa que não vi mencionada nesta conversa é que, do ponto de vista da solução de problemas e da facilidade de uso, pode ser muito útil expor IDs em um URL para ajudar a direcionar os usuários a um recurso específico ou permitir que eles sejam capazes de para dizer exatamente qual recurso eles estão visualizando. Você pode evitar preocupações de inteligência comercial iniciando o incremento automático com um valor mais alto, apenas para oferecer uma idéia.
Chockomonkey
47

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

Peter
fonte
4
Finalmente, a resposta sã traz outros aspectos além do risco à segurança.
peceps
2
Essa deve ser a resposta aceita. Se você presumir que o invasor pode ignorar sua segurança (o que você sempre deve fazer), não deseje apenas entregar esse tipo de informação.
Kriil 10/03
@Kriil Eles nem precisam ignorar sua segurança. Eles só precisam criar uma conta!
Peter
32

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.

alguns
fonte
2
se você estiver usando sequenciais IDs você está certo, mas se não, então, que não expõe nada
orip
@orip: Como eu disse, depende do que alguém possa descobrir examinando vários IDs. Existe um padrão? Eles podem usar essas informações para obter informações que não pretendem ter?
alguns
@ John: Obrigado pela edição. Inglês não é minha língua nativa :)
algum dia
6
Fiz exatamente isso: usei números de identificação sequenciais para determinar o tamanho da base de usuários de um concorrente.
Micah
3
Eles estão em todo lugar. Muitos sites de compras usam um número seqüencial para o ID do pedido. Faça um pedido em uma data e outro em outra data e você sabe quantos pedidos eles receberam durante esse período. Mesmo se você não souber quanto vale os pedidos, ainda recebe uma indicação de como os negócios estão indo.
alguns
25

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.

Arjan Einbu
fonte
1
Acessando recursos que eles não deveriam ver - apenas se eu não verificar as permissões (o que faço, caso contrário, tenho um problema de segurança diferente). Divulgar informações sobre o "funcionamento interno" - essa é exatamente a minha pergunta. Por que isso é um problema?
orip 28/12/08
8
@orip: É tudo sobre ser o mais seguro possível. Se você é o tipo de programador que não comete erros, isso não é problema. Caso contrário, a exposição de menos detalhes dificulta a exploração do seu código se (quando) você cometer erros. Por si só, você está certo, não adiciona segurança.
Adam Bellaire
@ Adam: segurança superficial pode ser pior do que nenhuma segurança. Sem segurança, você é explícito; com segurança superficial, você pode pensar que isso adiciona algo não-negligenciável.
orip 29/12/08
16

Usamos GUIDs para IDs de banco de dados. Vazá-los é muito menos perigoso.

Joshua
fonte
Isto é o que eu sugeriria. Muito menos provável adivinhar os GUIDs no seu banco de dados.
Jon Erickson
6
Isso tem uma penalidade de desempenho. Veja aqui
Jeshurun
2
O interessante 1 sobre o uso de guias é que você pode permitir que os clientes gerem IDs de banco de dados. O interessante 2 é que eles não têm problemas com bancos de dados fragmentados, como fazem os IDs de incremento automático.
187 Brian Brian
Você usa esses GUIDs também no código html como atributos de identificação para identificar usuários, comentários, postagens? Para indicar em qual link um usuário clicou ou em qual postagem ele deseja comentar?
trzczy
7

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

Jason
fonte
7
Se não verificar as permissões, tenho um problema de segurança diferente.
orip 28/12/08
mas a resposta é precisa: "pode"
Seun Osewa
1
A questão não é se você verificará as permissões. É se o novo contratado que você não conhece verificará as permissões.
Brian White
@BrianWhite - é por isso que você deseja que um processo de revisão de código seja implementado, para que você possa educá-lo antes que ele atinja a produção.
CANDU
2
O que fazemos é criptografar os IDs inteiros quando usados ​​na URL ou nas variáveis ​​de formulário.
187 Brian White
6

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 .

krosenvold
fonte
4
Interessante, embora eu ache que verificar todas as entradas (incluindo parâmetros de URL) para cada solicitação é muito apropriado para a web.
orip 16/10/09