10

我正在使用 WPF/C# 应用程序,我需要在一段时间内阻止用户访问特定功能。基本上,从某个事件发生的那一刻起,我想在接下来的 24 小时内阻止某些访问。

简单案例:

  • 事件发生,保存时间戳(使用 DateTime 或类似的)
  • 用户在 15 小时后尝试访问区域,将 Now 与 timestamp... 块进行比较
  • 用户在 25 小时后尝试访问区域,将现在与时间戳进行比较...允许

都好。但是,用户有能力改变系统时间,这让我很头疼。他们可以简单地提前 24 小时设置系统时间,我的应用程序也不会更聪明。

我假设更改 Windows 中的时间会进入系统的实时时钟......那么是否有任何独立于系统时钟的免费运行计时器?一个用户不能乱用的?

任何见解都值得赞赏。

4

5 回答 5

3

Environment.TickCount 不会随着系统时间的变化而变化,但会在重新启动时重置。一种选择是 HTTPS 安全 Web 服务和不允许证书验证失败的证书策略。否则,欺骗服务的响应将是微不足道的。

当我第一次开始销售软件时,我对盗版等非常偏执。并不是说我建议您的目的是相同的。但我得出的结论是,人们通常不会弄乱他们的系统时间,因为它搞砸了他们计算机上的许多其他事情,不值得麻烦。自然不同的应用程序会有不同的完整性要求,但我只是想添加这一点。

于 2010-02-27T22:45:15.080 回答
1

并不真地。唯一可靠的绝对计时器是外部计时器,在您的控制下或您信任的人的控制下,例如 Internet 上的时间服务器之一(例如 time.windows.com)。您可以使用 NTP 或 SNTP 库访问这些库,例如发布在http://www.codeproject.com/KB/IP/ntpclient.aspx的库。当然,在这种情况下(根据对 Josh 答案的评论),您需要考虑如果您无法访问时间服务器该怎么做,例如用户断开机器与网络的连接。

您可以使用 Environment.TickCount 来获取系统启动以来的时间,用户不能弄乱 - 但是如果用户或其他人重新启动系统,那么它将重新启动,因此对于您需要的目的来说它不可靠.

于 2010-02-27T22:45:46.437 回答
1

不,在 Windows 中没有绝对的时间知道它是什么时间,怎么可能呢?如果您需要一个可靠的时间戳,那么您需要从 Internet 上的可靠位置获取一个。一个用户不能乱用的。

您可以从网络时间服务中获取时间,或者访问 www.time.gov 并从您返回的 html 中获取时间。 http://www.time.gov/about.html

或者只是与愿意将时钟提前的少数用户一起生活。

于 2010-02-27T22:45:53.457 回答
1

要获得绝对时间戳,请尝试向(免费)NIST 时间服务器之一发出 NTP 请求

于 2010-02-27T22:49:19.533 回答
1

使用 Windows 服务,您可以通过记录系统时间的更新时间来伪造绝对经过的时间。

当然,这将要求您能够在机器上安装服务,并且您的用户不够聪明,无法将其根除。

以下是在 .NET 服务中捕获 WM_TIMECHANGE 消息的一些信息:detecting a wm_timechange event in a .net windows service

于 2010-02-28T02:23:01.007 回答