Ejecutar archivo php externo a nuestro servidor.

Sharktopus

Estoy haciendo una aplicación web para el registro horario de trabajadores del hotel donde trabajo.

Tengo un archivo .html para cargar una tabla de registro de horarios que va haciendo llamadas a varios archivos PHP, uno para mostrar los registros de la base de datos, otro para registrar la entrada, y otro para la salida y computo de horas. Esto va actualizando la página sin refrescarla usando AJAX.

Mi idea es que el archivo .html este solo en el hotel y no este colgado, para que un trabajador no pueda fichar si no esta en el hotel (ya se que pueden copiárselo pero eso de momento no me preocupa), y los archivos php y la base de datos que estén alojados en el servidor. Entonces tengo la duda de si hay alguna forma de que ese archivo .html pueda hacer llamadas a archivos .php que no están en el mismo servidor, he probado poniendo la URL entera en la petición AJAX:

function showRegistro() {
  let xhttp;

  xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
		document.getElementById("txtHint").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "http://www.miNegocio.com/mostrar.php", true);
  xhttp.send();

Pero no funciona, también he probado a poner todos los permisos de lectura, escritura, ejecución y nada... sabéis si se puede hacer?

Cuando tengo todo en un mismo servidor funciona todo bien.

oFF-sIDE

Que me corrijan si me equivoco, pero creo que lo que estás haciendo va a lanzarte un error de cross domain como la copa de un pino. Si ejecutas un php de un servidor externo al navegador no le va a hacer ninguna gracia. Para eso están los servicios REST/SOAP y tal.
Es un tema de tecnología, puro y duro. No es tema de programación. Si no, tu podrías ejecutar contenido de cualquier lado y colarle al usuario cualquier virus.

Para comprobar que está en el mismo lugar podrías hacer que esa web sólo fuera visible si estás dentro del hotel, controlándolo por IP o similar. O simplemente ponlo en un servidor que no sea público y ya está.

radykal

Para poder ayudarte habría que saber cómo sirves esas páginas html y php, es nginx?apache? modulo php? php-fpm?

EnderFX

No entiendo, colega.

Primero, asume siempre que el HTML no es seguro, y mentalmente cíñete al paradigma de que sólo es un medio que le das al cliente para que hable con tu backend sin tener que hacer peticiones HTTP. Punto.

Todo lo que haga ese HTML en el PC de un hotel o donde sea se puede hacer sin el HTML

Luego, parece más bien un fallo de conceptos. ¿Quieres que no se pueda acceder al servidor desde fuera del hotel o que solo acceda una persona específica? Parece un tema de configuración del servidor (apache/nginx/whatever) o de red.

¿Quieres que otra web distinta no pueda hacer llamadas a tu .php? Como te han dicho, desde HTML es posible que "no puedan" porque el navegador lanzará una petición CORS pre-flight contra tu servidor, y tu servidor le dirá que no permite que www.fulanito.com le haga llamadas. Pero volvemos al punto 1: el usuario se copia la petición del inspector del chrome y la tira con un Postman o curl.

Así que insisto, no te acabo de entender. Si quieres llamar a phps que no están en el mismo servidor en el que esté alojado el HTML, mírate el tema de CORS. Desafortunadamente, si tú no puedes modificar la configuración del servidor al que vas a llamar para que te lo permita y mande esas cabeceras HTTP, poco puedes hacer.

1 respuesta
Sharktopus

Sí tengo acceso a la configuracion del servidor, que es APACHE. Si le doy permisos deberia de poder entonces.

Sharktopus

SOLUCIONADO, mirándome lo de CORS he encontrado la solución. Hay que añadir estas cabeceras a todos los archivos PHP:

header("Access-Control-Allow-Origin: * ");
header("Access-Control-Allow-Headers: content-type");
header("Access-Control-Allow-Methods: OPTIONS,GET,PUT,POST,DELETE");

gracias! #4

1 1 respuesta
taltal

#6 Pero estás permitiendo la ejecución de este php desde CUALQUIER URL. Almenos ponle el dominio del que puede provenir la ejecución. Por muy poca cosa que tenga que ejecutar y poco delicado que sea, no te cuesta nada especificar desde donde puede venir y limitarlo.

header("Access-Control-Allow-Origin: https://TU-URL-UNICAMENTE.com");

Usuarios habituales

  • taltal
  • Sharktopus
  • EnderFX
  • radykal
  • oFF-sIDE