• 常见Web安全漏洞--------XSS 攻击


    1,XSS 攻击

    XSS攻击使用Javascript脚本注入进行攻击
    例如在提交表单后,展示到另一个页面,可能会受到XSS脚本注入,读取本地cookie远程发送给黑客服务器端。
    
    <script>alert('sss')</script>
    <script>window.location.href='http://www.itmayiedu.com';</script>
    对应html源代码: &lt;script&gt;alert('sss')&lt;/script&gt;

    因为浏览器默认支持脚本执行,提交表单时候,如果有脚本语言,可能就浏览器就直接执行了。

    index.ftl:

    <!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>
    </body> 
    </html>

    forward.ftl:

    <!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>
    </body> 
    </html>

    controller:

    @Controller
    public class Index {
        @RequestMapping("/index")
        public String index() {
            return "index";
        }
        
        // 接受頁面 參數
        @RequestMapping("/postIndex")
        public String postIndex(HttpServletRequest request) {
            request.setAttribute("name", request.getParameter("name"));
            return "forward";
        }
    }

    当调用index 的方法,进入到index.ftl ,提交表单,进去到postIndex 的方法,找到forward 页面,页面渲染。

    但是如果如果提交是脚本语言,可能就浏览器就直接执行了

     

    解决方式:通过过滤器(拦截器),对请求进行拦截,然后对其中的参数中的特别字符进行特别转换成html 语言

    例如:

    <script>alert('sss')</script> 转成 &lt;script&gt;alert('sss')&lt;/script&gt 这样浏览器就不会把他们当成标签

    重新封装HttpServletRequestWrapper,用来获取HttpServletRequest 请求的参数等

    /**
     * 功能说明:
     * 功能作者:
     * 创建日期:
     * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com
     */
    package com.aiyuesheng.http;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import org.apache.commons.lang.StringEscapeUtils;
    import org.apache.commons.lang.StringUtils;
    
    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
        private HttpServletRequest request;
    
        /**
         * @param request
         */
        public XssHttpServletRequestWrapper(HttpServletRequest request) {
            super(request);
            this.request = request;
        }
    
        @Override
        public String getParameter(String name) {
            // 获取之前的参数
            String olValue = super.getParameter(name);
            System.out.print("原来参数:" + olValue);
            if (!StringUtils.isEmpty(olValue)) {
                olValue = StringEscapeUtils.escapeHtml(olValue);
                System.out.println("转换后" + olValue);
            }
            System.out.println();
            return olValue;
        }
    
    }

    过滤器:

    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 com.aiyuesheng.http.XssHttpServletRequestWrapper;
    
    @WebFilter(filterName = "xssFilter", urlPatterns = "/*")
    public class XssFilter implements Filter {
    
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // 程序防止XSS攻击原理
            // 1. 使用过滤器拦截所有参数
            HttpServletRequest req = (HttpServletRequest) request;
            // 2.重新getParameter方法
            XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(req);
            // 放行程序,继续往下执行
            chain.doFilter(xssHttpServletRequestWrapper, response);
        }
    
        public void destroy() {
    
        }
    
    }

    启动类上加上@ServletComponentScan

    在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    @SpringBootApplication
    @ServletComponentScan
    public class App {
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
    }
  • 相关阅读:
    ubuntu-18.04自动配置脚本
    Nodejs on windows 10
    终端接收FFMEPG推送的流出现音频卡顿问题
    FFMPEG 4.0 版本 支持PSI设置
    FFMPEG 支持https协议
    FFmpeg修改AC3编码的描述子
    FFMPEG 设置socket缓冲区
    将 h264 格式转换为YUV数据
    将 YUV 数据 编码为 h.264 格式
    将 PCM 数据编码为AAC格式
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11263883.html
Copyright © 2020-2023  润新知