He escuchado a personas dar conferencias aquí y allá en Internet que es una buena práctica ocultar los identificadores de bases de datos públicas en las aplicaciones web. Supongo que significan principalmente en formas y en URL, pero nunca he leído nada más que un bocado sobre el tema.
EDITAR : Por supuesto, ahora que pregunto esto, encuentro algunos recursos sobre el tema:
- /programming/2374538/obscuring-database-ids
- /programming/1895685/should-i-obscure-primary-key-values
- http://joshua.schachter.org/2007/01/autoincrement.html
Estos enlaces satisfacen parte de mi curiosidad, pero las publicaciones de SO no tienen muchos votos y no están necesariamente centradas en el tema en este contexto, por lo que no estoy seguro de qué hacer al respecto, y algunos de ellos afirman que el tercero El enlace es falso. Dejaré el resto de mi publicación intacta:
Entiendo las diferencias entre la oscuridad y la seguridad, así como cómo los dos pueden trabajar juntos, pero no puedo imaginar por qué esto sería necesario.
¿Hay algo de verdad en esto, es solo paranoia, o es totalmente falso?
Se me ocurren formas de hacerlo, pero, por supuesto, agrega mucha complejidad al código de la aplicación. ¿En qué circunstancias sería útil? Si esto es algo que la gente hace con frecuencia, ¿cómo se suele implementar? Hashing los identificadores? ¿Algo más? Parece mucho trabajo por poca seguridad adicional. No estoy buscando soluciones reales, solo quiero tener una idea de cómo / por qué la gente haría esto en el mundo real.
¿Se considera esto realmente una "mejor práctica" o es simplemente una microoptimización de poco valor?
NOTA : Creo que algunas personas pueden haber tenido una idea equivocada: no estoy sugiriendo que los identificadores difíciles de adivinar serían el único mecanismo de seguridad, obviamente habría las comprobaciones de acceso habituales. Supongamos que están en su lugar, y que simplemente conocer la identificación o la identificación hash de un registro no es suficiente para otorgar acceso.
fuente
Esta es mi opinión sobre ella:
Si bien la "seguridad a través de la oscuridad" obviamente no es suficiente, la oscuridad puede ayudar a la seguridad, aunque sea un poco. Tienes que decidir si ese poquito de psuedo-security vale la pena el esfuerzo adicional que lleva desplegar algo como esto en tu aplicación.
Hay otra razón fuera de la seguridad que se me ocurre para implementar esto:
Intimidad
Digamos que estamos tratando con identificadores de usuario en la url. Si la identificación de usuario de Joe es
100
y la identificación de usuario de Bob es101
, probablemente sea obvio que la cuenta de Joe se creó primero. Si bien esto puede no importar en la mayoría de las aplicaciones, puede ser importante para algunas. Este es un ejemplo de privacidad estrictamente a través de la oscuridad, por lo que, a menos que tenga un sistema muy sofisticado de ofuscación de los identificadores de usuario, podría ser bastante fácil de disolver y descubrir si el usuario con ID3Js9kW3hTs7sa120
ha tenido una cuenta más larga que el usuario con IDQ8Hs73kks0hEg
.Desde el enlace al que hice referencia:
El uso de una identificación de incremento automático expone públicamente el número de objetos en la base de datos y puede exponer cuáles se crearon primero y cuáles son más nuevos. Esta información puede revelar el hecho de que un negocio es nuevo o no funciona bien incluso. Por ejemplo: supongamos que solicita un libro y su identificación de pedido es
1
. Puede ser evidente que su pedido fue el primero en el sistema, lo que puede ser desconcertante. Digamos que volver y pedir otra y su identificación de la orden es9
. Esto revela la información de que solo se hicieron 7 pedidos en el período de tiempo entre sus dos pedidos. Esta podría ser información valiosa para los competidores. En este caso, la identificación numérica de incremento automático probablemente esté mejor ofuscada.fuente
La palabra "oscuro" es probablemente un poco engañosa aquí, y puede llevar a la gente a pensar "ofuscar" o "esconderse parcialmente".
La recomendación es que nunca incluya claves de base de datos generadas internamente como parte de una URL pública si estos registros de base de datos contienen datos confidenciales.
Es demasiado fácil jugar con los números en la URL y acceder a otros registros.
fuente
/account/8hdy39s1lks062dfasd4
y se asigna a una cuenta real, no debería tener acceso de todos modos.Iré en contra de la corriente principal y le diré que usar un identificador aleatorio y largo es, en mi opinión, una forma de seguridad bastante decente.
Debe quedar claro para quien tiene acceso a esos datos que es tan sensible como una contraseña. Y, por supuesto, tiene la desventaja de que si entra en la naturaleza puede ser más difícil cambiarlo.
Pero tiene un par de ventajas sobre el par de nombre de usuario y contraseña habitual. Primero, el usuario no tiene otra opción, por lo que puede estar seguro de que es esencialmente imposible de adivinar. No tiene sentido diseñar un sitio perfectamente seguro cuando el administrador elige su primer nombre como contraseña. En segundo lugar, cada elemento tiene un identificador diferente, por lo que si uno tiene acceso a un elemento, esto no ayuda con el otro.
Por supuesto, cuantas más capas de seguridad haya, mejor. Pero este método solo puede ser más seguro que un par de credenciales.
fuente
Hay dos aspectos en esto: usabilidad y seguridad.
En cuanto a la seguridad, ocultar las identificaciones es bastante inútil; Lo importante es que la ID nunca debe ser la única 'clave' para ningún recurso no público. Esto significa que si desea dar acceso a los usuarios seleccionados a una página determinada, simplemente no es suficiente con la identificación de la página en la URL, debe implementar un mecanismo de seguridad real, como un nombre de usuario / contraseña o autenticación de clave pública / privada, así como la autorización adecuada (es decir, el sistema debe poder juzgar, por caso, si el usuario X puede acceder al recurso Y y actuar en consecuencia).
En cuanto a la usabilidad, el consejo general es mantener ocultas las claves artificiales: no tienen ningún significado para el usuario, y al revelarlas de manera obvia, introduce una dependencia adicional, una que es particularmente difícil de manejar porque vive fuera el reino del software: las personas escribirán, enviarán un correo electrónico, enviarán un fax, imprimirán, marcarán, etc., esas identificaciones, y si alguna vez las cambian, recibirán algunos molestos tickets de soporte.
fuente
No , usted absolutamente no quiere permitir el acceso a recursos arbitrarios simplemente conociendo su identificación interna. Este es el Internet, cualquiera que sea actos maliciosos, o simple presencia infantil se puede imaginar de existir, existe realmente , y tarde o temprano van a llegar a su sitio. A menos que todo lo que pueda servir sea completamente público para todos (y si tiene incluso un cliente, se garantiza que ese no sea el caso), debe restringir el acceso a aquellos que realmente están autorizados para tenerlo.
La solución habitual es usar tokens de autorización de algún tipo que estén almacenados en una sesión encriptada, y verificaciones que verifiquen si se supone que algo debe ser visible para el usuario autenticado antes de enviarlo. Este puede ser un administrador de seguridad real, como el que se incluye con el JDK, o cualquier otro componente que cumpla el mismo rol, siempre que lo haga de manera consistente. (Si exponer las ID internas a alguien que ya está autenticado o no es también una pregunta interesante con varios pros y contras, pero es menos esencial para la seguridad).
El valor de hacer esto es difícil de calcular hasta que alguien realmente lo ataca. Por lo general, es la diferencia entre cerrar el negocio y simplemente ignorar otro guión frustrado para niños.
fuente
Obviamente, depende de cuán sensibles sean los datos, pero para una seguridad media, lo mínimo que haría sería incluir el ID y un valor de suma de verificación.
Genere la suma de verificación agregando sal (es decir, una colección de caracteres aleatorios) antes y después de la ID y haciendo un MD5 en el valor.
En cada página que lea el valor de ID, debería generar el valor de suma de comprobación y compararlo con el que se pasó, rechazar la solicitud si no coincide.
Si un pirata informático potencial puede obtener suficientes combinaciones válidas, entonces puede calcular el valor de Salt por la fuerza bruta, por lo que si puede agregar otra capa de seguridad, como verificar la ID de usuario, eso también ayudará.
fuente