elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  Error del reloj
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error del reloj  (Leído 3,063 veces)
Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Error del reloj
« en: 10 Junio 2022, 17:04 pm »

Hola, estaba viendo que si uno tiene en la computadora una fecha incorrecta a la actual todos los time() que son ejecutados en PHP me va a devolver la fecha de mi computadora y no la que realmente es. Lo que no sabía.

Esto me traería algunos problemas pero también veo que los navegadores muestran una alerta al usuario donde se le dice que no puede acceder porque la fecha de su equipo es incorrecta (NET::ERR_CERT_DATE_INVALID).

La pregunta es: ¿No hay alguna solución en la que yo como programador pueda validar si esa fecha es la correcta o no? ¿Es seguro confiar en sólo en esa alerta de los navegadores?

EDIT: Es raro porque entonces
Código
  1. date_default_timezone_set('America/Argentina/Buenos_Aires'); // server time
  2.  

Esta declaración es la más inútil que hay entonces...


« Última modificación: 10 Junio 2022, 17:14 pm por Leguim » En línea

Danielㅤ


Conectado Conectado

Mensajes: 1.676


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Error del reloj
« Respuesta #1 en: 10 Junio 2022, 17:31 pm »

Hola, tal como comentas PHP va a tomar y devolver la fecha y hora de tu PC aunque esta sea incorrecta.
Los navegadores te dan ese aviso de error de certificado porque no coincide la fecha del certificado con la de tú PC.

La mejor forma de lograr lo que deseas, es decir que PHP te devuelva la fecha y hora actual/correcta, es que utilices alguna página web en la que haciendo una petición GET te devuelva por ejemplo la fecha y hora en formato json, por supuesto que el sitio web te va a devolver posiblemente un horario distinto al tuyo debido a las distintas horas de los países y el sitio web toma la zona horaria del servidor en donde está alojado, y en ese caso, tendrías que ajustar la hora a la correcta de tu país.


Saludos


En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: Error del reloj
« Respuesta #2 en: 10 Junio 2022, 18:25 pm »

Hola, tal como comentas PHP va a tomar y devolver la fecha y hora de tu PC aunque esta sea incorrecta.
Los navegadores te dan ese aviso de error de certificado porque no coincide la fecha del certificado con la de tú PC.

La mejor forma de lograr lo que deseas, es decir que PHP te devuelva la fecha y hora actual/correcta, es que utilices alguna página web en la que haciendo una petición GET te devuelva por ejemplo la fecha y hora en formato json, por supuesto que el sitio web te va a devolver posiblemente un horario distinto al tuyo debido a las distintas horas de los países y el sitio web toma la zona horaria del servidor en donde está alojado, y en ese caso, tendrías que ajustar la hora a la correcta de tu país.


Saludos

Me recomendarían alguna API o algo, estoy perdido...
En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Error del reloj
« Respuesta #3 en: 10 Junio 2022, 19:55 pm »

Hola!

Revisa éste código: https://stackoverflow.com/questions/16592142/retrieve-time-from-ntp-server-via-php

Saludos!
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: Error del reloj
« Respuesta #4 en: 11 Junio 2022, 19:19 pm »

Citar
Hola, estaba viendo que si uno tiene en la computadora una fecha incorrecta a la actual todos los time() que son ejecutados en PHP me va a devolver la fecha de mi computadora y no la que realmente es. Lo que no sabía.

La fecha que devuelven las funciones de PHP no es la de la fecha de tu PC. Es la fecha del servidor que ejecuta PHP (que puede o no ser tu PC). Si lo alojas en un servidor en Taiwan que tenga configurado el timezone de Taiwan, mostrara fecha de Taiwan.

El timezone en las funciones date no es inútil. De hecho, es muy útil porque puede trabajar con diferentes zonas en software que requiera de ello. Lo que tendría menos sentido es que coja la fecha del usuario/navegador, que puede decir cualquier cosa y toca creerlo.

Lo recomendable siempre es que el servidor maneje fechas en UTC o  GMT +0 y luego esas fechas se presenten al cliente adaptado a su zona horaria.


Lo ideal es no fiarse de la hora/fecha del usuario. A no ser que tengas una necesidad muy específica, lo suyo es no fiarse ni recoger el dato siquiera. Si aun así necesitas hacer una verificación (y confias en lo que el usuario te diga), puedes recoger la fecha/hora UTC del usuario con javascript y luego comparar la UTC que tenga tu servidor:


fecha.php
Código
  1. <?php
  2. function validateDate(int $dateUser): bool
  3. {
  4.    // Margen de error en segundos.
  5.    // La consulta ajax puede tardar varios segundos en ejecutarse. Asegurate de tener un margen.
  6.    $dateMargin = 120;
  7.  
  8.    // Si el valor absoluto de la diferencia entre Timestamp de usuario y servidor
  9.    // es superior al margen, no es una fecha valida y devolvemos false.
  10.    return (abs(time() - $dateUser) <= $dateMargin);
  11. }
  12.  
  13. if (!empty($_POST['localTime'])) {
  14.    // recogemos localTime y lo comparamos con respuesta en formato JSON
  15.    $status = validateDate((int) $_POST['localTime']);
  16.    echo json_encode(array('status' => $status));
  17.    exit;
  18. }


fecha.js
Código
  1. async function testDate() {
  2.    try {
  3.        // Creamos un formData para pasarselo a PHP
  4.        // Con parametro localTime que es = la fecha UTC acutal en Unix Timestamp.
  5.        const formData = new FormData();
  6.        formData.append('localTime', Math.floor(Date.now() / 1000));
  7.  
  8.        const request   = await fetch('fecha.php', {
  9.            method: 'POST',
  10.            body: formData
  11.        });
  12.        response = await request.json();
  13.  
  14.        // Si el status es falso, la fecha no es valida.
  15.        if (!response.status) {
  16.            alert('Fecha local no valida');
  17.            return false;
  18.        }
  19.  
  20.        alert('Fecha local valida');
  21.        return true;
  22.    } catch(err) {
  23.        // Si occure algun durante el proceso...
  24.        alert('No se ha podido sincronizar la fecha');
  25.        console.log(err);
  26.    }
  27. }
  28.  
  29. testDate();


PD: Aquí asumimos que la fecha del servidor esta bien y esta sincronizada. Lo cual no tiene porque ser siempre la verdad. En tal caso, en vez de recoger la fecha del servidor, puedes recoge la de otro servidor NTP del que te fíes tal y como te ha mostrado el compañero @MCKsys Argentina.


Saludos
« Última modificación: 11 Junio 2022, 19:42 pm por #!drvy » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Error del reloj
« Respuesta #5 en: 11 Junio 2022, 21:24 pm »

Yo creo que todavía no aprendes a distinguir una fecha de un timestamp... time() no regresa una fecha, regresa un timestamp.

Un timestamp señala un momento único. Si dos personas que se encuentran del otro lado del planeta obtienen un timestamp al mismo tiempo, los dos obtendrán el mismo timestamp (asumiendo que los relojes estén sincronizados correctamente). Sin embargo, a la hora de convertir ese timestamp a una fecha local, ambos van a ver resultados diferentes.

Entonces... no tienes un problema con time... lo tienes con tus funciones de fechas. No intentes cambiar la hora de tu servidor para acomodarte a la zona horaria de tus usuarios...
En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: Error del reloj
« Respuesta #6 en: 11 Junio 2022, 22:56 pm »

La fecha que devuelven las funciones de PHP no es la de la fecha de tu PC. Es la fecha del servidor que ejecuta PHP (que puede o no ser tu PC). Si lo alojas en un servidor en Taiwan que tenga configurado el timezone de Taiwan, mostrara fecha de Taiwan.

El timezone en las funciones date no es inútil. De hecho, es muy útil porque puede trabajar con diferentes zonas en software que requiera de ello. Lo que tendría menos sentido es que coja la fecha del usuario/navegador, que puede decir cualquier cosa y toca creerlo.

Lo recomendable siempre es que el servidor maneje fechas en UTC o  GMT +0 y luego esas fechas se presenten al cliente adaptado a su zona horaria.


Lo ideal es no fiarse de la hora/fecha del usuario. A no ser que tengas una necesidad muy específica, lo suyo es no fiarse ni recoger el dato siquiera. Si aun así necesitas hacer una verificación (y confias en lo que el usuario te diga), puedes recoger la fecha/hora UTC del usuario con javascript y luego comparar la UTC que tenga tu servidor:


fecha.php
Código
  1. <?php
  2. function validateDate(int $dateUser): bool
  3. {
  4.    // Margen de error en segundos.
  5.    // La consulta ajax puede tardar varios segundos en ejecutarse. Asegurate de tener un margen.
  6.    $dateMargin = 120;
  7.  
  8.    // Si el valor absoluto de la diferencia entre Timestamp de usuario y servidor
  9.    // es superior al margen, no es una fecha valida y devolvemos false.
  10.    return (abs(time() - $dateUser) <= $dateMargin);
  11. }
  12.  
  13. if (!empty($_POST['localTime'])) {
  14.    // recogemos localTime y lo comparamos con respuesta en formato JSON
  15.    $status = validateDate((int) $_POST['localTime']);
  16.    echo json_encode(array('status' => $status));
  17.    exit;
  18. }


fecha.js
Código
  1. async function testDate() {
  2.    try {
  3.        // Creamos un formData para pasarselo a PHP
  4.        // Con parametro localTime que es = la fecha UTC acutal en Unix Timestamp.
  5.        const formData = new FormData();
  6.        formData.append('localTime', Math.floor(Date.now() / 1000));
  7.  
  8.        const request   = await fetch('fecha.php', {
  9.            method: 'POST',
  10.            body: formData
  11.        });
  12.        response = await request.json();
  13.  
  14.        // Si el status es falso, la fecha no es valida.
  15.        if (!response.status) {
  16.            alert('Fecha local no valida');
  17.            return false;
  18.        }
  19.  
  20.        alert('Fecha local valida');
  21.        return true;
  22.    } catch(err) {
  23.        // Si occure algun durante el proceso...
  24.        alert('No se ha podido sincronizar la fecha');
  25.        console.log(err);
  26.    }
  27. }
  28.  
  29. testDate();


PD: Aquí asumimos que la fecha del servidor esta bien y esta sincronizada. Lo cual no tiene porque ser siempre la verdad. En tal caso, en vez de recoger la fecha del servidor, puedes recoge la de otro servidor NTP del que te fíes tal y como te ha mostrado el compañero @MCKsys Argentina.


Saludos

La fecha que devuelven las funciones de PHP no es la de la fecha de tu PC. Es la fecha del servidor que ejecuta PHP

Era eso, estaba en local  :silbar:
Gracias!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
al reloj
Programación Visual Basic
bautistasbr 1 1,775 Último mensaje 23 Octubre 2005, 09:06 am
por NYlOn
Reloj en C « 1 2 »
Programación C/C++
sinsombra_666 14 26,759 Último mensaje 26 Septiembre 2010, 19:25 pm
por ace332
El reloj sólo va de las 13:30 a las 14:30
Dudas Generales
Azhag_el_Carnicero 3 3,690 Último mensaje 28 Diciembre 2011, 19:23 pm
por Azhag_el_Carnicero
Reloj c++
Programación C/C++
ianmorar03 7 5,070 Último mensaje 17 Abril 2016, 16:03 pm
por MAFUS
Convierten el clásico reloj Casio F-91W de los 80 en un reloj inteligente
Foro Libre
Machacador 1 3,221 Último mensaje 25 Octubre 2021, 18:01 pm
por el-brujo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines