http防盗链好技术referer

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>

猜你喜欢

转载自blog.csdn.net/qq_32447301/article/details/80224000