-
Notifications
You must be signed in to change notification settings - Fork 0
Add Firebase security guidelines for personal projects #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,56 @@ | ||||||
| For your personal project, Firebase Realtime Database is a great choice. The key to security lies almost entirely in properly configuring **Firebase Security Rules** and **Firebase Authentication**, which control access to your data. | ||||||
|
|
||||||
| Here is a comparison of different security rule configurations for a personal database, from least to most secure: | ||||||
|
|
||||||
| | Security Level | Authentication Method | Security Rules Example | Best For | | ||||||
| | :--- | :--- | :--- | :--- | | ||||||
| | **Open (Test Mode)** | None | `{ ".read": true, ".write": true }` | Initial development only; **highly insecure** for production. | | ||||||
| | **Authenticated Only** | Firebase Auth (Anonymous or Email/Password) | `{ ".read": "auth != null", ".write": "auth != null" }` | Simple personal projects; basic security. | | ||||||
| | **User-Specific Data** | Firebase Auth (Any method) | `{ "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } }` | **Recommended for personal projects**; users access only their own data. | | ||||||
|
|
||||||
| ### π Implementing Recommended Security for a Personal Database | ||||||
|
|
||||||
| For a truly secure personal database, you should implement the "User-Specific Data" model. This involves two main steps: | ||||||
|
|
||||||
| 1. **Set Up Firebase Authentication** | ||||||
| Even for a single-user app, don't skip authentication. It provides a secure way to identify you as the only authorized user. | ||||||
| - **Enable Authentication** in your Firebase console. | ||||||
| - Choose a sign-in method. For personal projects, **Email/Password** or **Anonymous Authentication** are straightforward options. | ||||||
| - Integrate the sign-in flow into your app. Upon successful sign-in, Firebase provides a unique user ID (UID) and an ID token. | ||||||
|
|
||||||
| 2. **Write Strict Security Rules** | ||||||
| Use rules that lock down data access based on the authenticated user's UID. This means you can only read and write data within a path that matches your own user ID. | ||||||
|
|
||||||
| ```json | ||||||
| { | ||||||
| "rules": { | ||||||
| // Users can only access their own node in the 'users' path | ||||||
| "users": { | ||||||
| "$uid": { | ||||||
| ".read": "$uid === auth.uid", | ||||||
| ".write": "$uid === auth.uid" | ||||||
| } | ||||||
| }, | ||||||
| // A separate, public data section if needed | ||||||
| "public_data": { | ||||||
| ".read": true, | ||||||
| ".write": "auth != null" // Or restrict to your UID for writing | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion: Harden the example for
Suggested change
Why Change? βReplacing a permissive "auth != null" with a specific UID check (auth.uid === 'YOUR_UID') tightens write permissions and prevents any other authenticated user from modifying public_data. |
||||||
| } | ||||||
| } | ||||||
| } | ||||||
| ``` | ||||||
| In this structure, you would store your personal data under a path like `users/your_unique_user_id/your_data`. | ||||||
|
|
||||||
| ### π¨ Critical Security Practices to Follow | ||||||
|
|
||||||
| - **Never Use Public Rules in Production**: The default public rules are a major security risk. Anyone who guesses your project's configuration details can steal or delete all your data. | ||||||
| - **Structure Data for Security**: Design your database structure with security rules in mind from the start. It's much harder to secure a poorly structured database later. | ||||||
| - **Validate Input in Rules**: You can add conditions to ensure data being written meets certain criteria (e.g., has the correct fields, is of the right data type). | ||||||
|
|
||||||
| ### π Additional Security Layers | ||||||
|
|
||||||
| For enhanced protection, consider these Firebase features: | ||||||
| - **App Check**: This helps protect your database from abuse by ensuring that requests originate from your official app, adding another layer of defense. | ||||||
| - **Regular Audits**: Periodically check the "Firebase Console > Realtime Database > Rules" section to review and test your rules. | ||||||
|
|
||||||
| By combining **Firebase Authentication** with **user-specific Security Rules**, you can create a robust and secure personal database. If you'd like to explore a specific use case, feel free to ask | ||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion: Mark the insecure examples in the table with a clear "DO NOT COPY TO PRODUCTION" label and replace the inline JSON in the table with short references that point to clearly labeled fenced examples below (including safe, copy-paste-safe alternatives); keep the insecure snippets only in fenced blocks with an explicit warning. [security]