问题描述
我从后端获取了一些数据,这告诉我用户订阅的到期日期。如果该日期是过去的日期,则我会将用户导航到其他地方,因此她无法登录:
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')
最重要的是,每个页面都应包含相同的检查。