Является ли приложение python appengine без правил безопасности firestore небезопасным? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть приложение стандартной среды Google App Engine, написанное на Python 3, использующее Flask в качестве фреймворка и firestore в собственном режиме в качестве базы данных. Все вызовы базы данных выполняются в коде App Engine, скрытом за Flask конечными точками / представлениями / обработчиками. Клиентские браузеры не выполняют никаких javascript, которые напрямую вызывают базу данных firestore. Клиентская сторона javascript - это в основном «тупой» код, используемый для косметики. Клиентская сторона javascript делает «что-нибудь» только тогда, когда пользователь создает новую учетную запись или входит в систему, используя firebase auth ui .

Сказав это, я заметил, что некоторые онлайн ресурсы упоминают, что абсолютно необходимо защитить базу данных firestore, поскольку все, что не запрещено правилами безопасности, в основном разрешено (т.е. база данных firestore небезопасна по умолчанию), однако я подозреваю, что это справедливо только для приложений с толстым клиентов (т.е. код на стороне клиента или javascript отвечает за выполнение тяжелой работы по запросам и записи в firestore).

Итак, мой вопрос: пишет эти правила безопасности, необходимые только для мобильных / веб-клиентов, а не для баз данных firestore, доступ к которым осуществляется только кодом на стороне сервера? Или необходимо для всех проектов firestore определять эти правила безопасности? Если так, то я был бы признателен за любые указатели относительно того, где найти разумные правила безопасности по умолчанию, чтобы начать защиту моей базы данных firestore.

Я включаю карикатуру на свой flask main.py файл для справки.

# main.py

from google.cloud import firestore

from mylibrary import function_that_fetches_user_data
from mylibrary2 import function_that_writes_user_content

def validate_cookie(protected_function):
    def wrapper(*args, **kwargs):
        # handle cookie validation
        # run protected function
    return wrapper

# The dashboard is meant to display user data and user content to the user.  
# It is not meant to be seen by other users.
@app.route("/user_dashboard")
@validate_cookie
def dashboard():
    user_id = get_uid_from_cookie
    firestore_client = firestore.Client()
    user_data = function_that_fetches_user_data(user_id, firestore_client)
    return render_template('dashboard.html', user_data)

# The write function creates user content that should only be accessible to the author 
# and the system/app.  
@app.route("/write_user_content")
@validate_cookie
def write_user_content():
    user_id = get_uid_from_cookie
    firestore_client = firestore.Client()
    result = function_that_writes_user_content(user_id, firestore_client)
    return render_template('success.html', result)

1 Ответ

2 голосов
/ 29 мая 2020

Правила безопасности необходимы только для контроля доступа, поступающего из веб-клиентов и мобильных клиентов. Backend SDK, обращающийся к Firestore, фактически полностью обходит правила безопасности, поэтому написание каких-либо правил вообще не повлияет на поведение вашего backend-кода. вы можете установить правила безопасности, запрещающие любой доступ, и это нормально.

match /{document=**} {
  allow read, write: if false;
}
...