TLDR: No, y si crees que lo necesitas, probablemente estés haciendo algo mal.
Literalmente, no hay forma posible de evitar el acceso sin navegador a cualquier cosa que también esté expuesta a los navegadores. En lo que respecta a un servidor, un navegador web es solo un programa que envía y recibe tráfico HTTP (y protocolos relacionados). Eso es. Puede hacer eso usando curl
, puede hacerlo usando cualquiera de los muchos tipos de objetos WebRequest
disponibles para diferentes marcos de programación, puede hacerlo abriendo un simple socket TCP al servidor y escribiendo manualmente los bytes para enviar (ver el programa nc
/ ncat
/ netcat
). Cualquier otro programa puede falsificar cualquier información que un navegador normalmente proporciona: cookies, encabezado de Usuario-Agente, peculiaridades de URL y HTTPS específicas del navegador, autorización HTTP, certificados de cliente TLS, análisis de JavaScript, etc. Eso incluye absolutamente todos los encabezados y comportamientos de CORS.
Lo que puedes hacer es requerir autenticación. Si el consumidor de su servicio web está autenticado, a quién le importa si está usando un navegador web normal, un lector de pantalla para personas ciegas, una aplicación móvil, un servidor web PHP, un programa telnet
en un Commodore 64, o pulsando el botón bits individualmente muy rápidamente por semáforo?
En teoría, la autenticación de origen cruzado no es tan difícil. Debe enviar el encabezado de respuesta Access-Control-Allow-Credentials: true
CORS (que permite los encabezados y cookies de Autorización HTTP) o el encabezado de respuesta Access-Control-Allow-Headers: <HEADERNAME>
CORS (con un encabezado de autenticación personalizado). En cualquier caso, también debe proporcionar alguna forma para que un cliente obtenga un token de autenticación válido (que podría ser a través de una aplicación web, un servicio web o algún otro medio; incluso podría ser otro servicio web habilitado para CORS) . Por supuesto, de manera similar, no tiene forma de impedir el acceso mediante secuencias de comandos al servicio de autenticación, por lo que cualquier persona / cualquier cosa con credenciales puede obtener un token válido y luego utilizarlo.
¿Cuál es su caso de uso, aquí? ¿Por qué estás tratando de bloquear el acceso mediante scripts? ¿Por qué esperas que esto funcione? Me refiero a que los navegadores web pueden ejecutar secuencias de comandos, por lo que no hay nada que impida que un navegador web cargue una página que contenga JavaScript para acceder a su servicio web, recuperar los resultados y enviarlos a una aplicación de escritorio o servidor.
EDIT:
En última instancia, es una API REST que habilita CORS intrínsecamente inseguro
O no entiendes lo que significa "seguro" o no entiendes lo que hacen los servidores web. Los servidores web analizan las solicitudes HTTP entrantes (HTTP es un protocolo basado en texto típicamente enviado en el puerto TCP 80, o envuelto dentro de un flujo SSL / TLS enviado al puerto TCP 443) y, en función del contenido del Solicitud de HTTP, enviar de vuelta una respuesta HTTP. Los servidores web son "intrínsecamente inseguros" en el sentido de que, si expone información confidencial en uno, cualquier persona que pueda conectarse a ella a través de la red y pueda enviar la cadena correcta de bytes puede recuperar esa información. Por supuesto, así es como funciona aproximadamente cada servidor de red para cada protocolo en el mundo, así que ...
Como nota al margen, esto no es un problema de CORS. Si no permites CORS en absoluto, no hará absolutamente ninguna diferencia en el tipo de "atacante" que estás imaginando. CORS es una forma de abrir un agujero en una parte crítica del modelo de seguridad del navegador (llamada " política del mismo origen "), pero es absolutamente irrelevante para las cosas que no son navegadores.