Pergunta

Eu muitas vezes deparamos com aplicações web que expõem as chaves primárias de banco de dados interno através de formas como caixas de seleção. E, ocasionalmente, vejo correspondência javascript contra um int ou valor mágica guid que muda a lógica.

é a melhor prática para evitar vazamento de todos os identificadores internos de linhas em sua aplicação web para impedir que estranhos entender muito do seu sistema e, possivelmente, usando-o para explorar o sistema. Se assim o que é a melhor maneira de resolver este problema?

Se você expor algum outro valor para o web app que pode ser traduzido de volta para a chave primária?

Graças

Editar

Em um mundo perfeito sua aplicação seria 100% segura por isso não importaria se obscurecida coisas. Obviamente que não é o caso de modo que devemos erro no lado da cautela e não expor esta informação?

Alguns têm apontado que Stackoverflow é, provavelmente, expondo uma chave na URL que é provavelmente bem. No entanto são considerações diferentes para aplicações empresariais?

Foi útil?

Solução

Não concordo com a posição que a exposição chaves primárias é um problema. Pode ser um problema se você torná-los visíveis aos usuários, porque eles são dadas ou seja, fora do sistema, que normalmente é o que você está tentando evitar.

No entanto, para usar IDs como o valor para itens da lista de caixa de combinação? Ir para isso eu digo. Qual é o ponto em fazer uma tradução de e para algum valor intermediário? Você não pode ter uma chave única de usar. Tais tradução introduz mais potencial para erros.

Basta fazer a segurança não negligência.

Se dizem que você apresentar ao usuário 6 itens (ID 1-6), nunca assumir que você só vai obter esses valores de volta para o usuário. Alguém poderia tentar e segurança violação enviando ID volta 7 assim que você ainda tem que verificar que o que você recebe de volta é permitido.

Mas evitando que inteiramente? De jeito nenhum. Não há necessidade.

Como um comentário sobre uma outra resposta diz, olhar para a URL aqui. Isso inclui o que, sem dúvida, é a chave primária para a questão na base de dados SO. É perfeitamente bem para expor as chaves para usos técnicos.

Além disso, se você usar algum valor substituto em vez disso, isso não é necessariamente mais seguro.

Outras dicas

Sim, expondo chaves é uma informação que pode ser usado como um ataque. Especialmente se eles são previsíveis.

Use uma chave / coluna diferente se você pensar que a informação é sensível.

Por exemplo, para evitar mostrando como pode utilizadores tiver, considere:

site.com/user/123 vs site.com/user/username

Sim para todas as suas perguntas. Concordo com suas afirmações de que você deve " expor algum outro valor para o web app que pode ser traduzido de volta para a chave primária "

Você pode abrir-se a potenciais problemas de outra forma.

Editar

Quanto ao comentário de que " não há nenhuma razão para tomar o hit penalidade para chaves triviais. Olhe no URL do seu navegador agora, eu aposto que você ver uma tecla! ".

Eu entendo o que você está dizendo e, sim, eu vejo a chave na SO URL e concorda que provavelmente se refere a uma PK banco de dados. Admito em casos como este é provavelmente OK se não há uma alternativa melhor.

Eu ainda prefiro a expor algo diferente de um PK - algo com valor semântico. O título da questão também está na URL, mas desde que isso seria difícil para verificar como único (ou passar entre usuários verbalmente) não pode ser usado de forma confiável, por si própria.

Ao olhar para as URLs "tag" no entanto (ou seja, https://stackoverflow.com/questions/tagged/java+ j2ee ), as PKs não estão expostos e os nomes de tags são usados ??em seu lugar. Pessoalmente, eu prefiro essa abordagem e que iria se esforçar para isso.

Eu também queria acrescentar que os dados de pontos de PK no às vezes pode mudar com o tempo. Eu trabalhei em um sistema onde uma mesa estava cheia de informações a partir de um processo off-line - estatísticas mensais ou seja, onde o conteúdo da tabela DB caiu no final do mês e foi repovoada com novos dados.

Se os dados forem adicionados à db em uma ordem diferente, as PKs para pontos de dados específica mudaria, e quaisquer marcadores salvos de um mês anterior para que os dados seriam agora ponto em um conjunto diferente de dados.

Este é um exemplo onde expondo uma PK iria "quebrar" um app sem relação com a segurança do aplicativo. Não é assim com uma chave gerada.

Como sempre, "depende". Se alguém pudesse ganhar valor (digamos) por saber quantas transações você está realizando por (hora / dia / mês), e você está expondo um ID de transação como um número monótona crescente, então isso é um risco.

Como já foi dito, porém, para uma lista suspensa de valores, geralmente não há problema.

A exposição de outros valores que a chave primária não vai evitar que você o fardo de verificar-lhe segurança. De fato, se a sua segurança tem buracos, os usuários "maus" ainda pode acessar objetos que não se destinam a alterando o valor na url. Eles podem ter menos indícios de que os valores para usar, mas escolher aleatoriamente valores, que pode ter sorte.

Se você quiser melhorar a segurança desta forma, você terá que usar grandes seqüências aleatórias (para fazer adivinhar difícil) na URL, em vez do id e usar uma tabela indireto correspondente ao valor aleatório com a boa id no fundo .

Eu acho que não vale a pena o incômodo maior parte do tempo.

Dito isso, é útil para casos em que você quer "segurança por obscuridade", como por exemplo, quando você expõe páginas para alterar senhas de usuários, sem necessidade de login (para usuários de ter perdido a sua senha). Neste tipo de caso, você também deve associar uma data de validade limite para a sua chave.

Uma chave primária não é a mesma coisa que uma chave substituta ou uma chave interna, embora haja alguma sobreposição. O oposto de uma chave interna é uma chave natural. Há muitas vezes quando uma chave natural é usado como uma chave primária. Não é, em geral, nenhuma razão para esconder uma chave natural, a não ser que estamos a lidar com questões de privacidade.

A sua verdadeira questão é, penso eu, sobre se as chaves internas devem ser expostos para os usuários. A resposta é "depende". Para a maioria das comunidades de usuários, expondo a chave interna irá resultar na chave tornando-se usado como uma chave natural. Isto pode, e normalmente faz, resultado de alguma confusão quando o mapeamento um-para-um entre a chave interna e objecto das quebras de linha da tabela para baixo.

Esta repartição só pode ocorrer como resultado de má gestão de dados. Na maioria das vezes, no entanto, você tem que plano em algum má administração de dados que ocorrem no mundo real. Você não iria planejar um sistema de abastecimento de água que quebra sempre que há má administração da água. Você não planeja um sistema de informação que divide cada vez que há mismangement dados.

Dito isto, a maioria da base de dados os designers estes dias trabalhar para fornecedores de software, e não vê os problemas causados ??pela má administração de dados pelos usuários de seus produtos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top