• 常见Web安全漏洞--------防盗链


    1,防盗链防止盗用自己服务上的东西。。。

    2,XSS服务上有这么一张图:

    <!DOCTYPE html>
    <html>
    <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    </head>
    <body>
    <form action="postIndex" method="post">
            输入内容: <input type="text" name="name"> <br> <input
                type="submit">
        </form>
    <img src="imgs/logo.PNG" alt="">
    </body> 
    </html>

    SatetyChain 服务上:<img src="http://127.0.0.1:8080/img/logo.PNG" alt=""> 直接把这张图片引用过来,属于盗图,怎么防止这种情况发生呢?

    <!DOCTYPE html>
    <html>
    <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    </head>
    <body>
    <form action="postIndex" method="post">
            输入内容: <input type="text" name="name"> <br> <input
                type="submit">
        </form>
    <img src="http://127.0.0.1:8080/imgs/logo.PNG" alt="">
    </body> 
    </html>

    3,防盗链技术实现上面的需求,简单来说,还是通过拦截器,拦截请求,查看请求头Referer记录请求来源,可以查看到请求图片的域名,如果不是指定的域名,让其请求失败

     测试:

    C:WindowsSystem32driversetchosts

    127.0.0.1  www.aiyuesheng.com

    package com.aiyuesheng.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("${domain.name}")
        private String domainName;
    
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            String referer = req.getHeader("Referer");
            if (StringUtils.isEmpty(referer)) {
                request.getRequestDispatcher("/imgs/error.png").forward(request, response);
                return;
            }
            String domain = getDomain(referer);
            //域名里面如果有端口号,为了测试
            String domainTemp = domain.contains(":") ? domain.split(":")[0] : domain;
            if (!domainTemp.equals(domainName)) {
                request.getRequestDispatcher("/imgs/error.png").forward(request, response);
                return;
            }
            chain.doFilter(request, response);
        }
    
        /**
         * 获取url对应的域名
         *
         * @param url
         * @return
         */
        public 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() {
    
        }
    }

    当有其他服务,盗用图片的时候,会拦截请求,查看RequestHeader 里面的Referer 参数:不是匹配的域名,则重定向error.png

  • 相关阅读:
    Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接(一)
    yaml中的锚点和引用
    Kafka查看topic、consumer group状态命令
    手把手教你写一个脚手架
    可视化拖拽组件库一些技术要点原理分析(三)
    《带你入门前端工程》开源了
    可视化拖拽组件库一些技术要点原理分析(二)
    实验 7: OpenDaylight 实验——Python 中的 REST API 调用
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11265785.html
Copyright © 2020-2023  润新知