关于img 403 forbidden的一些思考

网页中经常需要显示图片给用户看,对网站本身来说有的图片是从本地图片服务器来的,但是一旦数量多了以后,磁盘空间又是一个问题。

所以有时就希望显示其他网站的Image,直接把其他网站的图片显示在我的网站上。但并不是所有的外网Image 都能直接连接过来显示。

很多情况下网站开发人员就会遇到 403 forbidden的问题。比如想显示来自IMDB的一张图片

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

本地localhost Debug的时候完全可以显示,但是将网站部署到服务器后就会遇到这样的错误

奇怪的是通过浏览器访问图片的连接,图片就正常的显示了出来。

这又是为什么?其实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:

该字段表示哪个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。

时间: 2024-12-24 16:57:37

关于img 403 forbidden的一些思考的相关文章

解决git提交问题error: The requested URL returned error: 403 Forbidden while accessing

git提交代码时,出现这个错误"error: The requested URL returned error: 403 Forbidden while accessing https" 解决方法: 编辑.git文件夹下的config文件就可以. vim .git/config #改动对于的配置 #原来的url = https://github.com/elitecodegroovy/PhoenixC.git url = https://[email protected]/elitec

Nagios HTTP WARNING: HTTP/1.1 403 Forbidden

当我们第一次搭建好nagios后会有Nagios HTTP WARNING: HTTP/1.1 403 Forbidden告警 要解决这个问题, 可以创建一个html文件,然后重启两个服务,等待几分钟后即可正常 [[email protected] ~]# touch /var/www/html/index.html [[email protected] ~]# /etc/init.d/nagios restart [[email protected] ~]# /etc/init.d/httpd

解决github push错误The requested URL returned error: 403 Forbidden while accessing

来源:http://blog.csdn.net/happyteafriends/article/details/11554043 github push错误: [html] view plaincopyprint? git push error: The requested URL returned error: 403 Forbidden while accessing https://github.com/wangz/future.git/info/refs git version 1.7.

Nginx网站根目录更改及导致403 forbidden的问题解决

最近因为工作需要,要将Nginx网站根目录更改下,通过网上的一些教程更改后,但发现测试的时候一直提示403 forbidden错误,后台通过一个朋友的提示也解决了,所以现在将详细的步骤分享给大家,有需要的朋友们可以参考学习. 一.更改根目录 Nginx默认网站根目录为/usr/local/nginx/html,要将它改成/home/fuxiao/www 更改方法: ? 1 vi /usr/local/nginx/conf/nginx.conf 将其中的 ? 1 2 3 4 location /

WampServer 2.5设置外网访问/局域网手机访问(403 Forbidden错误解决方法)

安装好wamp后,想用手机通过局域访问电脑上wamp下的网页,结果出现如下提示. (403 Forbidden)错误 1.打开http.conf文件 2.找到下图中红色方框中的onlineoffline tag - don't remove,将原来的Require local替换为Require all granted: 注意几种常用格式,自己可以灵活配置: Require local 仅允许本地访问: Require all denied 拒绝所有访问: Require all granted

Apache error: 403 Forbidden You don&#39;t have permission to access

CentOS 6 solution: chcon -t httpd_sys_content_t -R /directory refer to: https://www.centos.org/forums/viewtopic.php?f=19&t=15128&start=10#p70999 Apache error: 403 Forbidden You don't have permission to access

Nginx报错403 forbidden (13: Permission denied)的解决办法

由于开发需要,在本地环境中配置了LNMP环境,使用的是Centos 6.5 的yum安装,安装一切正常,但是由于默认网站文件夹比较奇葩,于是把网站文件用mv命令移动到了新的目录,并相应修改了配置文件,并重启Nginx. 那么好,问题来了!本以为重启就OK了.居然报个“403 is forbidden“的错误..查看/var/log/nginx/error.log日志显示:xxx 403 forbidden (13: Permission denied)错误.我勒个去~ 引起nginx 403 f

Apache2.4部署django出现403 Forbidden错误解决办法

前言:Apache部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹! 比如网页出现最多的解决办法是: <Directory E:/wamp/Apache24/www(你的工程路径)>           Order allow,deny           Allow from all       </Directory> 可惜这样改了后还是报403,最后

Apache服务器 403 Forbidden的几种错误原因小结!

403 Forbidden错误原因详解 403 - Forbidden(禁止访问),服务器拒绝请求 - forbidden request (matches a deny filter) => HTTP 403 - The request was a legal request, but the server is refusing to respond to it. 复制代码 原因1 apache的配置文件没有对站点目录许可 apache配置文件中没有对站点目录的权限许可配置,这通常是在初始化