¿Cómo denegar el acceso a los puntos finales de mi servidor? (PHP)

3

He desarrollado algún software instalado, por ejemplo. en www.example.com . Se accede a través de una página web HTML. Algunos botones HTML pueden llamar a puntos finales de PHP que también están en ese dominio. Uso JWT para asegurar el inicio de sesión.

Pero lo que también quiero hacer es permitir el acceso a los puntos finales desde la oficina, por lo que estoy intentando que el PHP bloquee el acceso desde otros dominios. Pero, por supuesto, dado que el software está alojado desde el dominio www.example.com , envía solicitudes de punto final desde ese dominio, que es lo que creo que hasta ahora ha frustrado mis intentos actuales.

Lo intenté

header('Access-Control-Allow-Origin: https://www.example.com');

pero no creas que funcionará por la razón anterior. Ciertamente, no bloquea el punto final cuando trato de acceder a él a través de la interfaz web de dominio www.example.com , a pesar de la red de computadoras que uso.

Tal vez, en cambio, tengo que verificar la IP del cliente dentro del PHP y denegar el acceso si no coincide. Pero qué pasa si hay IP dinámicas y las IP podrían cambiar si se les da suficiente tiempo. ¿Hay alguna manera de evitar eso?

Cualquier ayuda apreciada.

    
pregunta Antinous 03.09.2018 - 14:15
fuente

3 respuestas

6

Primero, con respecto a lo que ya has probado:

header('Access-Control-Allow-Origin: https://www.example.com');

Esto fallará por varias razones:

  1. Este es un control de nivel de cliente que no impide que nadie realice solicitudes a su punto final de todos modos. Esto es, de hecho, una bandera para CORS en un navegador, y no es realmente relevante para su caso de uso. No tendría ningún impacto en absoluto con su configuración actual, ni tampoco necesariamente impediría que las personas accedan a los puntos finales de su API incluso si estuvieran en otro dominio ( CORS es una restricción de lectura, no una restricción de escritura).
  2. Como alude a, incluso si esto funcionara como estaba previsto, en realidad no haría lo que quiere, ya que evitaría que las personas usen su punto final desde un navegador en un dominio diferente, pero eso no lo bloquearía. a su oficina en absoluto
  3. De todos modos, tampoco funcionaría porque, independientemente de los encabezados que devuelva, cualquier cliente que no sea navegador puede ignorar sus encabezados y hacer lo que quiera. Es decir. un navegador escuchará las restricciones de CORS (porque así es como funcionan los navegadores) pero puedo encontrar cualquier punto final que desee con curl , postman , o cualquier otro cliente http y hacer lo que quiera. No solo los navegadores utilizan Internet, por lo que no puede hacer ninguna suposición sobre quién está navegando en su sitio.

Filtrado de IP

En un caso como este, la mejor opción es simplemente filtrar por la dirección IP que mencionó. En general, las oficinas tienen direcciones IP estáticas o cambian rara vez, por lo que es bastante factible hacerlo. Suponiendo que toda la oficina tiene NAT detrás de un enrutador / dirección IP, entonces es bastante simple porque solo necesita una regla: volcar todo el tráfico, excepto el puerto 80 (443?) Que viene de la IP de la oficina. Sin embargo, es probable que no deba molestarse en hacer esto con PHP, ya que para que PHP rechace la solicitud basándose en la dirección IP, primero se requiere que su servidor procese la solicitud, inicie PHP y la transmita. Una simple regla de firewall es mucho más fácil en los recursos del servidor. Las direcciones IP dinámicas de la oficina son casi desconocidas, por lo que, a menos que sepa que esa es la situación para usted, no me preocuparía.

    
respondido por el Conor Mancone 03.09.2018 - 14:51
fuente
3

Tu idea sobre los dominios está bastante mal. Es necesario comprender una cosa esencial acerca de un servidor web.

No existe tal cosa como "un acceso desde un dominio". No se trata de un "software" que envía solicitudes a puntos finales, sino de un cliente (que generalmente es un navegador). Un cliente puede leer primero cierta información de su servidor, pero no es necesario.

En pocas palabras, no puede limitar el acceso a sus puntos finales "desde un dominio".

La idea de la dirección IP es más fructífera y más plausible de lo que piensas. Las oficinas rara vez cambian su IP, al menos usan una dinámica. Por lo tanto, puede limitar el acceso a todo el servidor www.example.com (no solo a los puntos finales) según la dirección IP de su oficina.

Aunque hay otro culpable, ya que la dirección IP se puede falsificar y, por lo tanto, es posible crear una solicitud que se le permita enviar algo a su punto final (sin embargo, sin la capacidad de obtener el respuesta).

Pero consideraría que tal protección es innecesaria dado que está utilizando JWT para la autenticación (y, supongo, HTTPS para la conexión segura).

    
respondido por el Your Common Sense 03.09.2018 - 14:35
fuente
1

Ok, así es como resolví el problema:

En el Administrador de archivos de su servidor, en la carpeta a la que desea restringir el acceso, cree un nuevo archivo .htaccess y agregue las siguientes líneas:

Order Deny, Allow
Deny from all
Allow from 1.2.3.4

donde 1.2.3.4 es la dirección IP que deseas permitir.

Puede otorgar acceso adicional mediante comas que separan las direcciones IP o, si eso no funciona, simplemente use Allow from líneas adicionales.

Creo que también puedes agregar direcciones IP comodín.

    
respondido por el Antinous 03.09.2018 - 17:02
fuente

Lea otras preguntas en las etiquetas