Как проверить правильность системной даты?(для предотвращения злоупотреблений) vb .NET - PullRequest
1 голос
/ 24 марта 2011

Я работаю над программой, связанной с бизнесом, поэтому мне нужно знать, правильна ли системная дата - синхронизирована с удаленным сервером.Как вы это делаете в vb .NET winforms?

PS: Кроме того, есть ли способ вызвать событие, когда системные часы изменились, чтобы предотвратить взломы?Я не хочу, чтобы пользователи меняли локальную дату после входа в свою учетную запись.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 27 марта 2011

Вам нужно будет проверить часы с помощью внешнего сервера и принять их, если они находятся в пределах определенного допуска.Все часы ошибочны в некоторой степени.Обычно веб-службы на сервере где-то достаточно, но есть много бесплатных NTP-служб .Однако обратите внимание, что мне потребуется 5 минут, чтобы обойти это, поэтому для большей безопасности вам нужно использовать SSL (HTTPS) (делает атаки «человек посередине» невозможными).

Примечаниеоднако:

  • Необходимо правильно компенсировать часовые пояса, поскольку сервер и пользователи могут иметь разные часовые пояса.Информация о часовом поясе отправляется в формате DateTime в формате ISO 8601 , что достаточно просто.
  • Что мешает пользователю отключить интернет?Вы действительно хотите требуется доступ в интернет для запуска приложения?Кто-то с ноутбуком быстро обнаружит, что автономный режим заставляет приложение работать.
  • Один из методов, используемых некоторыми, заключается в том, чтобы сказать, что если время в будущем (после истечения срока действия продукта) будет обнаружено приложением, тонужно активировать его.Реактивация требует связи с интернет-сервером, который может проверять лицензию по доверенным часам.

Если вы хотите узнать, когда пользователь меняет часы, просто настройте поток на цикл с 60-секундным потоком.(60000).Затем проверьте текущий DateTime по сравнению с 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 голосов
/ 21 февраля 2019

У меня было приложение, которое работает в локальной сети с компьютером с сервером SQL в той же локальной сети. Приложение не будет работать без подключения к базе данных, поэтому отключение сети в конечном итоге приведет к тому, что приложение не будет использоваться. Сервер был заблокирован физически, поэтому никто не будет включать или выключать сервер, кроме как без разрешения или действительной авторизации (предотвращение изменений BIOS). Если у кого-то есть такой случай, вы можете очень легко запросить базу данных и получить точную дату и время, используя SELECT GETDATE(), и сравнить ее с любой переменной, которую вы хотите.

В моем случае я должен был запретить пользователям вводить в систему данные с устаревшей датой, поэтому при сохранении форм ввода данных я запрашиваю базу данных, чтобы сравнить дату текущего компьютера и дату сервера для правильной записи.

0 голосов
/ 09 июля 2016

В коде .net VB, представленном Теддом Хансеном, убедитесь, что вы изменили первую строку в Private sub form1_load: -

TimeMonitorThread = New Thread(AddressOf TimeMonitorThreadLoop)

(addressof должен быть там, иначе вы получите исключение)

0 голосов
/ 27 марта 2011

Теоретические шаги.

Сначала создайте на удаленном сервере приложение asp .net, которое будет предоставлять текущую дату и время.Для обеспечения дополнительной безопасности зашифруйте текущую дату.

Затем на своем ПК создайте приложение winform, которое может получить доступ к этому удаленному серверу, и получит текущее время по мере необходимости.

Затем в приложении winform, получить текущую дату и время.Затем просто сравните текущее время, указанное на удаленном сервере, и в приложении winform.

Вы можете настроить текущую дату на вашем ПК по мере необходимости, чтобы синхронизировать время с удаленным сервером.В случае бизнес-приложения вы можете уведомить пользователя или отключить функции приложения, пока этот пользователь не сделает что-то, что вы хотели бы от него.Например, позвоните в отдел обслуживания или получите ключ разблокировки и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...