如何检查系统日期是否正确? (防止滥用)vb .NET

时间:2011-03-24 01:15:47

标签: vb.net date

我正在开发一个与业务相关的程序,因此我需要知道系统日期是否正确 - 与远程服务器一致。你是如何在vb .NET winforms中做到的?

P.S:另外,当系统时钟改变以防止黑客攻击时,是否有任何方法可以引发某些事件?我不希望用户在登录帐户后更改本地日期。

提前致谢。

4 个答案:

答案 0 :(得分:1)

您需要使用外部服务器验证时钟,如果它在某个容差范围内,则接受它。所有时钟在某种程度上都是错误的。通常,某个服务器上的Web服务就足够了,但有许多免费的NTP-services。但是请注意,我需要花费5分钟来绕过它,因此为了更高的安全性,您需要使用SSL(HTTPS)(使man-in-the-middle attacks成为不可能)。

但请注意:

  • 您需要正确补偿时区,因为服务器和用户可能有不同的时区。时区信息以ISO 8601格式的DateTime字符串发送,因此非常简单。
  • 什么阻止用户断开互联网连接?你真的想要求互联网访问来启动应用程序吗?有笔记本电脑的人会很快发现离线模式可以让应用程序正常工作。
  • 有些人使用的一种技术是,如果应用程序发现未来的某个时间(产品已过期),则需要重新激活它。重新激活需要与互联网服务器通信,互联网服务器可以根据可信时钟验证许可证。

如果您想知道用户何时更改时钟,只需设置一个线程以循环60秒Thread.Sleep(60000)。然后检查60秒前的当前日期时间。自上次检查以来,它应始终为60秒 - / + 1秒。 (+/- 1秒是为了弥补app在执行计时器时稍微悬挂的延迟等)

我把一个简单的例子拼凑在一起:
编辑:对不起,第一个样本是在C#中。在VB.Net中重做它。

Imports System.Threading

Public Class Form1
    Private TimeMonitorThread As Thread

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        TimeMonitorThread = New Thread(TimeMonitorThreadLoop)
        TimeMonitorThread.Name = "TimeMonitorThread"
        TimeMonitorThread.IsBackground = True
        TimeMonitorThread.Start()

    End Sub

    Private Sub TimeMonitorThreadLoop()

        Dim sleepSeconds As Integer = 60
        Dim tolerance As Integer = 1

        While (True)
            Dim before As DateTime = DateTime.Now
            Thread.Sleep(sleepSeconds * 1000)
            Dim after As DateTime = DateTime.Now
            If (Math.Abs(CInt(after.Subtract(before).TotalSeconds) - sleepSeconds) > tolerance) Then
                ' Time has changed!
            End If
        End While
    End Sub

End Class

答案 1 :(得分:0)

理论上只是步骤。

首先,在远程服务器中创建一个提供当前日期时间的asp .net应用程序。为确保增加安全性,请加密当前日期。

然后在您的PC中,创建一个winform应用程序,可以访问该远程服务器并根据需要获取当前时间。

然后在winform应用程序中,检索当前日期时间。然后,只需在远程服务器和winform应用程序中指示的当前时间之间进行比较。

您可以根据需要调整PC当前日期时间,以便与远程服务器时间同步。在业务应用程序的情况下,您可以通知用户或禁用应用程序功能,直到该用户按照您希望的方式执行操作。例如,拨打服务部门电话或获取解锁密钥等。

答案 2 :(得分:0)

在Tedd Hansen提交的.net VB代码中,请确保更改Private sub form1_load中的第一行: -

TimeMonitorThread = New Thread(AddressOf TimeMonitorThreadLoop)

(地址必须在那里,否则你会得到一个例外)

答案 3 :(得分:0)

我有一个应用程序,该应用程序在同一局域网上的SQL Server计算机上的局域网上运行。如果没有数据库服务器连接,该应用程序将无法运行,因此禁用网络最终将导致无应用程序使用。服务器已被物理锁定,因此除非获得许可或有效授权(防止BIOS更改),否则没人会打开或关闭服务器。如果有人遇到这种情况,则可以非常轻松地查询数据库并使用SELECT GETDATE()获取准确的日期和时间,并将其与所需的任何变量进行比较。

对于我来说,我必须阻止用户将回溯的数据输入到系统中,因此在保存数据输入表单时,我查询数据库以比较当前机器的日期和服务器的日期以获取有效的输入。