2012-04-05 13 views
6

Esta es una pregunta de patrón de principiante para un tipo de cosa de formularios web sobre datos. Leo Exposing database IDs - security risk? y la respuesta aceptada me hace pensar que esto es una pérdida de tiempo, pero espera ...Exponer ID de base de datos a la interfaz de usuario

Tengo un proyecto MVC que hace referencia a una biblioteca de lógica de negocios, y un conjunto de repositorios NHibernate SQL que hace referencia a la misma. Si algo me obligara a ir y hacer referencia a esos repositorios directamente desde mi código base de controlador, sabría qué salió mal. Pero cuando esos controladores hablan en parámetros de URL con los identificadores de registro de la base de datos, ¿se equivoca solo ?

No puedo concebir aquellos ID que alguna vez se vuelven no consumibles (mediante acciones de MVC). Yo no piensa Alguna vez necesitaría dos entidades de UI correspondientes a la misma fila en la base de datos. No pretendo que el controlador interprete la ID de ninguna manera. Las claves sustitutas harían una diferencia cero. Aún así, quiero tener el problema porque las suposiciones sobre el diseño de ralación no son mejores que las de salto de capa.

¿Cómo haría una aplicación web que solo hace referencia al ensamblaje de la lógica de negocios y habla en objetos BL y GUID que solo tienen significado para esa sesión, mientras que el ensamblaje persiste transacciones utilizando ID de base de datos?

Respuesta

3

Puede cifrar o pica tus identificadores si quieres. Usando la identificación de la sesión como una sal. Depende del contexto. Un sitio de compras público que desea que las páginas del catálogo sean claras y fáciles de copiar. El administrador de la cuenta de usuario está bien encriptar los identificadores, para que los usuarios no puedan ingresar a la cuenta de otra persona.

No consideraría esto una seguridad por oscuridad. Si un usuario malintencionado tiene una cuenta comprometida, puede ver todos los campos de formulario, ID de URL y valores de cookies establecidos al iniciar sesión como ese usuario. Luego, pueden intentar usarlos cuando inician sesión como un usuario diferente para escalar los permisos. Pero al protegerlos usando la identificación de la sesión como una sal, ha bloqueado esos datos por lo que solo es útil en una sesión. Las páginas ni siquiera pueden ser marcadas. ¿Podrían descubrir tu protección? Posiblemente. Pero es probable que simplemente se muden a otro sitio. Bloquear la puerta de su automóvil en realidad no mantiene a nadie fuera de su automóvil si quieren entrar, pero lo hace más difícil, por lo que todos lo hacen.

+0

Me diste mucho que pensar. ¿Puede arrojar alguna sugerencia sobre cómo implementar el mapeo y dónde almacenarlo? ¿Es realmente la "sesión" el mejor lugar en ASP? –

+0

"el mapeo"? No está claro en lo que estás buscando. La protección de campo? Solo me sugirieron que realizara una función de cifrado que llevara: FieldName, FieldValue, SessionID. Luego, cuando descifrar, también necesita suministrar los 3 para descifrar. Entonces, alguien en otra sesión no puede secuestrar ese valor en absoluto. Debe ser todo lo que necesita para los parámetros de url. Si alguna vez necesita soporte para páginas sin sesión, puede tener un valor codificado en lugar del ID de sesión, no tan seguro, pero las páginas sin sesión no deberían tener acceso a nada sensible. –

+0

I espaciado en el quid de su respuesta, sal con sesión: no hay necesidad de almacenar/administrar las asignaciones en absoluto - persistirían por exactamente el mismo tiempo. Esto es asombroso Gracias. –

3

No soy un experto en seguridad, pero no tengo problemas para exponer ciertos ID al usuario, tales como ID de productos, ID de usuario y cualquier cosa que el usuario pueda leer normalmente, es decir, si visualizo un producto en el usuario, mostrando su identificación de producto no es un problema.

Cosas que son internas del sistema con las que los usuarios no interactúan directamente, como identificaciones de transacciones, no las muestro al usuario, no temo que las edite de alguna manera, sino porque esa información no es útil para ellos.

Muy a menudo en los formularios, tengo el punto de acción para "mysite.com/messages/view/5", donde 5 es el mensaje que quieren ver. En todos todas estas acciones, siempre me aseguro de que el usuario tenga acceso para verlo (modificar o eliminar, que sea necesaria), haciendo una simple verificación de base de datos y asegurando que el usuario conectado sea igual al propietario del mensaje.

+0

Sí, la ofuscación de URL para no exponer los ID de la base de datos es solo una forma de seguridad en la oscuridad. No debe confiar en las URL ofuscadas para su seguridad. Aún necesita implementar activamente alguna otra forma de administración de permisos que sea apropiada para su aplicación. –

+0

No debe confiar _only_ en él. Pero tampoco es necesario que las cosas sean fáciles para los piratas informáticos. –

+0

Definitivamente realicé el control de cordura exactamente a lo largo de esas líneas: muestra todo desde la fila 5, a quién le importa si también dice "si necesita saber que esta es la fila 5". Mi problema fue principalmente esto: que mis viewmodels tienen un 1-1 para mis objetos BL y un 1-1 para mis entidades ORM es una coincidencia. No quiero hacer una convención. –

0

Si bien encontrará algunas personas que dicen que las identificaciones son solo un detalle de implementación, en la mayoría de los sistemas necesita una forma única de identificar una entidad de dominio, y lo más probable es que genere una identificación para ese identificador. El hecho de que la ID sea generada por la base de datos es un detalle de implementación; pero una vez que se ha generado, se convierte en un atributo de la entidad de dominio y, por lo tanto, es perfectamente razonable usarlo donde sea que necesite hacer referencia a la entidad.

2

Tenga mucho cuidado, ya que la manipulación de los parámetros puede provocar la modificación de los datos. Las reglas sobre "quién puede acceder a los identificadores" deben integrarse muy cuidadosamente en su aplicación al exponer estos identificadores.

Por ejemplo, si está actualizando un pedido basado en OrderId, incluya en su cláusula where para carga y actualizaciones que: donde order.orderid = passedInOrderId and Order.CustomerId =

he desarrollado una extensión para ayudar con los identificadores almacenados en MVC disponibles aquí:

http://mvcsecurity.codeplex.com/

también que hablar de esto un poco en mi curso de seguridad en: Hack Proofing your ASP.NET MVC and Web Forms Applications

+0

Su proyecto codeplex se parece mucho a una técnica que usamos aquí. Pero no usamos una clave de máquina, utilizamos una clave de una sesión respaldada por una base de datos, por lo que funciona en todas las diferentes cajas de nivel ui. Estoy bastante sorprendido de todos los que piensan que nunca tendrán ningún error en el que pasen por alto la validación de acceso de usuario perfecta. Ese no es el mundo real. –

+0

Buena sugerencia, y hará controles de permisos/roles en BL, donde opera en ID reales. –

1

Aparte de esas respuestas, a veces es bueno usar identificaciones obvias para que la gente pueda piratear la url para obtener la información que desea. Por ejemplo, www.music.com \ artist \ acdc o www.music.com \ arist \ smashing-pumpkins. Si es significativo para sus usuarios y si puede aumentar la información que el usuario entiende de la página a través de la URL, mejor aún y especialmente si su segmento de mercado es joven o experto en tecnología, entonces use la identificación para su ventaja. Esto también impulsará tu SEO. Diría que cuando no sea útil, codifícalo. Solo se necesita un error por parte de un desarrollador para no verificar la identidad de un cliente en una sesión y exponer a toda su base de clientes.

¡Pero por supuesto, las pruebas de su unidad deberían captar eso!

+0

Eso es otra cosa en que pensar, ya sea informativo y legible o temporal y sin sentido, es bueno, pero continúo sintiéndolo heredado del DB porque no lo es; ¿Alguna sugerencia de cómo implementar realmente el mapeo de cualquier tipo? Sólo una columna en la base de datos para el usuario fácil, creo que –

+0

Oh, ya veo. Te refieres al mapeo de Smashing-Pumpkins a 1456789. Creo que debería ser otra columna en el DB. Pero la mayoría de los ejemplos de mvc que veo están usando identidades por todos lados. El problema es que 1456789 es autogenerado garantizado único. Todo lo que intente hacer con uno de los otros campos significativos puede no ser exclusivo, y si no es único, no es bueno tratar de usarlo para una consulta. A menos que hagas algo como hotmail, smashing-pumpkins, smashing-pumpkins8973232, etc. –

Cuestiones relacionadas