nginx配置防盗链

浏览:2583 发布日期:2018/05/11 分类:功能实现 关键字: nginx
图片防盗链、下载防盗链
图片防盗链
当用户打开一个含有图片内容的网页时,浏览器会在图 片的请求消息中将网页的 URL 放在 referer 中,从而使图片所在的服务器能够跟踪到它被显示的网页 地址 。

因此,若要实现图片防盗链,最简单的防护手段就是判断 referer 的值,来判断当前图片的引用是否合法,一旦检测到来源不是本站,就立即阻止图片的发送,或换成一 张禁止防盗链提示的图片 。

但此方法可以通过伪造header头的 referer 请求信息,从而进行破解。# 这里为图片添加为期 30天的过期时间, 并且禁止 Google, 百度和本站之外的网站引用图片

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires      30d;
    valid_referers none blocked test.getlearn.net www.getlearn.net admin.getlearn.net 39.108.94.164 getlearn.net *.google.com *.baidu.com;
    if ($invalid_referer) {
         return 403;
    }
}


# valid_referers 指令用于设置允许访问资源的网站列表 (即白名单)
alid_referers 指令的参数可以叠加设置,中间使用空格分隔即可 

valid_ referers 可选参数值

none     # 匹配没有 Referer 的 HTTP 请求,如 valid_referers none
blocked  # 匹配 HTTP 请求中含有 Referer ,但是被防火墙或者代理服务器修改,去掉了https://或 http:// 的情况,如 valid_referers blocked
server_names   # 允许文件资源链出的域名白名单,如 valid_referers www.ng.test ng.test
string    # 任意的字符串,如 valid_referers  *.ng.test bxg.* 
regular_expression   # 正则表达式,如 valid_referers ~\.img\.
下载防盗链
如果不需要考虑资源链接的长期有效性,可 以使用 Nginx 提供的 secure _ link 和 secure_link_md5 指令来实现下载地址的加密和时 效性 。

指令 secure_ link 和 secure_link_md5 是由 ngx_http_secure_ link_module 模块提供的,nginx本身已经包括这个模块。//php 测试 nginx 防下载盗链

<?php
$secret = 'yuxun';  //密钥
$path = '/video/alipaydirect.zip'; //下载文件
//下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
$expire = time()+60;
//用文件路径、密钥、过期时间生成加密串
 $md5 = base64_encode(md5($secret . $path . $expire, true));
 $md5 = strtr($md5, '+/', '-_');
 $md5 = str_replace('=', '', $md5);
//加密后的下载地址
 echo '<a href=http://www.lgeling.com/video/alipaydirect.zip?st='.$md5.'&e='.$expire.'>测试下载防盗链</a>';
 echo '<br>http://www.lgeling.com/video/alipaydirect.zip?st='.$md5.'&e='.$expire;
 
 
 /**
 * 遵循了 secure_link_md5 指令的加密算法,
该算法是根据密钥、 URI 的 MD5 哈希值和过期时间组成的,且是由 BASE64 进行编码的。
因此,在 PHP 中生成的下载链接加密串,必须在使用 md5()函数生成哈希值后,再使用
base64_encode()函数进行 BASE64 编码,并对编码后字符串中的 +/ 和 = 分别使用“-”和
空格进行替换 。
 **/
# nginx 配置

location / {
    root   /usr/share/nginx/html/geling/public;
    index  index.html index.htm index.php;

    secure_link $arg_st,$arg_e;
    secure_link_md5 yuxun$uri$arg_e;
 
    if ($secure_link = "") {
        return 403;
    }
 
    if ($secure_link = "0") {
        return 403;
    }
}
上述配置中的 secure_link 指令,用于获取从用户端传递的参数,形如“ $arg_参数名称”的内置变量保存了相应的参数值。其中,变量 $arg_st 表示用户传递的加密串, $arg_e 表示过期时间。secure_link_md5 指令后的字符串 yuxun 是服务器指定的 加密密钥,该指令用于根据其后的表达式 yuxun$uri$arg_e 生成加密串,并与用户传递过 来的 $arg_st 加密串进行对比,对比结果一致则内置变量 $secure_link 的值为 1 ,否则为 空字符串或 0 。

需要注意的是,服务器密钥 yuxun 是保护下载链接的唯一凭据,如果密钥泄露, 则用 户可以自己生成有效的加密下载链接 。 因此,推荐每隔一段时间更换一次服务器密钥.
评论( 相关
后面还有条评论,点击查看>>