在客户端比较订阅到期日期和当前日期是否安全?或者这可以被操纵吗?

Is it Safe to Compare Subscription-Expiration-Date & Current-Date on the Client Side? Or can this be manipulated?

我从后端得到了一些数据,它告诉我用户订阅的到期日期。如果这个日期是过去的,我将用户导航到其他地方,所以她无法登录:

  if (expirationDate.getTime() < new Date().getTime()) {
      navigate('/subscription-expired')
  }

我想知道在客户端上做这样的比较检查是否安全?这可以被操纵吗?

您的用户是否可以操纵 JavaScript 代码或只是在他们的计算机上设置了错误的日期和时间?他们当然可以。会那么重要吗?在您的情况下,您只想将用户重定向到另一个页面,所以这并不重要,但它会影响对您的应用程序的信任,因为在某些情况下它会以意想不到的方式运行,并说订阅已过期它不是(或者说它没有过期)。

如果您有一个信任客户端提供当前日期而不验证它的后端,这可能会更加重要,因为您的数据可能会被伪造并且您的业务规则可能会被绕过。

这取决于用例,但通常,您不应将浏览器中的 new Date() 视为真实来源。您的后端仍然是真相持有者。

你永远不应该信任客户端上的任何东西。

最重要的是,更重要的是,服务器时间和您的客户端时间可能不同。

那么问题来了,你的订阅开始时间是基于客户端时间还是服务器时间? (这应该是服务器时间,因为我们不应该信任客户端)

最安全的方法是让您的服务器 return 订阅是否有效,也就是 true/false;

If it's false, navigate('/subscription-expired')

最重要的是,每一页都应该包含相同的支票。

客户端检查数据、验证数据和其他东西的好处是:

  • 提醒 普通用户 he/she 不在正确的路径上(用户被告知她的订阅到期)。 (结果:用户体验)
  • 减少服务器负载。当防止普通用户向服务器发送无效数据时。 (普通用户在发现他们的订阅已过期时不会向服务器发送额外的数据)(结果:资源节省和性能)

但是在服务器端检查是义务,因为有非普通用户(谁修改了 Js,使用 Postman、机器人、入侵者发布数据)可能会在没有干预和验证您的客户端代码的情况下发送 Http 请求,这可能会滥用您的系统。

Client side is the battle field of enemy

总结一下:

必须服务器端验证数据以防止任何滥用。

但是建议客户端验证数据以提高性能整个系统。

例如你的情况:

  • 在服务器端:

    • 检查过期时间=>
    • 如果已过期=>
    • return 403 错误:{message:"expired"}
  • 在客户端:

    • 如果 {message:"expired"} 出现 403 错误。 =>
    • 重定向用户。