¿por qué curl y wget resultarían en un 403 prohibido?

57

Intento descargar un archivo con wgety curlse rechaza con un error 403 (prohibido).

Puedo ver el archivo usando el navegador web en la misma máquina.

Intento nuevamente con el agente de usuario de mi navegador, obtenido por http://www.whatsmyuseragent.com . Hago esto:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

y

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

Pero todavía está prohibido. ¿Qué otras razones podría haber para el 403, y de qué maneras puedo alterar los comandos wgety curlpara superarlos?

(no se trata de poder obtener el archivo; sé que puedo guardarlo desde mi navegador; se trata de entender por qué las herramientas de línea de comandos funcionan de manera diferente)

actualizar

Gracias a todas las excelentes respuestas dadas a esta pregunta. El problema específico que encontré fue que el servidor estaba verificando el referente. Al agregar esto a la línea de comandos, podría obtener el archivo usando curly wget.

El servidor que verificó el referidor rebotó a través de un 302 a otra ubicación que no realizó ninguna verificación, por lo que uno curlo wgetde ese sitio funcionó limpiamente.

Si alguien está interesado, esto ocurrió porque estaba leyendo esta página para aprender sobre CSS incrustado y estaba tratando de mirar el CSS del sitio para ver un ejemplo. La URL real con la que estaba teniendo problemas era esta y curlterminé con es

curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

y el wget es

 wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

Muy interesante.

starfry
fuente
77
Las páginas que revisan el árbitro son realmente molestas. Se supone que el encabezado es opcional y se utiliza para recopilar estadísticas.
zaadeh
Lo más fácil que he encontrado es convertirlo a un archivo zip y usarlo de esa manera.
piniyini

Respuestas:

40

Una solicitud HTTP puede contener más encabezados que no están establecidos por curl o wget. Por ejemplo:

  • Cookie: esta es la razón más probable por la que se rechazaría una solicitud, he visto que esto sucede en los sitios de descarga. Dada una cookie key=val, puede configurarla con la opción -b key=val(o --cookie key=val) para curl.
  • Referer (sic): al hacer clic en un enlace en una página web, la mayoría de los navegadores tienden a enviar la página actual como referencia. No se debe confiar en él, pero incluso eBay no pudo restablecer una contraseña cuando este encabezado estaba ausente. Entonces sí, puede suceder. La curlopción para esto es -e URLy --referer URL.
  • Autorización: esto se está volviendo menos popular ahora debido a la IU incontrolable del diálogo de nombre de usuario / contraseña, pero aún es posible. Se puede configurar curlcon la opción -u user:password(o --user user:password).
  • User-Agent: algunas solicitudes generarán diferentes respuestas según el User Agent. Esto se puede usar de una buena manera (proporcionando la descarga real en lugar de una lista de espejos) o de una manera incorrecta (rechazar agentes de usuario que no comienzan con Mozilla, o contienen Wgeto curl).

Normalmente puede usar las herramientas de desarrollador de su navegador (Firefox y Chrome lo admiten) para leer los encabezados enviados por su navegador. Si la conexión no está encriptada (es decir, sin usar HTTPS), también puede usar un sniffer de paquetes como Wireshark para este propósito.

Además de estos encabezados, los sitios web también pueden desencadenar algunas acciones detrás de escena que cambian de estado. Por ejemplo, al abrir una página, es posible que se realice una solicitud en segundo plano para preparar el enlace de descarga. O ocurre una redirección en la página. Estas acciones suelen hacer uso de Javascript, pero también puede haber un marco oculto para facilitar estas acciones.

Si usted está buscando un método para captar fácilmente archivos desde un sitio de descarga, echar un vistazo a plowdown, incluido con reja de arado .

Lekensteyn
fuente
Otra posibilidad realmente perversa sería que el servidor, por alguna razón, estuviera configurado para devolver 403 en lugar de 200 en caso de éxito.
kasperd
1
Esto me dio la pista que necesitaba. Después de probar las cookies, descubrí que el referente era el problema (¡ahora, si solo eso se deletreara correctamente!)
starfry
2
Si se sigue fallando en el wgetintento de añadir --auth-no-challenge. Funciona como magia.
Jonathan
13

Solo quiero agregar a las respuestas anteriores que podría usar la función "Copiar como cURL" presente en las herramientas de desarrollador de Chrome (desde la v26.0) y Firebug (desde la v1.12 ). Puede acceder a esta función haciendo clic derecho en la fila de solicitud en la pestaña Red.

solde9
fuente
Esto ayudó inmensamente, especialmente las herramientas en Chrome. Cuando lo intenté en Firefox, el encabezado de la solicitud después del 302 fue todo lo que pude ver. En Chromium pude ver ambos y esto me dio la información para resolver el problema.
Starfry
1
@starfry Debe marcar Enable persistent logsla pestaña de configuración de las herramientas de desarrollo de Firefox para evitar que borre los registros de red en una redirección. Chrome tiene una opción similar. Por cierto, "Copiar como cURL" ha estado en Firefox Nightly / Aurora / Beta desde hace un tiempo, y se espera su próximo lanzamiento principal (31.0).
Bob
9

Intenté todo lo anterior sin embargo, no hubo suerte; utilicé la herramienta de navegador dev para obtener la cadena de agente de usuario, una vez que agregué lo siguiente, éxito:

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
usuario3707737
fuente
5

Dependiendo de lo que esté pidiendo, podría ser una cookie. Con Firefox, puede hacer clic con el botón derecho cuando se encuentra en la página en cuestión, "Ver información de la página". Elija el icono "Seguridad" y luego haga clic en el botón "Ver cookies".

Para descifrar las cookies, el complemento Firefox "Live HTTP Headers" es esencial. Puede ver qué cookies se configuran y qué cookies se envían de vuelta al servidor web.

wgetpuede funcionar con cookies, pero es totalmente irritante, ya que no da una pista de que no envió cookies. Su mejor opción es eliminar todas las cookies relacionadas de su navegador y pasar por el inicio de sesión inicial o la secuencia de visualización de la página. Mire en "Encabezados HTTP en vivo" las cookies y cualquier parámetro POST o GET. Realice el primer paso de inicio de sesión con las wgetopciones "--keep-session-cookies" y "--save-cookies". Eso le dará un archivo de cookies que puede ver con un editor de texto. Úselo wget --load-cookiescon el archivo de cookies para los próximos pasos.

Bruce Ediger
fuente
1
Probé sin cookies en Firefox abriendo una ventana de navegación privada y, como esperaba, obtuve el error 403. Es interesante que no obtenga el error en una nueva pestaña. En Chromium, una nueva pestaña devuelve el 403.
starfry
1
Por cierto, puede usar la pestaña de red de las herramientas de desarrollo de Firefox para inspeccionar las cookies enviadas y recibidas sin ningún complemento. Lo mismo para Chrome / Chromium.
Bob
@bob: sí, lo encontré. Me tomó unos minutos ya que no era algo. Firebug tiene Copiar como CURL ahora, pero sería bueno verlo también como herramientas nativas.
Starfry
1

Otra razón por la que esto puede suceder es si el sitio requiere SSL. Su navegador reenviará automáticamente de HTTP a HTTPS pero curl y wget no lo harán. Por lo tanto, intente la solicitud con HTTPS en lugar de HTTP.

Ricardo
fuente
3
Esto terminaría en el error 301 o 302, Redirigir, si tengo razón.
Jakuje