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

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

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

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


拉风的咖菲猫
浏览 149回答 3
3回答

青春有我

在客户端检查数据、验证数据和其他内容的好处是:提醒普通用户他/她的状态不佳(用户被告知其订阅到期)。(结果:用户体验)减少服务器负载。当防止普通用户向服务器发送无效数据时。(普通用户在发现订阅已过期时不会向服务器发送额外的数据)(结果:资源节省和性能)但检查服务器端是一项义务,因为有非常规用户(修改 Js、使用 Postman、机器人、入侵者发布数据)可能会在不干预的情况下发送 Http 请求,并且验证客户端代码可能会滥用您的系统。客户端是敌人的战场总结一下:您必须在服务器端验证数据以防止任何滥用。但建议也在客户端&nbsp;验证数据,以提高整个系统的性能。例如在你的情况下:在服务器端:检查过期时间=>如果已经过期=>返回 403 错误:{message:"expired"}在客户端:如果出现 403 错误{message:"expired"}。=>重定向用户。

料青山看我应如是

你永远不应该相信客户端的任何东西。最重要的是,服务器时间和客户端时间可能不同。那么问题来了,你的订阅开始时间是基于客户端时间还是服务器时间?(这应该是服务器时间,因为我们不应该信任客户端)最安全的方法是让您的服务器返回订阅是否有效(即 true/false);如果为 false,则导航('/subscription-expired')最重要的是,每个页面都应该包含相同的支票。

浮云间

您的用户是否可以操纵 JavaScript 代码,或者只是在计算机上设置了错误的日期和时间?当然可以。会有那么关键吗?在您的情况下,您只想将用户重定向到另一个页面,因此这并不重要,但它会影响对您的应用程序的信任,因为在某些情况下它会以意想不到的方式运行,并在以下情况下说订阅已过期它不是(或者说它没有过期)。如果您的后端信任客户端提供当前日期而不进行验证,那么这可能会更加重要,因为您的数据可能会被伪造,并且您的业务规则可能会被绕过。这取决于用例,但一般来说,您不应将new Date()浏览器视为事实来源。你的后端仍然是真相的持有者。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript