10

ユーザーが特定の機能に一定時間アクセスできないようにする必要がある WPF/C# アプリを使用しています。基本的には、あるイベントが発生してから24時間は特定のアクセスを制限したい。

単純なケース:

  • イベントが発生し、タイムスタンプを保存します (DateTime などを使用)
  • ユーザーは 15 時間後にエリアへのアクセスを試み、現在とタイムスタンプを比較します... ブロック
  • ユーザーが 25 時間後にエリアへのアクセスを試行し、現在とタイムスタンプを比較... 許可

すべて良い。ただし、ユーザーはシステム時刻を変更することができます。システム時刻を 24 時間先に設定するだけで、私のアプリはそれほど賢くなりません。

Windows で時刻を変更すると、システムのリアルタイム クロックに移行すると思います。システム クロックとは独立したフリー ランニング タイマーはありますか? ユーザーが台無しにできないもの?

どんな洞察も高く評価されます。

4

5 に答える 5

3

Environment.TickCount は、システム時刻の変更によって変更されませんが、再起動時にリセットされます。1 つのオプションは、HTTPS で保護された Web サービスと、証明書の検証の失敗を許可しない証明書ポリシーです。それ以外の場合は、サービスからの応答を偽装するのは非常に簡単です。

私が最初にソフトウェアの販売を始めたとき、私は著作権侵害などについて非常に偏執的でした。あなたの目的が同じであることを示唆しているわけではありません。しかし、私は、人々は通常、システム時間を台無しにすることはしないだろうという結論に達しました。なぜなら、システム時間を台無しにすることは、コンピュータ上の他の多くのことを台無しにして、手間をかける価値がないからです。当然、アプリケーションが異なれば完全性要件も異なりますが、このビットを追加すると思いました。

于 2010-02-27T22:45:15.080 に答える
1

Windows サービスを使用すると、システム時刻が更新されたときにログを記録することで、絶対経過時間を偽装できます。

もちろん、これにはマシンにサービスをインストールできる必要があり、ユーザーはそれを根絶するほど賢くない必要があります。

.NET サービスでの WM_TIMECHANGE メッセージのトラップに関する情報を次に示します: .net Windows サービスでの wm_timechange イベントの検出

于 2010-02-28T02:23:01.007 に答える
1

あまり。信頼できる唯一の絶対タイマーは、外部のタイマーであり、ユーザーが制御するか、インターネット上のタイム サーバー (time.windows.com など) など、信頼できる人物の制御下にあります。http://www.codeproject.com/KB/IP/ntpclient.aspxに投稿されているような NTP または SNTP ライブラリを使用してこれらにアクセスできます。もちろん、この場合(Joshの回答へのコメントによると)、タイムサーバーに到達できない場合、たとえばユーザーがマシンをネットワークから切断した場合の対処方法を検討する必要があります。

Environment.TickCount を使用して、システムが起動してからの時間を取得できますが、ユーザーが混乱させることはできませんが、ユーザーまたは他の誰かがシステムを再起動すると、これは再起動されるため、必要な目的には信頼できません。 .

于 2010-02-27T22:45:46.437 に答える
1

いいえ、Windows では現在時刻を完全に把握することはできません。信頼できるタイムスタンプが必要な場合は、インターネット上の信頼できる場所から取得する必要があります。ユーザーが台無しにできないもの。

ネットワーク タイム サービスから時刻を取得するか、www.time.gov にアクセスして返された html から時刻を取得できます。 http://www.time.gov/about.html

または、時計を進めようとする少数のユーザーと一緒に暮らすこともできます。

于 2010-02-27T22:45:53.457 に答える
1

絶対タイム スタンプを取得するには、(無料の) NIST タイム サーバーの 1 つに NTP リクエストを送信してみてください

于 2010-02-27T22:49:19.533 に答える