una tipos secundarias primarias primaria llaves llave foranea datos compuesta claves clave caracteristicas candidata security database-design architecture web-applications data-modeling

security - tipos - ¿Evitar exponer claves primarias en el origen de una aplicación web?



llaves primarias y secundarias en base de datos (6)

A menudo me encuentro con aplicaciones web que exponen claves primarias de bases de datos internas a través de formularios como cuadros de selección. Y de vez en cuando veo una comparación de javascript contra un valor mágico int o guid que cambia la lógica.

Es una práctica recomendada evitar evitar que se filtren todos los identificadores internos de filas en su aplicación web para evitar que terceros entiendan demasiado su sistema y posiblemente lo utilicen para explotar su sistema. Si es así, ¿cuál es la mejor manera de resolver este problema?

¿Debería exponer algún otro valor a la aplicación web que pueda traducirse a la clave principal?

Gracias

Editar

En un mundo perfecto, su aplicación sería 100% segura, por lo que no importaría si ocultara las cosas. Obviamente, ese no es el caso, ¿deberíamos cometer errores en el lado de la precaución y no exponer esta información?

Algunos han señalado que Stackoverflow probablemente está exponiendo una clave en la URL que probablemente esté bien. Sin embargo, ¿son las consideraciones diferentes para las aplicaciones empresariales?


Como siempre, "depende". Si alguien puede ganar valor (por ejemplo) al saber cuántas transacciones está realizando por (hora / día / mes), y está exponiendo un ID de transacción como un número monótonamente creciente, eso es un riesgo.

Como han dicho otros, sin embargo, para una lista desplegable de valores, generalmente no hay problema.


Exponer otros valores que no sean la clave principal no le evitará la carga de verificar su seguridad. De hecho, si su seguridad tiene agujeros, los usuarios "malvados" podrían seguir accediendo a objetos a los que no están destinados cambiando el valor en la URL. Es posible que tengan menos pistas sobre qué valores utilizar, pero al seleccionar valores al azar, podrían tener suerte.

Si desea mejorar la seguridad de esta manera, tendrá que usar cadenas aleatorias grandes (para que sea difícil adivinar) en la url, en lugar de la identificación y usar una tabla de indirección que coincida con el valor aleatorio con la buena identificación en el fondo.

Creo que no vale la pena la molestia la mayor parte del tiempo.

Dicho esto, es útil para los casos en los que desea "seguridad por oscuridad", como por ejemplo cuando expone páginas para cambiar las contraseñas de los usuarios, sin necesidad de iniciar sesión (para los usuarios que han perdido su contraseña). En este tipo de caso, también debe asociar una fecha de validez límite a su clave.


No estoy de acuerdo con la postura de que exponer las claves primarias es un problema. Puede ser un problema si los hace visibles a los usuarios porque se les da un significado fuera del sistema, que generalmente es lo que usted trata de evitar.

Sin embargo, ¿para usar los ID como el valor de los elementos de la lista del cuadro combinado? Ve por lo que digo. ¿Qué sentido tiene hacer una traducción desde y hacia algún valor intermedio? Es posible que no tenga una clave única para usar. Tal traducción introduce un mayor potencial para los errores.

Simplemente no descuides la seguridad.

Si dice que le presenta al usuario 6 elementos (ID 1 a 6), nunca asuma que solo obtendrá esos valores del usuario. Alguien podría intentar violar la seguridad enviando de vuelta el ID 7 para que aún tenga que verificar que se permita lo que recibe.

¿Pero evitando eso por completo? De ninguna manera. No hay necesidad.

Como dice un comentario en otra respuesta, mira la URL aquí. Eso incluye lo que sin duda es la clave principal para la pregunta en la base de datos SO. Es totalmente correcto exponer las llaves para usos técnicos.

Además, si utiliza algún valor sustituto, eso no es necesariamente más seguro.


Sí, la exposición de claves es información que puede usarse como un ataque. Especialmente si son predecibles.

Use una clave / columna diferente si cree que la información es confidencial.

Por ejemplo, para evitar mostrar cómo pueden tener los usuarios, considere:

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


Si a todas tus preguntas. Estoy de acuerdo con sus afirmaciones de que debe " exponer algún otro valor a la aplicación web que se puede traducir de nuevo a la clave principal "

Usted puede abrirse a problemas potenciales de lo contrario.

Editar

Respecto al comentario de que " no hay razón para tomar el golpe de penalización por claves triviales. Mire en la URL de su navegador en este momento, ¡apuesto a que verá una clave! ".

Entiendo lo que dice y, sí, veo la clave en la URL de SO y acepto que probablemente se refiera a una base de datos PK. Admito que en casos como este, probablemente esté bien si no hay una alternativa mejor.

Todavía prefiero exponer algo que no sea un PK, algo con valor semántico. El título de la pregunta también se encuentra en la URL, pero dado que sería difícil de verificar como único (o se transmite verbalmente entre los usuarios), no se puede usar de manera confiable por sí solo.

Sin embargo, al mirar las URL de "etiquetas" (es decir, https://.com/questions/tagged/java+j2ee ), las PK no están expuestas y los nombres de las etiquetas se usan en su lugar. Personalmente, prefiero ese enfoque y me esforzaré por lograrlo.

También quería agregar que los datos a los que PK apunta a veces pueden cambiar con el tiempo. He trabajado en un sistema donde una tabla se llenó con información de un proceso fuera de línea, es decir, estadísticas mensuales en las que los contenidos de la tabla de base de datos cayeron al final del mes y se volvieron a llenar con datos nuevos.

Si los datos se agregan a la base de datos en un orden diferente, las PK para puntos de datos específicos cambiarían, y cualquier marcador guardado de un mes anterior a esos datos ahora apuntaría a un conjunto diferente de datos.

Esta es una instancia en la que exponer una PK "rompería" una aplicación no relacionada con la seguridad de la aplicación. No es así con una clave generada.


Una clave principal no es lo mismo que una clave sustituta o una clave interna, aunque existe cierta superposición. El opuesto de una clave interna es una clave natural. Hay muchas veces cuando una clave natural se utiliza como clave principal. En general, no hay razón para ocultar una clave natural, a menos que estemos tratando con problemas de privacidad.

Su pregunta real es, creo, acerca de si las claves internas deben estar expuestas a los usuarios. La respuesta es, depende". Para la mayoría de las comunidades de usuarios, la exposición de la clave interna dará como resultado que la clave se utilice como una clave natural. Esto puede, y por lo general, ocasionar cierta confusión cuando se rompe la asignación uno a uno entre la clave interna y el tema de la fila de la tabla.

Este desglose solo puede ocurrir como resultado de una mala gestión de los datos. Sin embargo, la mayoría de las veces, tiene que planear algunos errores de gestión de datos que ocurren en el mundo real. No planearía un sistema de suministro de agua que se descomponga cuando hay una mala gestión del agua. No planifica un sistema de información que se descompone cada vez que hay una desadaptación de datos.

Dicho esto, la mayoría de los diseñadores de bases de datos en estos días trabajan para los proveedores de software y no ven los problemas causados ​​por el mal manejo de los datos por parte de los usuarios de sus productos.