确保移动用户没有向服务器发送虚假的日期、时间和时区

Make sure mobile user isn't sending fake date, time and timezone to the server

一个移动应用程序有一个签到功能,用户可以发送照片和观察结果,该应用程序会将他的位置、日期和时间附加到请求中,并将其发送到服务器。

这个日期和时间不能被用户伪造是非常重要的,否则用户可以上班迟到但用假的“15 分钟前”签到。

服务器在美国,用户在很多国家,所以有不同的日期和时区,因此我认为我不能使用服务器日期和时间.

世界各地的用户都可以在网站上看到该签到,但签到时间必须是签到用户的时间。

例子

用户于 7 月 5 日在墨西哥签到 13:45。
网站应显示此日期和时间,7 月 5 日 13:45,即使它是由日本的某个人可视化的。

问题

用户在巴西 09:37 7 月 6 日签到,但他伪造手机日期和时间设置说现在是 7 月 6 日 09:00 以假装他没有上班迟到。

服务器如何知道它实际上是 7 月 6 日 09:37 而不是 09:00,并向世界上任何地方看到它的人显示正确的日期和时间?

请记住,用户也可以伪造他的时区和 GPS,但服务器仍需要获取 真实 时区以显示真实且不会误导的信息。

你不能做你想做的事。您的应用依靠移动设备的 OS 来获取日期、时间、时区和 GPS 等信息。虽然开箱即用 OS 很难伪造 gps 数据,但它总是有可能的。你真正想要的是 "backdoor"。一个后门,无论用户多么努力地隐藏它,都可以让您获得用户设备的 "real" 信息。如果可能的话,我们就不会 need/have 黑客和政府网络安全团队。任何知道后门的人都可以找到世界上其他任何人。

您只能尝试使用您自己的一些措施来抓住此类滥用者。您可以检查用户时区是否正在更改。或者自上次 he/she 使用该应用以来使用来自不同国家/地区的 IP 地址。或者,如果您真的要请求 gps 许可,您还可以查看该人随时间推移的位置是否没有意义(例如,用户在加拿大,但 3 小时后看起来他们在中国)。一旦您检测到此类可能的滥用行为,您就可以标记该帐户以供人工审核。

It is extremely important that this date and time is not faked by the user, or else the user will be able to be late at work but check-in with a fake "15 minutes ago".

这部分最好通过在收到请求时从服务器获取 UTC 时间戳来处理。

The server is in USA, and the users are in many countries so there are different date and timezones, for that reason I think I can't use server date and time.

时区与此无关。从服务器获取 UTC 时间,而不是本地时间。服务器的本地时间不应在您的应用程序代码中使用。

如果您需要将其调整到特定时区,那么您可以通过多种方式从用户那里收集,或者您可以由应用程序的某些管理员将一个永久分配给用户。即使时区错误或伪造,也不会影响工作的持续时间 - 因为您在 UTC 中捕获了它。

Example
User checks-in at 5th July 13:45 in Mexico.
Website should show this date and time, 5th July 13:45, even if it's visualized by someone in Japan.

没关系。保存用户在墨西哥(......实际上,墨西哥有几个时区,所以你需要更具体 - 使用 an IANA time zone identifier)。您可以随时将 UTC 时间戳转换为墨西哥时间 - 当您收到时间戳(保存 UTC 和墨西哥时间)时,或者当您将其显示给用户时(仅保存 UTC 并在显示时转换为墨西哥时间) ).用户在日本也与此场景无关。

Problem
User checks-in at 6th July 09:37 in Brazil, but he fakes his mobile date and time settings to say it's 6th July 09:00 to pretend he's not late for work.

如果您在服务器上捕获 UTC 时间并确保您的服务器时钟正确同步,这不是问题。

Keep in mind that user can also fake his timezone and GPS, still the server needs to get the real timezone to show real and not mislead information.

确实如此。您无法以无法伪造的方式从用户那里获取此信息。但是,您可以避免在应用程序代码中依赖于此。对于纯粹的持续时间计算,只需将所有内容都基于 UTC。对于更复杂的事情(例如确定轮班差异或每天在午夜或其他当地高峰时间加班等)然后让其他一些用户设置适用的时区而不是收集它.例如,假设这些是员工,员工的经理或人力资源部门会为员工的人事记录分配一个时区。

当然,如果员工出差在外,并且当地时间规则在不同时区适用不同,那么您就更有逻辑地考虑如何捕捉此类细节。 (我的经验告诉我这很少见。)