关于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.mzph.cn/news/397076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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. 本指南演示如何执行该…

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…

集算器协助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;取整…

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…

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…

【JavaScript吉光片羽】--- 滑动条

灯光的亮度控制需要一个滑动条&#xff0c;先借用lamp源码中Bar&#xff1a; var Bar function (opt) {var defaults {$id: "", // 进度条dom节点idmin: 1, // 刻度最小值stepCount: 5, // 刻度步数step: 1, // 刻度步长$alpha: "",//显示亮度的idtouchE…

python语言用什么关键字来声明一个类_python使用什么关键字定义类

什么是类&#xff1f; 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 什么是方法&#xff1f; 类中的函数即为方法 如何定义一个类&#xff1f; 定义类&#xff0c;语法格式如下&#xff1a;class ClassName:. . .…

谷歌+安卓,他已经改变了世界两次,但还想多来几次

回望拉里佩奇的创业经历&#xff0c;小巴发现他在几个创业者最有可能犯&#xff08;si&#xff09;错&#xff08;bi&#xff09;的节点上都处理得很好。 你还记得你用的第一个搜索网站是什么吗&#xff1f; Google.com 讲到它的创始人&#xff0c;一般要连起来念&#xff0c; …

一张图看懂单机/集群/热备/磁盘阵列(RAID)

单机部署(Standalone) 只有一个饮水机提供服务器&#xff0c;服务只部署一份 集群部署(Cluster) 多个饮水机同时提供服务&#xff0c;服务冗余部署&#xff0c;每个冗余的服务都对外提供服务&#xff0c;一个服务挂掉时依然可用 热备部署(Hot-swap) 只有一个桶提供服务&#xf…

typescript vuex_Vue3+TypeScript完整项目上手教程

作者&#xff1a;TinssonTaihttps://juejin.im/post/6875713523968802829一个完整的Vue3Ts项目,支持.vue和.tsx写法 项目地址&#xff1a;https://github.com/vincentzyc/vue3-demo.gitTypeScript 是JS的一个超集&#xff0c;主要提供了类型系统和对ES6的支持&#xff0c;使用 …

一些会用到的知识

为什么80%的码农都做不了架构师&#xff1f;>>> HtmlAgilityPack 用来解析HTML代码 microsoft.mshtml CsQuery 解析HTML代码 转载于:https://my.oschina.net/uwith/blog/813725