No sé si mi pregunta está dentro de la proximidad de lo que debería estar preguntando sobre el desbordamiento de la pila, pero si es así...
¿Por qué necesitamos escribir reglas de seguridad en 'Reglas' de Firebase cuando literalmente puedo ingresar al código de mi cliente y decir:
db.collection("users").get().then(res=> { res.docs.map(user => { if (user.data().uid !== auth.currentUser.uid) { // do something I'm about to put in this code snippet } }) })Por ejemplo, ¿puede alguien ingresar mi código del lado del cliente y escribir lo que quiera y es por eso que necesitamos escribir el código en las reglas de seguridad dentro de la consola de Firebase?
También me confunde por qué necesitamos las funciones de Firebase cuando simplemente podemos hacer la lógica en el lado del cliente, aunque entiendo que algunas cosas deben hacerse en el lado del servidor.
Pero solo para el alcance de esta pregunta, ¿alguien puede explicarme claramente por qué no podemos simplemente escribir nuestra seguridad dentro de nuestro código para que las cosas funcionen?
Espero haber sido minucioso con la información. Gracias.
Firebase también tiene una API REST que permite que cualquier persona realice solicitudes a sus servicios de Firebase directamente sin que su código esté en juego. Entonces, incluso si la ingeniería inversa y la modificación del código fueran imposibles, existe la API REST.
No debe confiar en las aplicaciones cliente (especialmente las aplicaciones web) y siempre valide los datos entrantes y asegúrese de que solo los usuarios autorizados puedan modificarlos.
Sin embargo, ¿cómo obtendrían la información necesaria para realizar llamadas API a mi base de datos? ¿Y no necesitarían una llave?
Si verifica la configuración de Firebase, contiene una clave de API que se usa para identificar su proyecto de Firebase únicamente y no hay riesgo de que sea visible.
Ahora que cualquier persona en Internet conoce la dirección de su base de datos, puede usarla con la API REST si no tiene configuradas reglas de seguridad.
Tenga en cuenta que después de ejecutar la db.collection("users").get() , todos los documentos ya se han obtenido (y los datos deben estar visibles en la pestaña de red) de Firestore y luego simplemente está recorriendo todos los documentos para encuentre uno que coincida con el UID del usuario actual.
Esta consulta sin reglas de seguridad no es segura (a menos que la lista de usuarios sea una característica de su aplicación):
db.collection("users").get().then(res => { const user res.docs.find(user => user.data().uid === auth.currentUser.uid) })En su lugar, debe usar consultas o acceder a documentos específicos del usuario y tener reglas de seguridad como se muestra a continuación para garantizar que un usuario pueda leer/escribir solo sus propios datos:
db.collection("users").doc(auth.currentUser.uid).get().then(res => { console.log("user:", res.data()) }) // Security rules match /users/{userId} { allow read, write: if request.auth.uid === userId; }