防盗链,是一个比较好玩的话题,看大家防的是否严格。

为什么要防盗链?

不用说了,防止别人直接引用下载文件。对于图片,一般都检查来源来防盗链,因为图片包含在网页里就有来源,除非你使用firefox的无来源模式,但一般还得开放无来源的权限。
对于重要的文件下载,那也可以这么做,但并不太稳妥,况且参考信息并不合适。那可以试试lighttpd的mod_secure_download,和Nginx的 Access Key Module 。

两者都有不同的功效:

lighttpd是使用时间戳来提供验证,保证时间戳在一定的范围内有效即可,这个可以用作有效时间的开放下载,但注意如果处理地址的服务器和提供下载的服务器的时间要一致或者相差不大才好。
Nginx是使用客户信息作为一个依据,比如IP,那可以提供IP限制,或者可以的话实现网段限制,但此地址就没有时间限制了

选择哪个好?

lighttpd适合有时间限制的下载,比如你有一个软件限制今天能下载,那就再好不过了,可以把地址放心公布了,当然了,限制为60秒那就可以当作是对当前用户私有了。
Nginx适合用客户信息做依据,那你可以用IP地址作为依据,也可以用cookie值做限制哦,很不错的吧?我还可以想象到可以用网址信息。你可以对现有的服务器文件进行防盗链而不用改变文件架构。

lighttpd的mod_secure_download的安装使用

官方介绍:http://redmine.lighttpd.ne...

lighttpd默认就有此模块的编译,打开注释即可使用

#                               "mod_ssi",
#                               "mod_usertrack",
                              "mod_secdownload",
#                               "mod_rrdtool",


使用需要做两个事情:
1 lighttpd配置哪样的地址需要防盗链
2 PHP需要生成相应的地址

Lighttpd参考代码:
#密钥
secdownload.secret        = "www.aslibra.com"
#文件放置的根目录,最好选择一个正常web服务无法访问的目录
secdownload.document-root = "/Data/webapps/www.aslibra.com/sec_download_files/"
#哪样的地址需要验证
secdownload.uri-prefix    = "/sec_download/"
#多少时间之后的请求算过期
secdownload.timeout       = 60


PHP参考代码:
function get_download_url($file){
  $secret = "www.aslibra.com";
  $uri_prefix = "/sec_download/";
  $f = "/$file";

  //防止时间不一致,减少一半,实际上有效时间可能就是30秒,但很大程度保证当前下载有效
  $t = time()-30;

  $t_hex = sprintf("%08x", $t);
  $m = md5($secret.$f.$t_hex);
  return "http://www.aslibra.com".$uri_prefix.$m."/".$t_hex.$f;
}


Nginx的Access Key Module的安装使用

安装其实很简单,参考官方介绍即可:
http://wiki.nginx.org/NginxHttpAccessKeyModule

阿权在安装的时候都忽略了一步,修改config文件,希望大家不要忘记。
引用
下载文件:Nginx-accesskey-2.0.3.tar.gz
解压后,编辑config文件, 把"$HTTP_ACCESSKEY_MODULE"替换成"ngx_http_accesskey_module",然后编译nginx:
./configure --add-module=path/to/nginx-accesskey


没有修改的话如果按下面的配置了,那就会在检查配置文件时有错误提示:
引用
unknown directive "accesskey"


其实是值HTTP_ACCESSKEY_MODULE为空,所以没有放到编译模块列表里,不想修改的话,那你可以在编译前执行赋值应该也可以:

export HTTP_ACCESSKEY_MODULE=ngx_http_accesskey_module


配置也很简单:

Nginx参考配置:
location /sec_download {
  accesskey             on;
  accesskey_hashmethod  md5;
  #检查地址的哪个变量
  accesskey_arg         "key";
  #md5加密的字符串
  accesskey_signature   "www.aslibra.com$remote_addr";
  #可以自定义错误提示页面
  error_page 403 = http://www.aslibra.com/?tips=download_not_permit;
}


PHP参考代码:
function get_download_url($url){
  $secret = "www.aslibra.com";
  //注意,需要考虑部署在代理后端的情况,获取的IP如果和下载服务器获取的不一致,那会导致地址失败
  $m = md5($secret.$_SERVER['REMOTE_ADDR']);
  return $url."?key=".$m;
}

祝大家使用愉快~


原创内容如转载请注明:来自 阿权的书房
收藏本文到网摘
Tags: , , , ,
发表评论
AD
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML 打开UBB 打开表情 隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               

 

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐