微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在客户端比较预订到期日期和当前日期是否安全?还是可以操纵?

如何解决在客户端比较预订到期日期和当前日期是否安全?还是可以操纵?

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

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

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

解决方法

客户端上检查数据,验证数据和其他内容的好处是:

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

但是在服务器端上进行检查是一项义务,因为存在非常规用户(谁修改了Js,并通过Postman发布数据,机器人,入侵者),它们可能会在不进行干预的情况下发送Http请求,并且您的客户端代码验证可能会滥用您的系统。

客户端是敌人的战场

总结:

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

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

例如您的情况:

  • 在服务器端:

    • 检查到期时间=>
    • 如果它已过期=>
    • 返回403错误,原因是:{message:"expired"}
  • 在客户端:

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

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

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

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

,

您永远不应信任客户端上的任何内容。

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

所以问一个问题,您的订阅开始时间是基于客户端还是服务器时间? (应该是服务器时间,因为我们不应该信任客户端)

最安全的方法是让您的服务器返回订阅是否有效(又名true / false);

如果为假,请导航('/ subscription-expired')

最重要的是,每个页面都应包含相同的检查。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。