Pergunta

Estou trabalhando com um aplicativo WPF/C#, onde preciso bloquear os usuários de acessar um recurso específico por algum tempo. Basicamente, a partir do momento em que um certo evento acontece, quero evitar um certo acesso pelas próximas 24 horas.

O caso simples:

  • Evento acontece, salve timestamp (usando DateTime ou similar)
  • Usuário tenta acessar a área 15 horas depois, compare agora com o timestamp ... Block
  • O usuário tenta acessar a área 25 horas depois, compare agora com o registro de data e hora ... permita

Tudo certo. No entanto, o usuário tem a capacidade de alterar o tempo do sistema, o que me ferra. Eles podem simplesmente definir o tempo do sistema 24 horas à frente e meu aplicativo não será o mais sábio.

Suponho que alterar o tempo no Windows chegue ao relógio em tempo real do sistema ... então existe algum cronômetro de corrida gratuito independente do relógio do sistema? Um com o qual o usuário não pode mexer?

Qualquer insight é apreciado.

Foi útil?

Solução

O Ambient.TickCount não muda com as alterações do tempo do sistema, mas redefine as reinicializações. Uma opção é um serviço da Web garantido HTTPS e uma política de certificado que não permite falhas de validação de certificado. Caso contrário, seria bastante trivial falsificar a resposta do serviço.

Quando comecei a vender software, fiquei muito paranóico quanto à pirataria e tal. Não que eu esteja sugerindo que seus propósitos sejam os mesmos. Mas cheguei à conclusão de que as pessoas geralmente não vão mexer com o tempo do sistema, porque isso estraga tantas outras coisas no computador que não vale a pena. Naturalmente, aplicativos diferentes terão requisitos de integridade diferentes, mas pensei em adicionar esse bit.

Outras dicas

Para obter um carimbo de hora absoluta, tente uma solicitação NTP para um dos (gratuitos) NIST Time Servers

Na verdade, não. O único cronômetro absoluto confiável é externo, sob seu controle ou o controle de alguém em quem você confia, como um dos servidores do tempo na Internet (por exemplo, tempo.windows.com). Você pode acessar isso usando uma biblioteca NTP ou STP, como a postada em http://www.codeproject.com/kb/ip/ntpclient.aspx. Obviamente, neste caso (conforme um comentário para a resposta de Josh), você precisa considerar o que fazer se não conseguir atingir o servidor de tempo, por exemplo, o usuário desconecta a máquina da rede.

Você pode usar o ambiente.TickCount para obter tempo desde o início do sistema, com o qual o usuário não pode mexer - mas se o usuário ou outra pessoa reinicia o sistema, isso será reiniciado, para que não seja confiável para o propósito que você precisa .

Não, não há conhecimento absoluto de que horas são no Windows, como poderia haver? Se você precisar de um registro de data e hora confiável, precisará obter um de um local confiável na Internet. Um com o qual o usuário não pode mexer.

Você pode obter tempo de um serviço de tempo de rede ou ir para www.time.gov e raspar o tempo fora do HTML que você recebe de volta. http://www.time.gov/about.html

Ou apenas viva com os poucos usuários dispostos a avançar o relógio.

Usando um serviço do Windows, você pode fingir um tempo decorrido absoluto, registrando quando o tempo do sistema for atualizado.

Isso exigiria que você pudesse instalar um serviço na máquina, é claro, e que seus usuários não sejam inteligentes o suficiente para errá -lo.

Aqui estão algumas informações sobre como prender a mensagem WM_TIMECHANGE em um serviço .NET: Detectando um evento WM_TIMECHANGE em um serviço .NET Windows

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top