[英]URL forbidden 403 when using a tool but fine from browser
我有一些圖像需要執行 HttpRequestMethod.HEAD 以找出圖像的一些細節。
當我在瀏覽器上訪問圖像 url 時,它可以毫無問題地加載。
當我嘗試通過我的代碼或通過在線工具獲取標題信息時失敗
一個示例 URL 是http://www.adorama.com/images/large/CHHB74P.JPG
如前所述,我使用了在線工具Hurl.It來嘗試獲得 Head 請求,但我收到的 403 Forbidden 消息與我在代碼中收到的消息相同。 我嘗試向 Head 請求(用戶代理、接受、接受編碼、接受語言、緩存控制、連接、主機、編譯指示、升級不安全請求)添加許多不同的標頭,但這些似乎都不起作用。
它也無法通過 Hurl.it 執行正常的 GET 請求。 同樣的 403 錯誤。
如果相關,我的代碼是 ac# web service 並且在 AWS 雲上運行(以防萬一 adorama 服務器有一些我不知道的針對 AWS 的東西)。 為了測試這一點,我還啟動了一個 ec2(linux box)並運行 curl,它也返回了 403 錯誤。 在我的個人計算機上本地運行 curl 會返回二進制圖像,這可能只是圖像數據。
並且只是為了消除明顯的想法,我的代碼在許多其他網站上都可以成功運行,這只是一個存在問題的網站
知道我需要什么才能下載圖像標題而不是 403 嗎?
同樣的問題在這里。
在本地它運行順利。 從 AWS 實例執行此操作時,我遇到了同樣的問題。
我認為這是 DNS 解析問題(重定向到故障節點)。 因此,我嘗試指定與我的客戶端解析的 IP 地址相同的 IP 地址,但沒有解決問題。
我的猜測是 Akamai(在這種情況下該服務由 Akamai CDN 提供)正在阻止 AWS。 不知何故可以理解,客戶為CDN按流量付費,通過濫用它,人們可以產生巨額賬單。
正在連接到 www.adorama.com (www.adorama.com)|104.86.164.205|:80... 已連接。
HTTP request sent, awaiting response...
HTTP/1.1 403 Forbidden
Server: **AkamaiGHost**
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 301
Cache-Control: max-age=604800
Date: Wed, 23 Mar 2016 09:34:20 GMT
Connection: close
2016-03-23 09:34:20 ERROR 403: Forbidden.
我嘗試了來自 Amazon 的 URL,但它對我不起作用。 但是,wget 確實可以從不在 Amazon EC2 上的其他服務器上工作。 這是 EC2 上的 wget 輸出
wget -S http://www.adorama.com/images/large/CHHB74P.JPG
--2016-03-23 08:42:33-- http://www.adorama.com/images/large/CHHB74P.JPG
Resolving www.adorama.com... 23.40.219.79
Connecting to www.adorama.com|23.40.219.79|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.0 403 Forbidden
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 299
Cache-Control: max-age=604800
Date: Wed, 23 Mar 2016 08:42:33 GMT
Connection: close
2016-03-23 08:42:33 ERROR 403: Forbidden.
但是從另一個 Linux 主機它確實有效。 這是輸出
wget -S http://www.adorama.com/images/large/CHHB74P.JPG
--2016-03-23 08:43:11-- http://www.adorama.com/images/large/CHHB74P.JPG
Resolving www.adorama.com... 23.45.139.71
Connecting to www.adorama.com|23.45.139.71|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.0 200 OK
Content-Type: image/jpeg
Last-Modified: Wed, 23 Mar 2016 08:41:57 GMT
Server: Microsoft-IIS/8.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
ServerID: C01
Content-Length: 15131
Cache-Control: private, max-age=604800
Date: Wed, 23 Mar 2016 08:43:11 GMT
Connection: keep-alive
Set-Cookie: 1YDT=CT; expires=Wed, 20-Apr-2016 08:43:11 GMT; path=/; domain=.adorama.com
P3P: CP="NON DSP ADM DEV PSD OUR IND STP PHY PRE NAV UNI"
Length: 15131 (15K) [image/jpeg]
Saving to: \u201cCHHB74P.JPG\u201d
100%[=====================================>] 15,131 --.-K/s in 0s
2016-03-23 08:43:11 (460 MB/s) - \u201cCHHB74P.JPG\u201d saved [15131/15131]
我猜想圖像提供者是故意阻止來自 EC2 地址范圍的請求。
兩個示例中 wget 傳出 ip 地址不同的原因是由於 adorama 提供的 cdn 提供商的 DNS 解析
Web Server 可能會實施檢查特定指紋屬性的方法,以防止自動機器人。 這里有一些他們可以檢查
您可以在此處模擬瀏覽器標題並學習一些指紋“屬性”: https : //panopticlick.eff.org
您可以嘗試復制瀏覽器的行為方式並注入類似的標頭/用戶代理。 普通的 curl/wget 不太可能滿足這些條件,甚至像 phantomjs 這樣的工具偶爾也會被阻止。 有些人更喜歡像 selenium webdriver 這樣啟動實際瀏覽器的工具是有原因的。
我發現使用另一個也受 AkamaiGHost 保護的 url 由於用戶代理中的某些部分而被阻止。 特別是使用帶有協議的鏈接被阻止:
使用curl -H 'User-Agent: some-user-agent' https://some.website
我發現不同用戶代理的以下結果:
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0
OKfacebookexternalhit/1.1 (+http\\://www.facebook.com/externalhit_uatext.php)
:403https ://bar
: 好的https://bar
:403 我現在能找到的就是這個(被否決的)答案https://stackoverflow.com/a/48137940/230422指出標頭值中不允許使用冒號 ( :
)。 這顯然不是這里發生的唯一事情,因為 Mozilla 示例也有一個冒號,只是沒有鏈接。
我想至少大多數網絡服務器不關心並允許 facebook 的機器人和其他機器人在他們的用戶代理中有一個聯系 url。 但似乎 AkamaiGHost 確實阻止了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.