在客户端比较订阅到期日期和当前日期是否安全?或者这可以被操纵吗?
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 错误。 =>
- 重定向用户。
我从后端得到了一些数据,它告诉我用户订阅的到期日期。如果这个日期是过去的,我将用户导航到其他地方,所以她无法登录:
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 错误。 => - 重定向用户。
- 如果