Apache利用HTTP_Referer防盗链
简单的,我们可以用HTTP请求header中的referer判断,只要referer是内部网站的地址或者可信任的地址,就可以访问相应资源。通过Apache的FilesMatch配置可以实现,在Apache的配置文件httpd.conf中加入:
SetEnvIfNoCase Referer “^http://www.example.com” local_ref=1
SetEnvIfNoCase Referer “^http://test.example.com” local_ref=1
<FilesMatch “\.(txt|doc|mp3|zip|rar|jpg|gif)”>
Order Allow,Deny
Allow from env=local_ref #referer为www.example.com或test.example.com的请求
Allow from 127.0.0.1 #本机地址
</FilesMatch>
其中SetEnvIf指令根据客户端的请求属性设置环境变量,SetEnvIfNoCase代表当满足某个条件时,为变量赋值,一般结合其他指令使用。
也可以使用正则表达式:
SetEnvIf Referer “^http://(.)+\.ilinux\.cn/” local_ref=1
SetEnvIf Referer “^http://(.)+\.isql\.cn/” local_ref=1
SetEnvIf Referer “^http://(.)+\.other\.org\.cn/” local_ref=1
SetEnvIf Request_URI “/logo(.)+” local_ref=0
<FilesMatch “\.(mp3|wmv|png|gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip|mp3)”>
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
SpringMVC防盗链链接
public class SpringMVCInterceptor implements HandlerInterceptor {
/**
* preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
* Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
* 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
//sql注入参数处理
Iterator<String> key = request.getParameterMap().keySet().iterator();
String value = null;
while (key.hasNext()) {
value = request.getParameter(key.next());
if (value.indexOf(" AND ") > -1 || value.indexOf(" and ") > -1 || value.indexOf(" OR ") > -1 || value.indexOf(" or ") > -1) {
return false;
}
}
String referrer = request.getHeader("referer");
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
//防盗链
if(referrer==null||referrer.equals("")||referrer.lastIndexOf(basePath)==0){
return true;
}
else{
return false;
}
return true;
}
配置interceptors
<mvc:interceptors>
<bean class="com.kingnode.xsimple.filter.SpringMVCInterceptor"/>
</mvc:interceptors>