您的位置:澳门新葡萄京娱乐网站 > 编程知识 > 怎么防止网站图片被盗链?澳门新葡萄京娱乐网站

怎么防止网站图片被盗链?澳门新葡萄京娱乐网站

2019-12-22 01:37

方法一、直接通过nginx下载静态文件

这样做不仅隐藏了真实文件地址,而且可以重命名文件,很好,很强大!

定义被盗链时替代的链接,可以是图片,也可以是404错误页,无忧小编定义的是首页,所以就是111cn.net,如果是要定义在404页面,可以把404页面的路径加上。当然替换的页面文件体积越小越好。你也可以不设置替换图片,而是使用下面的语句即可:

但 readfile() 方法还是可以会引起内存耗尽

这里面如果加上internal;表示这个url只允许内部访问,这时候你再直接从浏览器中下载fdfs文件,将提示404错误。只能通过download.php下载。

 代码如下

可以看到它里面的 Content-Type 是 text/html ,表示是一个html文件,所以浏览器就直接展示在页面上了。【关于常用的一些 Content-Type ,可以见本文最后】

首先,你可以通过网站数据库保存文件的原来文件名。

这样客户们就可以防止网站的流量因为图片被盗链而损失了,这个方法也可以添加上rar,zip之类的文件,只需要在(gif|jpg|png)这里面添加上即可。

一般情况下,使用php下载文件的时候,会加上一行set_time_limit;,表示不限制这个php脚本执行的时间

比如用户通过网站上传一个  小说.txt 的文件,然后提交到fdfs后,文件名将变成一串字母的组合。

1.Apache防盗技术

按照上面的配置,当我请求 的时候,我服务器上的位于 /home/nemo/myfile/document/test.pdf的这个文件就被下载了。当找不到相应的文件的时候,就会返回 404 。

当其他用户下载的时候,得到的文件却不是 小说.txt ,很不友好。

注意在上面的代码中登记了一个称为viewimages的SESSION变量,而<img>标记的src,属性中显示的是getimage.php?img=bg3_Ol.jpg。
下面是脚本getimage.php的代码。首先,检查SESSION变量viewimage,看其是否被设置为true:

看一下调试模式里面的这个请求,它的response header如下:

M00/00/00/fwAAAVGMateAafjTAAAABBW-xbM368.txt?filename=test.txt 

复制代码

并不是 php.ini 里面的所有设置项都可以被修改,所有可以被 ini_set() 修改的选项可以从 官方手册里面的这个清单 知晓

这里网上有详细教程。

你可能感兴趣的文章

有一种方法可以在执行的时候动态的修改脚本可以使用的内存大小,而不一定非要修改php.ini文件,毕竟php.ini是针对全局的。

这里有解决方案。

  • apache&.htaccess防盗链实现代码
  • iis图片防盗链和文件下载资源防盗链
  • apache防盗链(图片/文件)多种方法
  • nginx中nginx防盗链设置和重定向规则
  • nginx图片防盗链几种方法
  • iis httpd.ini中IIS图片防盗链
  • nginx实现防盗链配置方法介绍
  • Windows系统中IIS防盗链设置详细介绍
  • Nginx防盗链配置具体方法详解
  • Nginx 防盗链(图片/文件/目录防盗链)

但是看官方手册上面的这段话

首先搭好fastdfs

 代码如下

在脚本里面动态的修改一些设置,只对该脚本有效,实际上并不真正地修改 php.ini 文件。

{

Apache防盗技术的原理与PHP伪静态技术的原理是相同的,都需要应用Apache的mod_rewrite.so模组。Apache服务器的配置文件httpd.conf的修改方法如下:

但上面这种方式是所有人都可以下载pdf文件的,假如说下载文件这个动作是与账号有关的,比如说某用户只能下载某些文件,那么就需要在php里面对用户账户进行处理并且下载相关文件。

配置好nginx

none - 匹配没有Referer的HTTP请求(Matches the requests with no Referer header).
blocked - 请求有Referer ,但是被防火墙或者代理服务器修改,去掉了https://或http:// (Matches the requests with blocked Referrer header).
*.mydomain.com - 匹配mysite.com的所有二级域名(Matches all the sub domains of mydomain.com. Since v0.5.33, * wildcards can be used in the server names).

php里面有 ini_set() 方法可以在脚本运行时保持新的值,在脚本结束时恢复。

 

RewriteRule .*.(gif|jpg|png)$ 111cn.net[R,NC,L]

配置文件里面的 fastcgi_pass 后面可以是ip 端口,也可以是unix_socket的路径。具体根据你安装的php的里面的 php-fpm.conf 的 listen 来决定。

这样就ok了,当你在浏览器中打开download.php时,php输出这些头信息,会被nginx捕捉到,然后直接重定向到X-Accel-Redirect这个文件,直接发送给用户,同时filename头也是生效的。

复制代码

我们用 command option i 快捷键打开浏览器的调试模式,当我在浏览器里面请求 的时候,结果是浏览器直接把txt文件的内容显示在了页面上。

location /M00/

除了使用location对文件访问进行限制,也可以对特定目录进行限制,下面的配置会禁止访问images目录下所有文件

readfile自身不会导致任何内存问题。如果出现内存不足的问题,使用ob_get_level()确保输出缓存已经关闭。

但是用readfile()带来了额外的I/O开销,流量一大,会加重服务器负担。

</FilesMatch>

我在chrome里面新建一个tab页输入url http://fbd.intelleeegooo.cc/document/test.pdf 的时候,成功下载了这个文件,如下图所示:但是我在safari里面的时候,下载下来的文件多了一个 html 后缀,如下图所示我再改下代码,设置 Content-Type ,看如下示例代码:这样改过之后,在safari里面下载的文件就是正常的了,不带html后缀的。2.2 在php里面读取并输出文件的几种方法在设置完header信息之后,下面几种方法都可以用来输出文件file_get_contents() ,这个方法是把文件的内容以字符串的形式全部读取到内存里面。当文件比较大的时候,会超过内存限制$content = file_get_contents;echo $content;file() ,将文件以行的形式全部读取到数组中。当文件比较大的时候,会超过内存限制$f = file;while = each { // $line是int类型表示是第几行, $content是字符串类型表示这一行的内容 echo $content;}readfile() ,读取文件并且写入到输出缓冲区。这种方式可以输出大文件,读取单个文件不会超出内存限制。ob_end_clean;

////以下内容仅供娱乐

配置指令location来实现简单的图片和其它类型文件的防盗链。

fopen(),这就类似于C语言里面的读取文件。fopen每次可以指定读取某个块大小的内容,可以读入大文件。不会超过内存限制

}

 代码如下

如下图所示,我自己放宽了一点变成了256M,默认是128M

其实fdfs可以传入一个filename参数,指定文件名。。

<FilesMatcvh “.(gif|jpg)”>
Order Allow,Deny

如果文件是保存在服务器上面的,可以直接用nginx下载文件

备注:

复制代码

location ~ /document/.pdf$ { root /home/nemo/myfile; try_files /$uri 404;}

    internal;

用 (“|”) 来分隔你想保护的文件的扩展名。

看我在index.php里面这段示例代码,这段代码的功能下载test.txt文件

这样下载时用户将得到test.txt文件名啦。

防止图像盗链的方法主要有两种解决方案,一种使用Apache的mod_rewrite.so扩展,另一种使用PHP的SESSION变量。

那么我改一下代码,在里面设置一下header,示例代码如下:

需要做的就是在 download.php 中,写入以下头:

复制代码

readfile实际上还是需要采用MMAP, 或者是一个固定的buffer去循环读取文件, 直接输出。

header("Content-Disposition: attachment; filename= 重命名文件名.txt");
header("Content-Type: application/octet-stream");
header('X-Accel-Redirect: M00/00/00/fwAAAVGMateAafjTAAAABBW-xbM368.txt'); //fdfs文件路径
header("X-Accel-Buffering: yes");
header("X-Accel-Limit-Rate :102400"); //速度限制 Byte/s
//header("Accept-Ranges: none");//单线程 限制多线程

Nginx 的配置文件 :

比如说可以供用户下载pdf文件,那么我的nginx配置可以是这样子的:

在 nginx配置文件中

SESSION变量防盗链

看下 官方手册上 的解释Content-Disposition 相关解释在常规的HTTP应答中, Content-Disposition 消息头指示回复的内容该以何种形式展示,是以内联的形式,还是以附件的形式下载并保存到本地Content-Disposition 消息头最初是在MIME标准中定义的,HTTP表单及POST 请求只用到了其所有参数的一个子集。只有form-data以及可选的name和filename三个参数可以应用在HTTP场景中inlineinline展示txt文件看如下示例代码,设置inline内联,将上面的test.txt文件在浏览器里面展示常用的几种 Content-Type 类型下面列一下常用的几种Content-Type text/html ,内容是html格式 text/plain ,内容是纯文本格式 image/gif , gif图片格式 image/jpeg , jpg图片格式 image/png , png图片格式 multipart/form-data ,常见的 POST 数据提交的方式。当需要上传文件时,会用到这种类型 application/json ,消息主体是序列化后的 JSON 字符串 application/octet-stream ,二进制流数据。一般在下载文件的时候比较常见 application/x-www-form-urlencoded , 浏览器的原生form表单,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和val都进行了URL转码总结以上所述是小编给大家介绍的safari下载文件自动加了html后缀问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

然后下载的时候,可以通过php 用readfile()从真实路径读取文件,输出的时候通过指定head头来改变文件名。

#RewriteEngine on
  RewriteCond %{HTTP_REFERER} !^$ [NC]
  RewriteCond %{HTTP_REFERER} !google.com [NC]
  RewriteCond %{HTTP_REFERER} !baidu.com [NC]

比如说我开了一个8764端口,nginx配置如下:server { listen 8764; server_name xx.xx.xx; …… …… …… location / { root /home/nemo/fun/testdownloadfile; fastcgi_pass 127.0.0.1:xxxx; fastcgi_index index.php; include fastcgi.conf; }}

现在问题是,我们下载文件都是fdfs转换后的文件名,这对于用户来说是不友好的。

location ~ .(jpe?g|png|gif)$ {
     valid_referers none blocked mysite.com *.mysite.com;
     if ($invalid_referer) {
        return   403;
    }
}

$file = @fopen;while { print); ob_flush;}

然后安装nginx 和 fastdfs-nginx模块

以上配置都是简单通过验证请求头来实现防盗链,如果盗链的网站通过伪造来路的http请求时不能屏蔽

正如上面所说,读取大文件的时候,可能会内存耗尽。

这里还有一种办法,那就是通过linux自带的sendfile功能,让nginx直接从真实地址读取文件并发送给用户,并且还可以重命名。

复制代码

在php的配置文件 php.ini 里面,有一个 memory_limit 这个设置项,设置的是每个脚本可以分配的内存。

    root /fdfs_storge/data/;
    ngx_fastdfs_module;

复制代码

如何下载文件?

查找httpd.conf文件,找到其中的“AllowOverride”项,将它的值修改为All。保存在项目根目录下创建.htaccess文件,定义防止网图片被?链的方法。.htaccess文件的代码如下:

方法二、通过php读取文件并下载

复制代码

nginx防盗链

RewriteCond %{HTTP_REFERER} !111cn.net [NC]
  RewriteRule .*.(gif|jpg|png)$ 111cn.net[R,NC,L]

要防止网站图片被盗链,那么就有必要了解?链的手段,基本上可以分为两种:

允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。

RewriteRule .*.(gif|jpg|png)$ – [F]

”NoCase”指令:定义正则表达式的值忽略字符串的大小写。

将这个(gif|jpg|png|zip)替换掉上面完整代码中的(gif|jpg|png)这段。

 代码如下

SetEnvIfNoCase Referer “^ local_ref=1

 代码如下

.htaccess

 代码如下

SESSION变量防盗链技术的原理是判断图片访问者的权限,如果有权限则可以访问,否则就不能够访问。具体实施就是,首先定义一个SESSION 变量,然后使用另一个脚本生成图像,  并且在这个脚本中判断这个SESSION变量是否存在,如果存在则可以访问图像。例如,下面:是一个显示一幅图像的简单页面,图像的源URL是一个PHP 脚本,确保只有站点的参观者才i能够看到图像。

第一种:盗链者直接使用图片链接引用网站上的图片。防止这种盗链情况的发生有两种可行的方法:通过Apache服务器进行控制和使用SESSION变量在程序中进行控制。

首先是在根目录下创建一个.htaccess,如果已经有了,直接把下面的代码复制添加到.htaccess最下端即可。

 

 

Allow from env=local_ref

将该项前面的“#”去掉,启动该项。

简单的解释下每条语句的意思:

 代码如下

复制代码

 代码如下

复制代码

RewriteCond %{HTTP_REFERER} !^$ [NC]

<?php
session_start();
if(isset($_SESSION['VIEWIMAGES']) && $_SESSION['viewimage']==true){
$dims = getimagesize(‘images/’.$_GET['IMG']);
header(‘Content-Disposition:inline;filename=’.$_GET['img']);
header(‘Content-Type:’.$dims['mime']);
header(‘Content-Length:’.filesize(‘images/’.$_GET['img']));
readfile(‘images/’.$_GET['img']);
}else{
header(‘HTTP/1.1 404 NOT Found’);
header(‘Content-Type:text/plain’);
echo “ WWW.111cn.Net这是一个被保护的图片不可盗链! n”;
}
?>

local ref:这将使设置了local ref环境变量(无论什么值)的请求通过。任何其他的:请求将被拒绝,因为它们不符合Allow的条件并且默认是拒绝访问的。

复制代码

valid_referers指令包含允许访问资源的网站列表,不在列表中请求的返回403。下面是valid_referers指令参数的解释 :

 代码如下

^

<?php
session_start();
$_SESSION['viewimages']=true;
?>
<img src=”getimage.php?img=bg3_01.jpg”>

第二种:直接从网站上下载图片并且复制使用。

 代码如下

例如添加zip文件的防盗链:

Referer字段:当Apache处理一个请求时,将检测头信息中的Referer字段,并且设置环境变量local ref为l,如果请求从本身的网站地址开始,即是本网站的一个页面。

location {
     valid_referers none blocked mysite.com *.mysite.com;
     if ($invalid_referer) {
        return   403;
    }
}

#LoadModule rewrite_module modules/mod_rewrite.so

 代码如下

Order Allow,Deny:设置Apache对当前的请求,将执行列表中的Allow指令,然后重复进行Deny指令。

复制代码

RewriteCond %{HTTP_REFERER} !google.com [NC]

设置允许访问的HTTP来源,包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。这个可以添加多条,无忧小编提供的就只有自身还有谷歌百度等常用的seo/seo.html" target="_blank">搜索引擎的访问权限。

本文由澳门新葡萄京娱乐网站发布于编程知识,转载请注明出处:怎么防止网站图片被盗链?澳门新葡萄京娱乐网站

关键词: