Comprender las reglas de seguridad de la base de datos en tiempo real de Firebase

Las reglas de seguridad de la base de datos en tiempo real de Firebase determinan quién tiene acceso de lectura y escritura a su base de datos, cómo están estructurados sus datos y qué índices existen. Estas reglas residen en los servidores de Firebase y se aplican automáticamente en todo momento. Cada solicitud de lectura y escritura solo se completará si sus reglas lo permiten. De forma predeterminada, sus reglas no permiten que nadie acceda a su base de datos. Esto es para proteger su base de datos contra abusos hasta que tenga tiempo de personalizar sus reglas o configurar la autenticación.

Las reglas de seguridad de bases de datos en tiempo real tienen una sintaxis similar a JavaScript y se presentan en cuatro tipos:

Tipos de reglas
.leer Describe si los usuarios pueden leer los datos y cuándo.
.escribir Describe si se permite escribir datos y cuándo.
.validar Define cómo se verá un valor formateado correctamente, si tiene atributos secundarios y el tipo de datos.
.indexOn Especifica un elemento secundario para indexar para admitir pedidos y consultas.

Descripción general de la seguridad de la base de datos en tiempo real

Firebase Realtime Database proporciona un conjunto completo de herramientas para administrar la seguridad de su aplicación. Estas herramientas facilitan la autenticación de sus usuarios, hacer cumplir los permisos de los usuarios y validar las entradas.

Las aplicaciones basadas en Firebase ejecutan más código del lado del cliente que aquellas con muchas otras pilas de tecnología. Por lo tanto, la forma en que abordamos la seguridad puede ser un poco diferente a la que usted está acostumbrado.

Autenticación

Un primer paso común para proteger su aplicación es identificar a sus usuarios. Este proceso se llama autenticación . Puedes usar Firebase Authentication para que los usuarios inicien sesión en tu aplicación. Firebase Authentication incluye soporte directo para métodos de autenticación comunes como Google y Facebook, así como inicio de sesión por correo electrónico y contraseña, inicio de sesión anónimo y más.

La identidad del usuario es un concepto de seguridad importante. Diferentes usuarios tienen datos diferentes y, a veces, tienen capacidades diferentes. Por ejemplo, en una aplicación de chat, cada mensaje está asociado con el usuario que lo creó. Los usuarios también podrán eliminar sus propios mensajes, pero no los mensajes publicados por otros usuarios.

Autorización

Identificar a su usuario es sólo una parte de la seguridad. Una vez que sepa quiénes son, necesitará una forma de controlar su acceso a los datos de su base de datos. Las reglas de seguridad de bases de datos en tiempo real le permiten controlar el acceso de cada usuario. Por ejemplo, aquí hay un conjunto de reglas de seguridad que permite que cualquiera lea la ruta /foo/ , pero nadie pueda escribir en ella:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Las reglas .read y .write caen en cascada, por lo que este conjunto de reglas otorga acceso de lectura a cualquier dato en la ruta /foo/ así como a cualquier ruta más profunda como /foo/bar/baz . Tenga en cuenta que las reglas .read y .write menos profundas en la base de datos anulan las reglas más profundas, por lo que el acceso de lectura a /foo/bar/baz aún se otorgaría en este ejemplo incluso si una regla en la ruta /foo/bar/baz se evaluara como falsa.

Las reglas de seguridad de bases de datos en tiempo real incluyen variables y funciones integradas que le permiten hacer referencia a otras rutas, marcas de tiempo del lado del servidor, información de autenticación y más. A continuación se muestra un ejemplo de una regla que otorga acceso de escritura a usuarios autenticados en /users/<uid>/ , donde <uid> es el ID del usuario obtenido a través de Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Validación de datos

La base de datos Firebase Realtime no tiene esquemas. Esto hace que sea fácil cambiar cosas a medida que se desarrolla, pero una vez que su aplicación esté lista para distribuirse, es importante que los datos se mantengan consistentes. El lenguaje de reglas incluye una regla .validate que le permite aplicar lógica de validación usando las mismas expresiones utilizadas para las reglas .read y .write . La única diferencia es que las reglas de validación no funcionan en cascada , por lo que todas las reglas de validación relevantes deben evaluarse como verdaderas para que se permita la escritura.

Estas reglas imponen que los datos escritos en /foo/ deben ser una cadena de menos de 100 caracteres:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Las reglas de validación tienen acceso a las mismas funciones y variables integradas que las reglas .read y .write . Puede usarlos para crear reglas de validación que tengan en cuenta los datos de otras partes de su base de datos, la identidad de su usuario, la hora del servidor y mucho más.

Definición de índices de bases de datos

Firebase Realtime Database permite ordenar y consultar datos. Para tamaños de datos pequeños, la base de datos admite consultas ad hoc, por lo que generalmente no se requieren índices durante el desarrollo. Sin embargo, antes de iniciar su aplicación, es importante especificar índices para cualquier consulta que tenga para asegurarse de que continúen funcionando a medida que su aplicación crece.

Los índices se especifican mediante la regla .indexOn . A continuación se muestra un ejemplo de declaración de índice que indexaría los campos de altura y longitud de una lista de dinosaurios:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Próximos pasos