왜 말려서 403 결과가 금지됩니까?


57

내가 가진 파일을 다운로드하려고 wget하고 curl그것은 (금지) 403 오류로 거부됩니다.

같은 컴퓨터에서 웹 브라우저를 사용하여 파일을 볼 수 있습니다.

http://www.whatsmyuseragent.com 에서 얻은 브라우저의 사용자 에이전트로 다시 시도 하십시오 . 나는 이것을한다:

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

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

그러나 여전히 금지되어 있습니다. 403에 대한 다른 이유가있을 수 있으며 이를 극복하기 위해 wgetcurl명령을 어떻게 변경할 수 있습니까?

(이것은 파일을 가져올 수 없다는 것이 아닙니다. 브라우저에서 파일을 저장할 수 있다는 것을 알고 있습니다. 명령 줄 도구가 다르게 작동하는 이유를 이해하는 것입니다)

최신 정보

이 질문에 대한 모든 훌륭한 답변에 감사드립니다. 내가 겪은 특정 문제는 서버가 리퍼러를 확인하고 있다는 것입니다. 이것을 명령 줄에 추가하면 curland를 사용하여 파일을 얻을 수 wget있습니다.

리퍼러를 확인한 서버는 302를 통해 전혀 확인하지 않은 다른 위치로 바운스되었으므로 해당 사이트 중 하나 curl또는 전부가 wget제대로 작동했습니다.

관심있는 사람이라면 내장 CSS에 대해 배우기 위해이 페이지를 읽고 사이트의 CSS를 보려고 했기 때문에이 문제가 발생했습니다 . 내가 문제를 겪고있는 실제 URL은 이것 이며 curl결국은

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

그리고 wget은

 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

매우 흥미로운.


7
참조자를 확인하는 페이지는 실제로 성가신 일입니다. 헤더는 선택 사항이며 통계 수집에 사용됩니다.
zaadeh 2016 년

내가 찾은 가장 쉬운 것은 파일을 zip 파일로 변환하여 사용하는 것입니다.
piniyini

답변:


40

HTTP 요청에는 curl 또는 wget으로 설정되지 않은 추가 헤더가 포함될 수 있습니다. 예를 들면 다음과 같습니다.

  • 쿠키 : 요청이 거부 될 가능성이 가장 큰 이유는 다운로드 사이트에서 발생하는 것입니다. 쿠키가 주어지면 (또는 ) 옵션 으로 쿠키 key=val를 설정할 수 있습니다 .-b key=val--cookie key=valcurl
  • 리퍼러 (sic) : 웹 페이지에서 링크를 클릭하면 대부분의 브라우저가 현재 페이지를 리퍼러로 보내는 경향이 있습니다. 의존해서는 안되지만이 헤더가 없으면 eBay조차도 암호를 재설정하지 못했습니다. 네, 일어날 수 있습니다. 이에 대한 curl옵션은 -e URL--referer URL입니다.
  • 권한 부여 : 사용자 이름 / 암호 대화 상자의 제어 할 수없는 UI로 인해 현재 인기가 떨어지고 있지만 여전히 가능합니다. 그것은에서 설정할 수 있습니다 curl-u user:password(또는 --user user:password) 옵션을 선택합니다.
  • User-Agent : 일부 요청은 사용자 에이전트에 따라 다른 응답을 생성합니다. 이것은 좋은 방법 또는 나쁜 방법 (로 시작하지 않는 사용자 에이전트 거부에 (오히려 거울의 목록이 아니라 실제 다운로드를 제공하는)에서 사용할 수 있습니다 Mozilla, 또는 포함 Wget또는 curl).

일반적으로 브라우저의 개발자 도구 (Firefox 및 Chrome에서 지원)를 사용하여 브라우저에서 보낸 헤더를 읽을 수 있습니다. 연결이 암호화되지 않은 경우 (즉, HTTPS를 사용하지 않는 경우)이를 위해 Wireshark와 같은 패킷 스니퍼를 사용할 수도 있습니다.

이러한 헤더 외에도 웹 사이트는 상태를 변경하는 장면 뒤에서 일부 작업을 트리거 할 수 있습니다. 예를 들어, 페이지를 열 때 다운로드 링크를 준비하기 위해 백그라운드에서 요청이 수행 될 수 있습니다. 또는 페이지에서 리디렉션이 발생합니다. 이러한 조치는 일반적으로 Javascript를 사용하지만 이러한 조치를 용이하게하기 위해 숨겨진 프레임이있을 수도 있습니다.

다운로드 사이트에서 파일을 쉽게 가져올 수있는 방법을 찾고 있다면 plowshare에 포함 된 plowdown을 살펴보십시오 .


또 다른 잘못된 가능성은 어떤 이유로 서버가 성공하면 200 대신 403을 반환하도록 구성되었을 수 있습니다.
kasperd

1
이것은 내가 필요한 단서를 주었다. 쿠키를 시도 후, 나는이 문제 레퍼러를 발견 (해당 제대로 철자 할 수 있다면, 지금!)
starfry

2
이 경우 여전히 실패wget시도 추가 --auth-no-challenge. 마술처럼 작동합니다.
Jonathan

13

Chrome 개발자 도구 (v26.0부터) 및 Firebug ( v1.12 부터)에있는 "URL로 복사"기능을 사용할 수 있다는 위의 답변에 추가하고 싶습니다 . 네트워크 탭에서 요청 행을 마우스 오른쪽 단추로 클릭하여이 기능에 액세스 할 수 있습니다.


이는 특히 Chrome의 도구에 큰 도움이되었습니다. 파이어 폭스에서 시도했을 때 302 이후의 요청 헤더 만 볼 수있었습니다. Chromium에서 두 가지를 모두 볼 수 있었고 문제를 해결할 수있는 정보를 얻었습니다.
starfry

1
@starfry Enable persistent logs리디렉션에서 네트워크 로그를 지우지 않도록 Firefox 개발 도구의 설정 탭을 선택 해야합니다 . 크롬도 비슷한 옵션이 있습니다. 덧붙여서 "Copy as cURL"은 Firefox Nightly / Aurora / Beta에서 잠시 동안 사용되었으며 다음 주요 릴리스 (31.0)로 예정되어 있습니다.
Bob

9

위의 모든 것을 시도했지만 운이 없다. 개발자 브라우저 도구를 사용하여 사용자 에이전트 문자열을 가져 왔습니다. 다음을 추가하면 성공합니다.

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

5

당신이 요구하는 것에 따라 쿠키 일 수 있습니다. Firefox를 사용하면 문제의 페이지 인 경우 "페이지 정보보기"에서 마우스 오른쪽 단추를 클릭 할 수 있습니다. "보안"아이콘을 선택한 다음 "쿠키보기"버튼을 클릭하십시오.

쿠키를 수수께끼로 만들려면 Firefox "Live HTTP Headers"플러그인이 필수적입니다. 어떤 쿠키가 설정되고 어떤 쿠키가 웹 서버로 다시 전송되는지 확인할 수 있습니다.

wget쿠키로 작업 할 수는 있지만 쿠키를 보내지 않았다는 힌트를주지 않기 때문에 완전히 분노합니다. 가장 좋은 방법은 브라우저에서 모든 관련 쿠키를 제거하고 초기 로그인 또는 페이지보기 순서를 수행하는 것입니다. 쿠키 및 POST 또는 GET 매개 변수는 "라이브 HTTP 헤더"를 참조하십시오. wget"--keep-session-cookies"및 "--save-cookies"옵션 을 사용하여 첫 번째 로그인 단계를 수행하십시오. 그러면 텍스트 편집기로 볼 수있는 쿠키 파일이 제공됩니다. wget --load-cookies다음 단계를 위해 쿠키 파일과 함께 사용 하십시오.


1
개인 브라우저 창 을 열어 Firefox에서 쿠키없이 테스트 했으며 예상대로 403 오류가 발생했습니다. 새 탭에서 오류가 발생하지 않습니다. Chromium에서 새 탭이 403을 반환합니다.
starfry

1
또한 Firefox 개발자 도구의 네트워크 탭을 사용하여 애드온없이 보내고받은 쿠키를 검사 할 수 있습니다. Chrome / Chromium 용 Ditto

@bob-네, 찾았습니다. 그것이 아니기 때문에 몇 분이 걸렸습니다. Firebug는 이제 CURL로 복사 기능을 제공하지만 기본 도구로도 볼 수 있습니다.
starfry

1

이 문제가 발생할 수있는 또 다른 이유는 사이트에 SSL이 필요한 경우입니다. 브라우저는 HTTP에서 HTTPS로 자동 전달하지만 컬 및 wget은 그렇지 않습니다. 따라서 HTTP 대신 HTTPS로 요청을 시도하십시오.


3
내가 옳다면 오류 301 또는 302, 리디렉션으로 끝날 것입니다.
Jakuje
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.