为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2023-07-06 10:13:38
我从后端获取一些数据,这些数据告诉我用户订阅的到期日期。如果这个日期是过去的日期,我会将用户导航到其他地方,这样她就无法登录:  if (expirationDate.getTime() < new Date().getTime()) {         navigate('/subscription-expired')   }我想知道在客户端上进行这样的比较检查是否安全?这可以被操纵吗?
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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

  • 提醒普通用户他/她的状态不佳(用户被告知其订阅到期)。(结果:用户体验)

  • 减少服务器负载。当防止普通用户向服务器发送无效数据时。(普通用户在发现订阅已过期时不会向服务器发送额外的数据)(结果:资源节省和性能)

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

客户端是敌人的战场

总结一下:

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

建议也在客户端 验证数据,以提高整个系统的性能。

例如在你的情况下:

  • 在服务器端:

    • 检查过期时间=>

    • 如果已经过期=>

    • 返回 403 错误:{message:"expired"}

  • 在客户端:

    • 如果出现 403 错误{message:"expired"}。=>

    • 重定向用户。


查看完整回答
反对 回复 2023-07-06
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

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

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

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

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

如果为 false,则导航('/subscription-expired')

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


查看完整回答
反对 回复 2023-07-06
?
浮云间

TA贡献1829条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2023-07-06
  • 3 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信