防盗链的方法有很多种,但在网上看了诸多方法后都感觉无法真正实现防盗,所以对使用时间签名实现防盗链做了一个探索。我的要求是URI资源在今天可以访问,明天就失效。除了以天数来验证外,还可以使用小时来验证,又或者每三个小时验证。以时间签名的方法来实现防盗链可以使链接被盗的时候可以访问,每当过了指定时间,链接就无法访问。
入侵者如果要盗链,则需要获取$key来产生签名。
签名时间过程,以PHP代码为例:
// 防盗链加密
function en_sign(){
$date = date("Ymd");
$key = "TankDns-ganyaotong-859";
$encrypt = openssl_encrypt($date, 'AES-128-ECB', $key, 0);
return $encrypt;
}
// 防盗链解密
function de_sign($encrypt){
$key = "TankDns-ganyaotong-859";
$decrypt = openssl_decrypt($encrypt, 'AES-128-ECB', $key, 0);
return $decrypt;
}
$sign = en_sign();
我们需要把$sign放到链接的参数里面。
<link rel="stylesheet" type="text/css" href="link?t=css&f=css/index&sign={$sign}">
后台创建一个方法处理这个链接,判断是否为盗链。
$type = Request::param("t");
$file = Request::param("f");
$sign = Request::param("sign");
if(de_sign($sign)!=date("Ymd")){
// 属于盗链
return;
}
接下来,如果不是盗链,我们就加载请求文件。
$path = "static/".$file.".".$type;
switch($type)
{
case "css":
return download($path, $file)->mimeType("text/css")->force(false);
break;
}
总结:使用时间签名作为防盗链技术,可以控制时间的长度,你可以指定一分钟后失效,也可以指定一个小时后失效。使用时间签名的防盗链技术需要保证密钥$key不被入侵者窃取。