nginx 防盗链心得

后台是利用http服务器nginx和tomcat在linux环境中,

1.首先项目里做了一个简单的文件夹,里面的文件可以在知道目录路径的情况下,进行随意下载,

本来,如果是这样的话,拦截器就可以进行处理这样的请求。

思路是:获取权限,看这个请求是否有权限进行访问,但是,我们在tomcat的service.xml目录里面配置了绝对路径

这就造成了,不需要经过项目,只要tomcat进行开启就可以访问文件夹。

1.解决思路如下:

本项目:可以利用过滤器,或者拦截器,以获取是否有权限进行处理,

http://blog.youkuaiyun.com/warm_start/article/details/52582865

项目以外,因为请求都是要由nginx进行转发,所以可以利用nginx防盗链的处理方式

location /download {
         accesskey             on;
         accesskey_hashmethod  md5;
         accesskey_arg         "key" ;
         accesskey_signature   "mypass$remote_addr" ;
  }

accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。
如果nginx没有安装防盗链模块,请下载安装
ActionContext ctx = ActionContext.getContext();
String pagefilename = ServletActionContext.getRequest().getParameter("路径");
String path = pagefilename.substring(5, pagefilename.length());
ctx.getSession().put("path", "/imgess/?key="+ md5加密的那串密文);
nginx接受到请求,转发给tomcat,tomcat在把上面那串请求返回时,必须加上那串MD5加密过的密文才能够访问
并且需要注意,请求开始是不需要密文的,返回数据到前台的时候,需要密文

继续测试发现,还有漏洞,就是说,如果输入tomcat中ip+端口,那么请求就不会经由nginx转发,绕过了nginx的防盗链,
解决办法就是:

在linux中防火墙限制其端口,只能使用nginx进行访问,不能直接访问tomcat

加在自启动中

vim /etc/init.d/rc.local

设置如下

iptables -A INPUT -s 127.0.0.1 -p tcp -m tcp --dport 8080 -j ACCEPT 

iptables -A INPUT -p tcp -m tcp --dport 8080 -j DROP

–A 参数就看成是添加一条规则

–p 指定是什么协议,我们常用的tcp 协议,当然也有udp,例如53端口的DNS

–dport 就是目标端口,当数据从外部进入服务器为目标端口

–sport 数据从服务器出去,则为数据源端口使用

–j 就是指定是 ACCEPT -接收 或者 DROP 不接收




<think>嗯,用户让我介绍一下Nginx防盗链,我得先理清楚防盗链的基本概念和常见方法。首先,防盗链是为了防止其他网站直接链接到自己的资源,比如图片、视频,这样会消耗自己的带宽。Nginx作为常用的Web服务器,肯定有相关的配置方法。 我应该先解释什么是盗链,以及为什么需要防盗链。用户可能不太清楚具体原理,所以得用简单的例子说明。比如,如果别人网站直接用了你服务器上的图片链接,每次访问都会占用你的流量,导致成本增加。 接下来,常见的防盗链方法有哪些呢?我记得主要是基于HTTP Referer头来判断请求来源。Nginx可以通过配置valid_referers指令来限制访问来源。需要详细说明如何配置这个模块,包括允许的域名和禁止后的处理,比如返回403或者重定向。 另外,可能需要提到使用secure_link模块进行更高级的控制,比如生成加密链接,但用户可能更关注基本方法,所以这部分可以简要带过,作为扩展知识。 还要注意配置语法的正确性,比如在server或location块中添加valid_referers,以及使用if语句判断无效的referer。同时,提醒用户某些浏览器或情况下referer可能为空,需要特别处理,比如允许空的referer,或者使用meta标签来影响referer策略。 用户可能想知道如何测试配置是否生效,可以建议他们使用curl命令模拟不同的referer来检查响应。例如,curl -e参数指定referer,看看是否返回403。 另外,可能需要注意Nginx的配置语法是否正确,比如指令后面是否有分号,括号是否正确闭合,避免配置错误导致服务器重启失败。所以,在给出示例配置时,必须确保LaTeX格式正确,同时配置代码也要正确无误。 最后,总结一下防盗链的重要性和配置步骤,确保用户能够按照步骤操作。同时,提醒用户根据实际需求调整允许的域名,处理可能的异常情况,比如允许搜索引擎的抓取,或者特定的合作伙伴站点。 可能需要检查是否有遗漏的细节,比如valid_referers的不同参数,none、blocked、服务器名称等,以及如何组合使用。确保用户能够灵活应用这些参数来满足不同的需求。 总的来说,结构应该分点说明,先介绍概念,再讲配置方法,然后示例,注意事项和测试方法。确保逻辑清晰,用户能够一步步理解和实施防盗链配置。</think>Nginx防盗链是一种防止其他网站未经授权直接引用本站资源(如图片、视频、文件等)的技术手段。以下是逐步说明: 1. **盗链原理** 当用户访问网站A时,若页面中直接引用了网站B的图片链接(如`<img src="https://B.com/image.jpg">`),实际消耗的是网站B的带宽和服务器资源。 2. **Nginx防盗链实现核心** 基于HTTP请求头中的`Referer`字段判断请求来源。 ```nginx location ~* \.(jpg|png|gif|mp4)$ { valid_referers none blocked server_names *.example.com; if ($invalid_referer) { return 403; # 或返回替代图片:rewrite ^ /anti-hotlink.png; } } ``` - `valid_referers`参数说明: - `none`:允许无Referer的请求(如直接浏览器访问) - `blocked`:允许Referer被防火墙过滤或篡改的请求 - `server_names`:允许本站域名 - `*.example.com`:允许指定域名 3. **扩展方法:加密链接(secure_link)** 通过生成带签名的临时链接实现更严格控制: ```nginx location /files/ { secure_link $arg_md5,$arg_expires; secure_link_md5 "$secure_link_expires$uri$remote_addr secret"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; # 链接过期 } } ``` 4. **注意事项** - 部分浏览器隐私模式会屏蔽Referer - 可通过`add_header Referrer-Policy "no-referrer";`控制Referer策略 - 使用`curl -e "http://test.com" https://yourdomain.com/image.jpg`模拟测试 - 需配置`server_names`匹配所有合法域名变体(如带www和不带www) 5. **最佳实践** - 对静态资源目录统一配置防盗链 - 结合日志监控异常请求: ```nginx log_format hotlink '$time_iso8601|$remote_addr|$http_referer|$uri'; access_log /var/log/nginx/hotlink.log hotlink if=$invalid_referer; ``` 完整配置示例: ```nginx server { listen 80; server_name yourdomain.com; location ~* \.(jpg|jpeg|png|gif|mp4)$ { valid_referers none blocked server_names *.yourdomain.com ~.google. ~.baidu.; if ($invalid_referer) { rewrite ^ /static/anti-hotlink.jpg; # return 403; } root /var/www/static; expires 30d; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值