盗资源是黑产界以最小成本获取最高利益的一个常用手段。因此,对于任何一个大型网站而言,做好防盗措施,避免自身利益受损是至关重要的。Nginx 在代理这类静态资源(图片、视频、文章等)时,可以通过配置实现防盗连的功能。
1、使用Referer模块
location ~* .*\.(gif|jpg|ico|png|css|svg|js)$ {
root /usr/local/nginx/static;
#valid_referers none blocked www.gaoyufu.com *.gaoyufu.com *.baidu.com *.google.com; # 有效的来源
valid_referers www.gaoyufu.com *.gaoyufu.com *.baidu.com *.google.com; # 有效的来源
if ($invalid_referer) { # 无效的来源的话就给404
rewrite ^/ http://www.youdomain.com/404.jpg;
#return 404;
#break;
}
access_log off;
}
valid_referers:此关键字定义了白名单,即本机自身访问允许,自行修改成您的域名!*.gaoyufu.com这个指的是子域名,域名与域名之间使用空格隔开;
rewrite ^/ http://xxxxxxx.jpg
:这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示设定的图片。
invalid_referer:此为内置变量,通过判断上一行中的valid_referers值会返回0或者1,
- none代表请求头中没有referer信息,这一般是直接在浏览器输入图片网址;
- blocked代表被防火墙过滤标记过的请求。如果访问来源不在白名单内,则返回403错误
2、secure_link模块
该模块的功能是与实际HTTP应用程序(PHP或Java等动态应用程序)相结合,实现对用户的访问连接做校验和过期验证的功能。常用于访问及文件下载的防盗链的实现。
HTTP服务器代码(PHP)配置样例如下:
<?php
$secret = 'nginxtest'; // 定义密钥
$path = "/download/test.zip"; // 被保护的真实连接
$expire = time()+10; // 访问超时时间是10s
$md5 = base64_encode(md5($secret . $path . $expire, true)); // 将访问密钥、访问路径、超时时 间加密
$md5 = strtr($md5, '+/', '-_'); // 特殊字符“+”和“/”的处理
$md5 = str_replace('=', '', $md5); // 特殊字符“=”的处理
$url = "http://".$_SERVER['HTTP_HOST']."$path?valid=$md5&time=$expire"; // 新的访问连接
echo '<a href="'.$url.'" >test.zip</a>';
?>
Nginx配置样例如下:
server{
listen 8083;
root /opt/nginx-web/phpweb;
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi.conf;
}
location /download/ {
alias /opt/nginx-web/files/;
secure_link $arg_valid,$arg_time; # 设置MD5及过期时间的参数为valid和time
secure_link_md5 nginxtest$uri$arg_time; # MD5计算格式
if ( $secure_link = "" ) {
return 403;
}
if ( $secure_link = "0" ) {
return 405;
}
}
}
3、使用第三方模块
ngx_http_accesskey_module
下载模块
git clone https://github.com/darren2025/nginx-accesskey.git
./config --prefix=/usr/local/nginx --add-module=nginx-accesskey
make
make install
配置nginx
server {
listen 10022;
server_name localhost;
location ^~ /files/{
alias /opt/nginx-web/files/;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
accesskey on; #功能开启
accesskey_hashmethod md5; #加密方式
accesskey_arg sign; #参数名称
accesskey_signature "mypass$remote_addr"; #参数
}
}
评论区