Exponer ID de bases de datos: ¿riesgo de seguridad?

134

Escuché que exponer las ID de la base de datos (en URL, por ejemplo) es un riesgo de seguridad, pero tengo problemas para entender por qué.

¿Alguna opinión o enlace sobre por qué es un riesgo o por qué no lo es?

EDITAR: por supuesto, el acceso tiene un alcance, por ejemplo, si no puede ver el recurso foo?id=123, obtendrá una página de error. De lo contrario, la URL en sí misma debería ser secreta.

EDITAR: si la URL es secreta, probablemente contendrá un token generado que tiene una vida útil limitada, por ejemplo, válido por 1 hora y solo se puede usar una vez.

EDITAR (meses después): mi práctica preferida actual para esto es usar UUIDS para ID y exponerlos. Si estoy usando números secuenciales (generalmente para el rendimiento en algunas bases de datos) como ID, me gusta generar un token UUID para cada entrada como una clave alternativa, y exponer eso.

orip
fuente

Respuestas:

109

Dadas las condiciones adecuadas, exponer identificadores no es un riesgo de seguridad. Y, en la práctica, sería extremadamente oneroso diseñar una aplicación web sin exponer identificadores.

Aquí hay algunas buenas reglas a seguir:

  1. Utilice la seguridad basada en roles para controlar el acceso a una operación. La forma en que se hace esto depende de la plataforma y el marco que haya elegido, pero muchos admiten un modelo de seguridad declarativo que redirigirá automáticamente los navegadores a un paso de autenticación cuando una acción requiera cierta autoridad.
  2. Utilice la seguridad programática para controlar el acceso a un objeto. Esto es más difícil de hacer a nivel de marco. Más a menudo, es algo que debe escribir en su código y, por lo tanto, es más propenso a errores. Esta verificación va más allá de la verificación basada en roles al garantizar no solo que el usuario tiene autoridad para la operación, sino que también tiene los derechos necesarios sobre el objeto específico que se está modificando. En un sistema basado en roles, es fácil verificar que solo los gerentes pueden dar aumentos, pero más allá de eso, debe asegurarse de que el empleado pertenezca al departamento del gerente en particular.
  3. Para la mayoría de los registros de la base de datos, las condiciones 1 y 2 son suficientes. Pero agregar identificaciones impredecibles puede considerarse como un pequeño seguro adicional, o "seguridad en profundidad", si acepta esa noción. Sin embargo, un lugar donde los identificadores impredecibles son una necesidad es en las ID de sesión u otros tokens de autenticación, donde la ID misma autentica una solicitud. Estos deben ser generados por un RNG criptográfico.
erickson
fuente
27
En mi opinión, agregar identificaciones impredecibles es un enfoque de "seguridad a través de la oscuridad" y puede conducir a una falsa sensación de seguridad. Es mejor concentrarse en (1) y (2) y asegurarse de que su control de acceso sea sólido.
stucampbell
44
Usar un RNG criptográfico definitivamente no es "seguridad a través de la oscuridad". El atacante no está más cerca de adivinar identificadores de objetos, incluso cuando sabe cómo los genera. La seguridad a través de la oscuridad significa que si se descubre el algoritmo que está utilizando, puede explotarse. No se refiere a guardar secretos, como las claves o el estado interno de un RNG.
erickson
1
@stucampbell Quizás, pero eso no significa que no debas usar identificaciones impredecibles en absoluto. Los errores ocurren, por lo que las identificaciones impredecibles son un mecanismo de seguridad adicional. Además, el control de acceso no es la única razón para usarlos: las ID predecibles pueden revelar información confidencial, como la cantidad de nuevos clientes dentro de un determinado período de tiempo. Realmente no quieres exponer esa información.
user247702
1
@Stijn realmente no puedes decir que "realmente no quiero" exponer cuántos clientes tengo. Quiero decir que McDonald's tiene un gran cartel que dice que han servido 10 mil millones de hamburguesas. No es un riesgo de seguridad en absoluto, es una preferencia. Además, debe iniciar sesión antes de ver cualquier URL en la mayoría de las aplicaciones en las que nos preocuparíamos de todos modos. Por lo tanto, sabríamos quién estaba raspando datos.
Wayne Bloss
1
Una cosa que no vi mencionado en esta conversación es que, desde el punto de vista de la resolución de problemas y la facilidad de uso, puede ser muy útil tener los ID expuestos en una URL para ayudar a dirigir a los usuarios a un recurso específico o hacer que puedan para decirle exactamente qué recurso están viendo. En su mayoría, puede evitar problemas de inteligencia empresarial al iniciar el incremento automático a un valor más alto, solo para ofrecer una idea.
Chockomonkey
47

Si bien no es un riesgo de seguridad de datos, este es absolutamente un riesgo de seguridad de inteligencia empresarial, ya que expone tanto el tamaño como la velocidad de los datos. He visto cómo las empresas se ven perjudicadas por esto y he escrito sobre este antipatrón en profundidad. A menos que solo estés construyendo un experimento y no un negocio, te recomiendo que mantengas tus identificadores privados fuera del ojo público. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e

Peter
fuente
44
Finalmente, una respuesta sensata que traiga otros aspectos además del riesgo de seguridad.
acepta el
2
Esta debería ser la respuesta aceptada. Si asume que el atacante puede eludir su seguridad (lo que siempre debe hacer), no desea simplemente entregar este tipo de información.
Kriil
@Kriil Ni siquiera necesitan eludir su seguridad. ¡Solo necesitan crear una cuenta!
Peter
32

Depende de lo que representen los ID.

Considere un sitio que, por razones competitivas, no quiere hacer públicos cuántos miembros tienen, pero al usar ID secuenciales lo revela de todos modos en la URL: http://some.domain.name/user?id=3933

Por otro lado, si utilizaron el nombre de usuario del usuario en su lugar: http://some.domain.name/user?id=some, no han revelado nada que el usuario aún no sabía.

algunos
fuente
2
si está usando ID secuenciales, tiene razón, pero si no, eso no expone nada
orip
@orip: Como dije, depende de lo que alguien pueda descubrir al examinar varias identificaciones. ¿Hay un patrón? ¿Pueden usar esa información para obtener información que no están destinados a tener?
algunos
@ John: Gracias por la edición. El inglés no es mi lengua materna :)
algunos
66
He hecho exactamente esto: usé números de identificación secuenciales para determinar el tamaño de la base de usuarios de un competidor.
Micah
3
Están en todos lados. Muchos sitios de compras utilizan un número secuencial para la identificación del pedido. Haga un pedido en una fecha y otro en otra fecha y sabrá cuántos pedidos recibieron durante ese período. Incluso si no sabe cuánto dinero valen los pedidos, aún obtiene una indicación de cómo va el negocio.
algunos
25

El pensamiento general sigue estas líneas: "Revele a cualquier persona tan poca información sobre el funcionamiento interno de su aplicación".

Exponer la ID de la base de datos cuenta como revelar cierta información.

Las razones de esto es que los piratas informáticos pueden usar cualquier información sobre el funcionamiento interno de sus aplicaciones para atacarlo, o un usuario puede cambiar la URL para ingresar a una base de datos que no debe ver.

Arjan Einbu
fuente
1
Acceder a recursos que se supone que no deben ver, solo si no verifico los permisos (lo que hago, de lo contrario, tengo un problema de seguridad diferente). Revelar información sobre el "funcionamiento interno" - esa es exactamente mi pregunta. Por qué es un problema?
orip
8
@orip: se trata de ser lo más seguro posible. Si eres el tipo de programador que no comete errores, entonces no es un problema. De lo contrario, exponer menos detalles hace que sea más difícil explotar su código si (cuando) comete errores. Por sí mismo, tienes razón, no agrega seguridad.
Adam Bellaire
@ Adam: la seguridad superficial puede ser peor que la no seguridad. Sin seguridad eres explícito, con seguridad superficial podrías pensar que agrega algo no despreciable.
orip
16

Usamos GUID para identificadores de bases de datos. Filtrarlos es mucho menos peligroso.

Joshua
fuente
Esto es lo que sugeriría. Es mucho menos probable que adivine los GUID en su base de datos.
Jon Erickson
66
Esto viene con una penalización de rendimiento. Ver aquí
Jeshurun
2
Lo interesante sobre el uso de guías es que puede permitir que los clientes generen identificadores de base de datos. Lo interesante 2 es que no tienen ningún problema con las bases de datos fragmentadas como lo hacen los identificadores de incremento automático.
Brian White
¿Utiliza estos GUID también en el código html como atributos de identificación para identificar usuarios, comentarios, publicaciones? ¿Para indicar en qué enlace hizo clic un usuario o en qué publicación quiere comentar?
trzczy
7

Si está utilizando ID enteros en su base de datos, puede facilitar que los usuarios vean datos que no deberían cambiar las variables qs.

Por ejemplo, un usuario podría cambiar fácilmente el parámetro id en este qs y ver / modificar datos que no deberían http: // someurl? Id = 1

Jason
fuente
77
Si no verifico los permisos, tengo un problema de seguridad diferente.
orip
pero la respuesta es precisa: "mayo"
Seun Osewa
1
La pregunta no es si verificará los permisos. Es si el nuevo empleado que no conoce verificará los permisos.
Brian White el
@BrianWhite: es por eso que desea un proceso de revisión de código, para que pueda educarlos antes de que llegue a producción.
candu
2
Lo que hacemos es encriptar los identificadores enteros cuando se usan en la URL o en las variables de formulario.
Brian White el
6

Cuando envía identificadores de bases de datos a su cliente, se ve obligado a verificar la seguridad en ambos casos. Si mantiene las identificaciones en su sesión web, puede elegir si desea / necesita hacerlo, lo que significa potencialmente menos procesamiento.

Intenta constantemente delegar cosas a su control de acceso;) Esto puede ser el caso en su aplicación, pero nunca he visto un sistema de fondo tan consistente en toda mi carrera. La mayoría de ellos tienen modelos de seguridad que fueron diseñados para uso no web y algunos han agregado roles adicionales a título póstumo, y algunos de ellos se han incluido fuera del modelo de seguridad central (porque el rol se agregó en un contexto operativo diferente, por ejemplo). antes de la web).

Por lo tanto, utilizamos identificadores locales de sesión sintética porque oculta tanto como podemos escapar.

También está el problema de los campos de clave no enteros, que pueden ser el caso de valores enumerados y similares. Puede intentar desinfectar esos datos, pero es probable que termine como pequeñas tablas de bobby drop .

krosenvold
fuente
44
Interesante, aunque creo que verificar todas las entradas (incluidos los parámetros de URL) para cada solicitud es muy apropiado para la web.
orip