图片防盗链
当用户打开一个含有图片内容的网页时,浏览器会在图 片的请求消息中将网页的 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 _ li
指令 secure_ li
//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_li需要注意的是,服务器密钥 yuxun 是保护下载链接的唯一凭据,如果密钥泄露, 则用 户可以自己生成有效的加密下载链接 。 因此,推荐每隔一段时间更换一次服务器密钥.
