1 -【 常见 web 安全漏洞 】- 3 HTTP 请求防盗链

1 什么是 防盗链

比如 A 网站有一张图片,被 B 网站直接通过 img 标签属性引入,直接盗用A网站图片展示。

防盗链技术:限制资源只能在某服务器访问。

在互联网中通讯的底层是 Socket 技术,Socket 技术里面本质是 二进制文件流 传输

白名单与黑名单

在网关里面进行白名单和黑名单权限判断

2 如何实现防盗链

判断 HTTP 请求头 Referer 域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片可能被其他服务器盗用。

如果在浏览器分 F12 里面查看不到请求头,清除缓存即可

在这里插入图片描述

2.1 使用过滤器判断请求头 Referer 记录请求来源

配置文件:

img:
  url: www.local.com

过滤器:

package com.snow.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;

/**
 *
 * 图片防盗链
 *
 */
@WebFilter(filterName = "imgFilter", urlPatterns = "/imgs/*")
public class ImgFilter implements Filter {

    @Value("${img.url}")
    private String imgUrl;

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

    /**
     *
     *
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        // 1.获取请求头中的来源字段
        HttpServletRequest req = (HttpServletRequest) request;
        String referer = req.getHeader("Referer");
        if (StringUtils.isEmpty(referer)) {
            request.getRequestDispatcher("/imgs/error.png").forward(req, response);
            return;
        }
        // 2.判断请求头中的域名是否和限制的域名一致
        String domainUrl = getDomain(referer);
        // 正常情况 黑名单 白名单接口
        System.out.println("imgUrl ------" + imgUrl);
        if (!domainUrl.equals(imgUrl)) {
            request.getRequestDispatcher("/imgs/error.png").forward(req, response);
            return;
        }
        // 直接放行图片
        chain.doFilter(req, response);

    }

    // 获取url对应的域名
    private String getDomain(String url) {
        String result = "";
        int j = 0, startIndex = 0, endIndex = 0;
        for (int i = 0; i < url.length(); i++) {
            if (url.charAt(i) == '/') {
                j++;
                if (j == 2)
                    startIndex = i;
                else if (j == 3)
                    endIndex = i;
            }

        }
        result = url.substring(startIndex + 1, endIndex);
        return result;
    }

    public void destroy() {
        // TODO Auto-generated method stub
    }

}

注意:测试的时候,最好开启两个不同的浏览器测试,避免图片缓存的原因。

在这里插入图片描述

发布了687 篇原创文章 · 获赞 229 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/weixin_42112635/article/details/105095338