可能的重复:
如何在应用程序运行之间本地检测用户的 iPhone 时钟进度? https://stackoverflow.com/questions/7122216/how-can-i-locally-detect-iphone-clock-advancement-by-a-user-between-app-runs
有没有办法确定iOS中的实际时间和日期(而不是设备的时间) https://stackoverflow.com/questions/12006245/is-there-a-way-to-determine-the-actual-time-and-date-in-ios-not-the-time-of-the
iOS 中是否有一个可以使用但用户无法更改的时钟 https://stackoverflow.com/questions/11413616/is-there-a-clock-in-ios-that-can-be-used-that-cannot-be-changed-by-the-user
Brief
我正在使用一个基于自动更新订阅的应用程序。当应用程序收到 Apple 的最新收据时,它会存储expires_date_ms
key in NSUserDefaults
。该日期后三十天,该应用程序会与 Apple 核实订阅是否仍然有效。该应用程序可以被视为离线应用程序,但它必须每 30 天连接到互联网一次才能检查订阅状态。这次比较将用于告诉用户他/她必须连接。
Problem
我正在使用下面的代码将当前时间与expires_date_ms
:
NSTimeInterval expDateMS = [[productInfo objectForKey:@"expires_date_ms"] doubleValue];
NSTimeInterval currentDateMS = ([[NSDate date] timeIntervalSince1970] * 1000);
if (currentDateMS > expDateMS)
subExpired = YES;
这很好并且运行良好,但据我所知,存在一个可以被利用的漏洞 - 如果用户将设备的时钟向后设置一小时/一个月/十年,时间比较将变得不可靠,因为[NSDate date]
使用设备的当前时间(如果我错了,请纠正我)。
Question
有没有办法以毫秒为单位检索与设备无关的时间?一种可以在不考虑设备时钟的情况下准确可靠地进行测量的技术?
虽然 Kevin 和 H2CO3 是完全正确的,但还有其他解决方案可用于检查订阅(我希望不需要毫秒精度......)
第一次观看UIApplicationSignificantTimeChangeNotification
以便您在时间突然改变时收到通知。如果您被停职,这甚至会发送给您(尽管我不相信如果您被解雇,您会收到它)。当运营商时间更新时会调用此函数,我believe当有手动时间更新(检查)时调用它。它也会在当地午夜和夏令时更改时调用。重点是,当时间突然改变时,它经常被调用。
跟踪进入后台的时间。跟踪您返回前台的时间。如果时间大幅倒退(超过一两天),请建议您访问网络来检查情况。每当您向服务器签入时,它都应该告诉您它认为现在是什么时间。您可以使用它来同步系统。
您可以类似地跟踪您的实际运行时间。如果它与明显的运行时间严重不同步,那么再次请求访问网络以同步。
我确信攻击者能够从该系统中偷偷溜走 35 天或其他时间,而不是 30 天,但任何愿意努力工作的人都会破解您的软件并完全检查。这里的焦点是那些不负责任的攻击者,他们只是在扰乱他们的时钟。而且你可以很好地捕捉到。
您应该仔细测试这一点,并且非常犹豫是否要指责用户任何事情。只需连接到您的服务器就足以让合法用户再次工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)