Как проверить синхронизацию времени c в приложении Ioni c 4, чтобы пользователь не обманывал / обманывал время? - PullRequest
0 голосов
/ 02 февраля 2020

Я разрабатываю приложение в Ioni c 4 с использованием Angular и использую Firebase для хранения и извлечения данных с использованием AngularFire.

Мое приложение отображает список событий из базы данных, которые охватывают два дня с текущего времени и имеет возможность регистрации на события. События, которые имели время начала в прошлом и время начала в будущем (более 3 дней), не отображаются в приложении. В настоящее время я использую системное время клиента, но проблема заключается в том, что пользователь может изменить время устройства на прошлое, чтобы увидеть все события в прошлом, а пользователь может изменить время на будущее (через 3+ дня), чтобы увидеть все предстоящие события.

Я думал об использовании Firebase Server Time с использованием

firebase.firestore.FieldValue.serverTimestamp();

Как упоминалось здесь Как вы можете получить время сервера из Firebase . Это занимает много времени, так как я должен выполнить две операции: записать метку времени сервера и прочитать ее, а затем сравнить метку времени чтения с меткой времени пользовательского устройства за прошедшее время. И также, я не могу проверить будущее время с этим подходом.

Какие-либо другие подходы, которые могут предотвратить обман времени / фальсификацию?

1 Ответ

1 голос
/ 02 февраля 2020

Если вы действительно хотите запретить плохим клиентам доступ к данным, к которым им не следует обращаться, вам нужно будет использовать правила безопасности для обеспечения этого. Это единственный способ заставить клиента играть по вашим правилам.

Например, чтобы запретить клиентам когда-либо читать какой-либо документ старше текущего времени, а у вас есть временная метка, хранящаяся как поле с именем «timestamp» в документ в коллекции под названием "c":

match /c/{id} {
    allow read: if resource.data.timestamp > request.time;
}

Чтобы удовлетворить этот запрос, клиент должен запрашивать только те документы, где отметка времени> firebase.firestore.FieldValue.serverTimestamp(). Все другие запросы к коллекции "c" завершатся неудачно с ошибкой разрешения.

Без строгих правил безопасности или некоторого внутреннего кода, обеспечивающего ограничения, которые вы хотите наложить, вы должны предполагать, что клиент может и получит доступ к данным, независимо от того, что их часы или ваш код говорит.

...