zoukankan      html  css  js  c++  java
  • 防止xss(脚本攻击)的方法之过滤器

    一  什么是脚本注入

    概念我就不说了 直接百度一份

      XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。

      简单来说 用户提交的数据中有js脚本  提交的数据再次显示到页面的时候会运行这个脚本。如

    <script>
               window.location.href="xxxxxxxxx"; 
    </script>

    但是把html中的特殊符号 如 "<" 用     $lt;   表示那么html就会认为这是一个普通显示的字符 。 

     二 解决脚本注入的方法  

      对输入的字符做转义,把特殊字符转义 如 用  "$lt;"  表示  “<” 具体实现如下 

      继承 HttpServletRequestWrapper 重写其中的方法  在用到前端传来的参数的地方做转义

    public class XssHttpServletRequestWraper extends HttpServletRequestWrapper {
    
        public XssHttpServletRequestWraper(HttpServletRequest request) {
            super(request);
        }
        @Override
        public String getHeader(String name) {
            String str = StringEscapeUtils.escapeHtml(super.getHeader(name));
            return str;
        }
    
        @Override
        public String getQueryString() {
            String str = StringEscapeUtils.escapeHtml(super.getQueryString());
            return  str;
        }
    
        @Override
        public String getParameter(String name) {
            String str = StringEscapeUtils.escapeHtml(super.getParameter(name));
            return str;
        }
    
        @Override
        public String[] getParameterValues(String name) {
            String[] values = super.getParameterValues(name);
            if(values != null) {
                int length = values.length;
                String[] escapseValues = new String[length];
                for(int i = 0; i < length; i++){
                    escapseValues[i] = StringEscapeUtils.escapeHtml(values[i]);
                }
                return escapseValues;
            }
            return super.getParameterValues(name);
        }
    }

     注 :StringEscapeUtils.escapeHtml() 需要引入以下架包 具体使用请百度 

            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.6</version>
            </dependency>

     写过滤器 对所有请求进行过滤

    @WebFilter(urlPatterns = "/*")
    public class XssFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            filterChain.doFilter(new XssHttpServletRequestWraper((HttpServletRequest) servletRequest),servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }

     这样就可以了

  • 相关阅读:
    运用Scapy编写类似于Nmap的端口扫描脚本
    centos7 下安装arping工具
    Redis protected-mode属性解读
    centos7编写自己的服务,运行systemctl后卡住了(即shell阻塞了)
    logback日志增加行号
    nginx隐藏版本号server_tokens
    关于数据库Oracle表字段为NVARCHAR2 与Mybatis Generator运用问题
    浅析MySQL的分区(Partition)功能
    浅析PostgreSQL序列(SEQUENCE)、常用序列操作、数据迁移后更新序列流程
    浅析mybatis里的缓存机制
  • 原文地址:https://www.cnblogs.com/guoyafenghome/p/9523278.html
Copyright © 2011-2022 走看看