關于img 403 forbidden的一些思考

網頁中經常需要顯示圖片給用戶看,對網站本身來說有的圖片是從本地圖片服務器來的,但是一旦數量多了以后,磁盤空間又是一個問題。

所以有時就希望顯示其他網站的Image,直接把其他網站的圖片顯示在我的網站上。但并不是所有的外網Image 都能直接連接過來顯示。

很多情況下網站開發人員就會遇到 403 forbidden的問題。比如想顯示來自IMDB的一張圖片

<img src="http://ia.media-imdb.com/images/M/MV5BMjIwMjYyNjk4Nl5BMl5BanBnXkFtZTcwNzA4NDYwMw@@._V1_UY317_CR12,0,214,317_AL_.jpg" height="350" width="200">

本地localhost Debug的時候完全可以顯示,但是將網站部署到服務器后就會遇到這樣的錯誤

image

奇怪的是通過瀏覽器訪問圖片的連接,圖片就正常的顯示了出來。

這又是為什么?其實Referer是由瀏覽器自動加上的,但是也有例外比如

1. 直接通過瀏覽器訪問

2. 在web前段使用location.href 或者location.replace

3. 利用HTTPS等加密協議

這就是HotLinking 盜鏈問題, 可以通過配置網站Server 端來實現這種反盜鏈的行為。

?

為什么像IMDB這樣的網站要做 Anti HotLinking反盜鏈的事情呢?

版權的問題是一方面。

另一方面可以稱作Bandwidth Theft, 當用戶訪問IMDB頁面的時候,IMDB需要Bandwidth傳輸數據,而Bandwidth 是網站的成本之一。

好比誰也不愿意陌生人偷偷的把電器插到你的插座,偷偷的用你的電,而你去負擔所有的費用。

?

如何配置Server實現Anti HotLinking 呢?

以Asp.net MVC 為例

可以給Controller 添加ActionFilter 或者添加處理AntiHotLinking 的 IHttpHandler

核心都是UrlReferrer

HttpRequest 有個字段 UrlReferrer:

image

?

該字段表示哪個Url? 通過像上面Img Src的方式訪問了Server.

//訪問者的域
var refDomain = Request.UrlReferrer.Host;//當前WebSite的域
var serverDomain = Request.Url.Host;

最后可以通過判斷 是否來自同一個域 來決定Anti HotLinking的策略

或者可以通過在web.config 中配置URLRewrite來實現

復制代碼
<rewrite>
<rules><rule name="Anti HotLinking Rule for Image" enabled="true" stopProcessing="true"><match url=".*\.(gif|jpg|png)$" /><conditions><add input="{HTTP_REFERER}" negate="true" pattern="^$" /><add input="{HTTP_REFERER}" negate="true" pattern="http://www.yourwebsite.com/.*" /><add input="{HTTP_REFERER}" negate="true" pattern="http://yourwebsite.com/.*" /></conditions><action type="Rewrite" url="/images/anti-hotlinking.png" />
</rule>
</rules>
</rewrite>
復制代碼

?

如果網站用戶就是希望看到不能顯示的圖片或者視頻呢?

這里給大家推薦一個Chrome 插件?Anti-Anti-HotLinking

安裝后就能看到未能顯示的圖片。

對該插件我沒有仔細研究,有可能是通過Download來解決Hotlinking 問題的,也有可能是通過Chrome劫持Request 修改UrlReferer實現的。

?

對網站開發人員有什么解決辦法嗎?

1. 將外網的Image在Server端下載 再轉換成 base64 最后傳輸給img 標簽。

復制代碼
        public static string ImageToBase64(Stream imageStream, ImageFormat format){using (System.Drawing.Image image = System.Drawing.Image.FromStream(imageStream)){using (MemoryStream stream = new MemoryStream()){image.Save(stream, format);var result = System.Convert.ToBase64String(stream.ToArray());return result;}}}
復制代碼
<img src="data:image/png;base64,這里存放轉換成base64的字符串 />

?2. 利用RefererKiller這個JavaScript插件 繞過UrlReferer

  ReferrerKiller.imageHtml("fakeweb/fakeimage.png"); 返回能夠顯示的img的Html字符串

  ReferrerKiller.imageHtml("fakeweb/fakeimage.png"); 返回能夠顯示的img的DOM節點

  其實這兩個函數是同一個東西,可以撿方便的用。

  這種方式解決HotLinking問題其實原理很簡單,在web中 比如<script src="differentDomain/fake.js"> </script>

  加載js 是沒有跨域訪問的問題。

  ReferrerKiller 就動態生成一個iframe,并在iframe內加入img標簽。利用src加載的特性把代碼放到src中,就可以去掉Referer。

  所以ReferrerKiller.imageHtml返回的是一個能顯示圖片的iframe。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397076.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode: Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For example, Given [3,2,1,5,6,4] and k 2, return 5.Note: You may assume k is always valid, 1 ≤ k ≤ arrays lengt…

python 循環賦值_Python打牢基礎,從19個語法開始!

Python簡單易學&#xff0c;但又博大精深。許多人號稱精通Python&#xff0c;卻不會寫Pythonic的代碼&#xff0c;對很多常用包的使用也并不熟悉。學海無涯&#xff0c;我們先來了解一些Python中最基本的內容。Python的特點解釋型語言&#xff0c;無需編譯即可運行提供了交互式…

uwp連接mysql數據庫_在 UWP 應用中使用 SQLite 數據庫

在 UWP 應用中使用 SQLite 數據庫Use a SQLite database in a UWP app06/26/2020本文內容可以使用 SQLite 在用戶設備上的輕量級數據庫中存儲和檢索數據。You can use SQLite to store and retrieve data in a light-weight database on the users device. 本指南演示如何執行該…

12-事件委托(事件代理)

什么是事件委托 通俗的講&#xff0c;事件就是onclick&#xff0c;onmouseover&#xff0c;onmouseout&#xff0c;等就是事件&#xff0c;委托呢&#xff0c;就是讓別人來做&#xff0c;這個事件本來是加在某些元素上的&#xff0c;然而你卻加到別人身上來做&#xff0c;完成這…

oracle 窗口函數 (keep)

看到很多人對于keep不理解&#xff0c;這里解釋一下&#xff01;Returns the row ranked first using DENSE_RANK2種取值&#xff1a;DENSE_RANK FIRSTDENSE_RANK LAST在keep (DENSE_RANK first ORDER BY sl) 結果集中再取max、min的例子。SQL> select * from test;ID MC SL…

MySQL 的實時性能監控利器

操作系統及MySQL數據庫的實時性能狀態數據尤為重要&#xff0c;特別是在有性能抖動的時候&#xff0c;這些實時的性能數據可以快速幫助你定位系統或MySQL數據庫的性能瓶頸&#xff0c;就像你在Linux系統上使用「top&#xff0c;sar&#xff0c;iostat」等命令工具一樣&#xff…

設置linearlayout最大高度_技術案例 | 排煙口個數與擋煙垂壁高度的關系探討

隨著《建筑防煙排煙系統技術標準》( 以下簡稱新規范) 的正式實施&#xff0c;新規范對排煙系統的設計提出了完全不同的設計理念。根據新規范正文: 當建筑空間凈高不大于6m時&#xff0c;每個防煙分區的排煙量應按不小于60m/(h㎡)計算且不小于15,000m/h( 走道不小于13,000m/h) &…

python安裝requests第三方模塊

2018-08-28 22:04:51 1 .下載到桌面后解壓&#xff0c;放到python的目錄下 --------------------------------------------------------------------------------------------------------------------------------------------------------- 2 . 在CMD輸入以下 F:\>cd /d F…

mysql整站源碼安裝_MySQL入門01-MySQL源碼安裝

操作系統&#xff1a;CentOS 6.7MySQL版本&#xff1a;5.6.301.前期準備首先需要CMake&#xff0c;可以yum直接安裝&#xff1a;yum install cmake也可以官網 https://cmake.org/ 下載源碼編譯。我這里選擇了官網下載最新版本cmake-3.5.2.tar.gz。# tar -zxvf cmake-3.5.2.tar.…

集算器協助Java處理結構化文本之條件過濾

直接用Java實現文本文件中數據按條件過濾會有如下的麻煩: 1、文件不是數據庫&#xff0c;不能用SQL訪問。當過濾條件變化時需要改寫代碼。如果要實現象SQL那樣靈活的條件過濾&#xff0c;則需要自己實現動態表達式解析和求值&#xff0c;編程工作量非常大。 2、文件太大時不能一…

python3動態加載模塊的方法實現

2019獨角獸企業重金招聘Python工程師標準>>> 需求 我們有時寫了一個功能&#xff0c;需要不斷地調整&#xff0c;但是已經在線上了&#xff0c;而且在執行任務&#xff0c; 這時要更新上去源文件&#xff0c;而不能結束掉當前進程,怎么辦&#xff1f; 所以這時&…

python 浮點數最小值_PYTHON學習筆記(3)——基本數據類型

本次學習原內容均來自MOOC國家精品課程《Python程序語言設計》嵩天第一篇在問題——“今天python了嗎&#xff1f;”中基本數據類型1、 整數&#xff08;1&#xff09;整數無限制 pow(x,y) 計算 &#xff08;2&#xff09;四種進制 2、 浮點數類型&#xff08;1&#xff09;取整…

2018.08.29 NOIP模擬 pmatrix(線性篩)

【問題描述】 根據哥德巴赫猜想&#xff08;每個不小于 6 的偶數都可以表示為兩個奇素數之和&#xff09;&#xff0c;定義 哥德巴赫矩陣 A 如下&#xff1a;對于正整數對(i,j)&#xff0c;若 ij 為偶數且 i,j 均為奇素數&#xff0c;則 Ai,j 1&#xff0c; 否則 Ai,j 0。現…

Windows Azure移動終端云服務管理(公測版)

概覽 云在遠方&#xff0c;管理在您手中。在這個移動為先 云為先的世界&#xff0c;服務不再是基于請求才提供&#xff0c;而是主動來到身邊方便您的模式了。我們最近將會陸續推出幾大移動端利器幫助您隨時隨地管理您的云服務。 首批利器之中排名第一當屬Azure云助手應用, 它是…

學習opencv3中文版_給視覺組新生的一點學習建議

如果說機械組是把機器人做出來電控組讓機器人動起來那么視覺組就是讓機器人智能化完成一個合格的機器人三者缺一不可今天就讓我們來看看視覺組師兄推薦的學習建議吧&#xff01;1語言基礎 野狼隊視覺組目前使用的主要語言是C&#xff0c;同時也需要具備一定的C語言基礎。建議…

如何動態改變audio的播放的src

如何動態改變audio的播放的src 一、總結 一句話總結&#xff1a;js方式在請求外部網站的時候行&#xff0c;php方式在請求內外部資源都行。因為php走在js前面&#xff0c;所以問題可以從php方面想辦法。 1、如何使用js控制修改audio的src或它的source 的src屬性實現動態改變aud…

錯誤 open too many files

錯誤:服務器最大打開文件數65535啟動java程序報錯 open too many files解決辦法&#xff1a;1.增加文件描述符 #服務器本來就是65535了2.排查程序 #研發總監4.研發總監和我 一起看服務器lsof -p pid&#xff08;程序&#xff09;|wc -l5.最終確定程序的問題6.研發總監 去改…

mysql 水平拆分實例_2021先定個小目標?搞清楚MyCat分片的兩種拆分方法和分片規則!(二):水平拆分實例解析和代碼實現!...

一、概述根據表中的數據的邏輯關系&#xff0c;將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面&#xff0c;這種切分稱之為數據的水平(橫向)切分。二、案例場景在業務系統中, 有一張表(日志表), 業務系統每天都會產生大量的日志數據 , 單臺服務器的數據存儲及處理能…

30分鐘快速搭建移動應用直傳OSS服務

30分鐘快速搭建移動應用直傳服務 背景 這是一個移動互聯的時代。手機APP上傳的數據會越來越多。把數據存儲的問題交給OSS&#xff0c; 讓開發者能更加專注于自己的應用邏輯。 那么怎么樣基于OSS構建一個APP存儲系統呢&#xff1f; 目的 本教程就是讓你在30分鐘內搭建一個基于OS…

用java判斷一個年份是否為閏年_判斷閏年還是平年

↑↑↑點擊上方圖片&#xff0c;了解詳情正文&#xff1a;判斷一個年份是閏年還是平年。閏年條件&#xff1a;1.可以被400整除。2.可以被4整除&#xff0c;但是不可以被100整除。代碼&#xff1a;Private Sub 查詢_Click() If Me.年份 Mod 4 0 And Me.年份 Mod 100 <> 0…