2011-03-24 31 views
0

我正在處理與業務相關的程序,所以我需要知道系統日期是否正確 - 與遠程服務器進行了比較。你如何做到這一點在.NET .NET winforms?如何檢查系統日期是否正確? (以防止濫用)vb .NET

P.S:另外,有什麼辦法可以在系統時鐘發生變化時引發一些事件來防止黑客?我不希望用戶在登錄帳戶後更改本地日期。

在此先感謝。

回答

0

您需要使用外部服務器驗證時鐘,並在某個容差範圍內接受該時鐘。所有時鐘在某種程度上都是錯誤的。通常服務器上的web服務就夠了,但有很多免費的NTP-services。但是請注意,我需要5分鐘才能繞過該操作,因此爲了提高安全性,您需要使用SSL(HTTPS)(使man-in-the-middle attacks不可能)。然而

注:

  • 您需要正確補償時區的服務器和用戶可以有不同的時區。時區信息以ISO 8601已格式化的DateTime字符串發送,因此非常簡單。
  • 什麼是阻止用戶斷開互聯網連接?你真的想要需要上網才能啓動應用程序?有人用筆記本電腦很快就會發現離線模式可以讓應用程序工作。
  • 一些人使用的技術是說,如果未來的一段時間(產品過期後)已被應用發現,那麼您需要重新激活它。重新激活需要與互聯網服務器通信,互聯網服務器可以根據可信時鐘驗證許可證。

如果您想知道用戶何時更改時鐘,只需設置一個線程以60秒的Thread.Sleep(60000)循環。然後檢查60秒前的當前日期時間。從上次檢查開始,它應該始終爲60秒 -/+ 1秒。 (+/- 1秒,以補償像應用延誤定時器正在執行略微掛等)

我一起扔一個簡單的例子:
編輯:對不起,第一樣品是在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 
+0

很好的解釋,謝謝。我會這樣做。 – EvanBlack 2011-03-29 01:06:13

0

只是在理論上的步驟。

首先,在遠程服務器中創建一個asp.net應用程序,該應用程序將提供當前日期時間。爲確保增加安全性,請加密當前日期。

然後在您的PC中創建一個可以訪問該遠程服務器並根據需要獲取當前時間的winform應用程序。

然後在你的winform應用程序中檢索當前的日期時間。然後,只需比較遠程服務器和winform應用程序中顯示的當前時間。

您可以根據需要調整您的PC當前日期時間,以便與遠程服務器時間同步。在商業應用的情況下,您可以通知用戶或禁用應用程序功能,直到用戶按照您的意願執行某項操作爲止。例如,打電話給您的服務部門或獲取解鎖密鑰等。

0

在。提交Tedd漢森淨VB代碼,請務必在私人小組Form1_Load的改變行之一: -

TimeMonitorThread = New Thread(AddressOf TimeMonitorThreadLoop) 

(addressof必須有,否則你將得到一個異常)