2010-02-27 15 views
9

Sto lavorando con un'app WPF/C# in cui ho bisogno di bloccare gli utenti dall'accedere a una particolare funzionalità per un po 'di tempo. In sostanza, dal momento in cui si verifica un determinato evento, voglio impedire determinati accessi per le prossime 24 ore.Esiste un orario assoluto di Windows per i timestamp? (.NET)

Il semplice caso:

  • evento si verifica, salvare timestamp (utilizzando DateTime o simili)
  • utente cerca di accedere a un'area di 15 ore più tardi, confronto al timestamp ... blocco
  • tentativi degli utenti per accedere all'area 25 ore più tardi, confronta Ora con il timestamp ... consenti

Tutto bene. Tuttavia, l'utente ha la possibilità di modificare l'ora del sistema, che mi fa vergognare. Possono semplicemente impostare l'ora del sistema con 24 ore di anticipo e la mia app non sarà più saggia.

Suppongo che la modifica dell'ora in Windows si diriga verso l'orologio in tempo reale del sistema ... quindi esiste un timer di funzionamento libero indipendente dall'orologio di sistema? Uno con cui l'utente non può scherzare?

Qualsiasi intuizione è apprezzata.

risposta

3

Environment.TickCount non cambia con le modifiche all'ora di sistema ma si reimposta al riavvio. Un'opzione è un servizio Web protetto HTTPS e un criterio certificato che non consente errori di convalida dei certificati. Altrimenti sarebbe piuttosto banale spoofare la risposta dal servizio.

Indietro quando ho iniziato a vendere software ero molto paranoico sulla pirateria e così via. Non che io stia suggerendo che i tuoi scopi siano gli stessi. Ma sono giunto alla conclusione che in genere le persone non si scherzano con il loro tempo di sistema perché rovinano così tante altre cose sul loro computer che non ne vale la pena. Naturalmente diverse applicazioni avranno requisiti di integrità diversi, ma ho solo pensato di aggiungere questo bit.

+0

ma entrambi questi sono dipendono dall'ambiente dell'utente. Cosa succede al riavvio (per Environment.TickCount) o se Internet è scollegato (servizio Web)? –

+2

@Stephen, ho notato in particolare che Environment.TickCount si reimposta al riavvio. Per quanto riguarda se il servizio non è disponibile, se l'app richiede quel livello di integrità non dovrebbe essere consentito di funzionare offline. – Josh

+1

+1 La parte importante di questa risposta è che non solo è una fonte esterna di tempo l'unica vera opzione, ma se si vuole veramente essere sicuro, è necessario proteggere portarvi direttamente contro utenti malintenzionati spoofing il servizio di tempo - da qui la necessità per SSL . –

1

Non proprio. L'unico timer assoluto affidabile è esterno, sotto il tuo controllo o sotto il controllo di qualcuno di cui ti fidi, ad esempio uno dei time server su Internet (ad esempio time.windows.com). È possibile accedere a questi utilizzando una libreria NTP o SNTP come quella pubblicata allo http://www.codeproject.com/KB/IP/ntpclient.aspx. Naturalmente, in questo caso (come da un commento alla risposta di Josh) è necessario considerare cosa fare se non si è in grado di raggiungere il server orario, ad es. l'utente disconnette la macchina dalla rete.

È possibile utilizzare Environment.TickCount per ottenere il tempo in quanto il sistema ha cominciato, che l'utente non può pasticciare con - ma se l'utente o qualcun altro si riavvia il sistema, allora questo avrà riavviato, quindi non è affidabile per lo scopo che desideri.

1

No, non c'è una conoscenza assoluta di che ora è in Windows, come potrebbe esserci? Se hai bisogno di un timestamp affidabile, allora devi prenderne uno da una posizione affidabile su internet. Uno con cui l'utente non può scherzare.

È possibile ottenere il tempo da un servizio di orario di rete, o andare a www.time.gov e raschiare il tempo fuori dall'html che si ottiene. http://www.time.gov/about.html

O semplicemente vivere con i pochi utenti disposti a impostare il proprio orologio in avanti.

1

Per ottenere un tempo di bollo assoluto, provare una richiesta NTP per uno dei (libero) NIST time servers

1

Utilizzando un servizio di Windows, è possibile fingere un tempo trascorso in assoluto, dalla registrazione quando il tempo di sistema viene aggiornato.

Ciò richiederebbe che tu sia in grado di installare un servizio sulla macchina, ovviamente, e che i tuoi utenti non siano abbastanza intelligenti da sradicarlo.

Ecco alcune informazioni su intrappolando il messaggio WM_TIMECHANGE in un servizio di .NET: detecting a wm_timechange event in a .net windows service

+1

Può valere la pena notare che gli utenti possono comunque modificare l'ora nella configurazione del BIOS, così, anche questo molto lavoro può essere abbastanza facilmente aggirata. – overslacked