php - Ocultar el verdadero ID de objeto de base de datos en url
mysql security (3)
¿Cuáles serían las soluciones útiles para ocultar la verdadera ID de objeto de la base de datos en la URL por motivos de seguridad? Descubrí que una de las soluciones sería:
1) Uso de proyecto de código abierto de hashids
2) Usar algo como el viejo md5 en la creación del objeto para generar hash y almacenarlo en la base de datos, luego usarlo en url y consultar por ellos, pero el inconveniente es que las consultas por claves primarias (ID) auto-incrementadas son más rápidas que hashes ¿Entonces creo que la posibilidad de hacer hash / unhash sería mejor?
Además, como estoy en Symfony, ¿hay quizás paquetes que no pude encontrar o incorpore funcionalidades que podrían ayudar?
Por favor, dime qué encontraste útil en función de tus experiencias.
- Cita del sitio:
¿Tiene alguna pregunta o comentario que involucre "seguridad" y "hashids" en la misma oración? No uses Hashids.
- Usaría un algoritmo de cifrado verdadero, como la función openssl_encrypt (por ejemplo), o algo así. Y encripte los identificadores cuando pase afuera, descifre cuando los use en su código (como para consultas db).
Y no recomendaré almacenar los identificadores en una base como cualquier tipo de "basura" encriptada, en mi opinión, es muy inconveniente hacer hash con sus identificadores reales. Manténgalo limpio y bonito por dentro y encripte solo para visualización externa.
Esta pregunta se ha hecho mucho, con diferentes opciones de palabras (lo que hace que sea difícil decir: "¡Solo búscalo!"). Este hecho provocó una publicación de blog titulada, La guía completa para el cifrado de parámetros de URL en PHP .
Lo que la gente quiere hacer aquí
Lo que la gente debería hacer en su lugar
Explicación
Por lo general, las personas quieren URL cortas de aspecto aleatorio. Esto no le permite mucho espacio para encriptar y luego autenticar el ID de registro de la base de datos que desea ofuscar. Hacerlo requeriría una longitud mínima de URL de 32 bytes (para HMAC-SHA256), que es de 44 caracteres cuando se codifica en base64.
Una estrategia más simple es generar una cadena aleatoria (ver
random_compat
para una implementación PHP5 de
random_bytes()
y
random_int()
para generar estas cadenas) y hacer referencia a esa columna en su lugar.
Además, los hashids se rompen por simple criptoanálisis. Su conclusión dice:
El ataque que he descrito es significativamente mejor que un ataque de fuerza bruta, por lo que desde un punto de vista criptográfico se considera que el algoritmo está roto, es bastante fácil recuperar la sal; haciendo posible que un atacante ejecute la codificación en cualquier dirección e invalida la propiedad 2 para una función hash ideal.
No confíes en eso.
Siguiendo su idea, solo necesita cifrar sus ID antes de escribir la URL en la página HTML y descifrarlas al procesar esas URL.
- Si solo desea seguridad por oscuridad, que es suficiente para, tal vez el 99% de las personas curiosas que les gusta iterar sobre las ID en las URL, use algo simple como base64 o rot13. Por supuesto, también puede calcular previamente esas "ID públicas" y almacenarlas en la base de datos, sin cifrar cada vez que se muestra la URL al usuario final.
- Si desea una verdadera seguridad, debe cifrarlos con algún cifrado asimétrico serio, almacenando ambas claves a su lado, ya que esencialmente habla con usted y no quiere un ataque de hombre en el medio. Esto no podrá calcular previamente, ya que en cada cifrado habrá un texto cifrado diferente, lo cual es bueno para esta causa.
En cualquier caso, necesitas algo bidireccional, así que si fuera tú, me olvidaría de la palabra "hash", los hashes son para propósitos diferentes a los tuyos.
EDITAR:
Pero la solución que cada blog utiliza para esta tarea durante varios años ya es utilizar la reescritura de URL, convirtiendo, en su caso, URL como
http://example.com/book/5
en URL como
http://example.com/rework-by-37signals
.
Esto erradicará por completo cualquier signo de identificación de la base de datos de su URL.
Ideológicamente, necesitará algo que asigne de manera única la URL de solicitud al contenido de su base de datos de todos modos. Si oculta las identificaciones de la base de datos MySQL detrás de cualquier capa de reescritura de URL, solo hará que esta URL reescrita sea una nueva ID para el mismo contenido. Todo lo que obtienes es protección contra ataques de enumeración y quizás URL de SEF.