首页 > 其他分享 >后端抵御xss攻击

后端抵御xss攻击

时间:2023-10-06 11:44:56浏览次数:36  
标签:xss String 攻击 value values Override import 抵御 public

原理是保存数据时对数据转义,把一些script的标签比如< >给去掉了,这些脚本就不能执行了

 

因为Hutool工具包带有XSS转义的工具类,所以我们要导入Hutool,然后利用Servlet规范提供的请求包装类,定义数据转义功能。

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.4.0</version>
</dependency>

  

我们平时写Web项目遇到的HttpServletRequest,它其实是个接口。如果我们想要重新定义请求类,扩展这个接口是最不应该的。因为HttpServletRequest接口中抽象方法太多了,我们逐一实现起来太耗费时间。所以我们应该挑选一个简单一点的自定义请求类的方式。那就是继承HttpServletRequestWrapper父类。

JavaEE只是一个标准,具体的实现由各家应用服务器厂商来完成。比如说Tomcat在实现Servlet规范的时候,就自定义了HttpServletRequest接口的实现类。同时JavaEE规范还定义了HttpServletRequestWrapper,这个类是请求类的包装类,用上了装饰器模式。不得不说这里用到的设计模式真的非常棒,无论各家应用服务器厂商怎么去实现HttpServletRequest接口,用户想要自定义请求,只需要继承HttpServletRequestWrapper,对应覆盖某个方法即可,然后把请求传入请求包装类,装饰器模式就会替代请求对象中对应的某个方法。用户的代码和服务器厂商的代码完全解耦,我们不用关心HttpServletRequest接口是怎么实现的,借助于包装类我们可以随意修改请求中的方法。同学们,如此优雅的代码设计,有时间你真该认真学习设计模式。

 

如果把各个厂商的实现类都修改一遍显然是很冗余的,通过修改wrapper类把request传进来然后就可以对请求进行转义

 

package com.example.emos.wx.config.xss;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONUtil;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (!StrUtil.hasEmpty(value)) {
            value = HtmlUtil.filter(value);
        }
        return value;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values != null) {
            for (int i = 0; i < values.length; i++) {
                String value = values[i];
                if (!StrUtil.hasEmpty(value)) {
                    value = HtmlUtil.filter(value);
                }
                values[i] = value;
            }
        }
        return values;
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> parameters = super.getParameterMap();
        Map<String, String[]> map = new LinkedHashMap<>();
        if (parameters != null) {
            for (String key : parameters.keySet()) {
                String[] values = parameters.get(key);
                for (int i = 0; i < values.length; i++) {
                    String value = values[i];
                    if (!StrUtil.hasEmpty(value)) {
                        value = HtmlUtil.filter(value);
                    }
                    values[i] = value;
                }
                map.put(key, values);
            }
        }
        return map;
    }

    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if (!StrUtil.hasEmpty(value)) {
            value = HtmlUtil.filter(value);
        }
        return value;
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        InputStream in = super.getInputStream();
        StringBuffer body = new StringBuffer();
        InputStreamReader reader = new InputStreamReader(in, Charset.forName("UTF-8"));
        BufferedReader buffer = new BufferedReader(reader);
        String line = buffer.readLine();
        while (line != null) {
            body.append(line);
            line = buffer.readLine();
        }
        buffer.close();
        reader.close();
        in.close();

        Map<String, Object> map = JSONUtil.parseObj(body.toString());
        Map<String, Object> resultMap = new HashMap(map.size());
        for (String key : map.keySet()) {
            Object val = map.get(key);
            if (map.get(key) instanceof String) {
                resultMap.put(key, HtmlUtil.filter(val.toString()));
            } else {
                resultMap.put(key, val);
            }
        }
        String str = JSONUtil.toJsonStr(resultMap);
        final ByteArrayInputStream bain = new ByteArrayInputStream(str.getBytes());
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bain.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {
            }
        };
    }

}

  为了让刚刚定义的包装类生效,我们还要在com.example.emos.wx.config.xss中创建XssFilter过滤器。过滤器拦截所有请求,然后把请求传入包装类,这样包装类就能覆盖所有请求的参数方法,用户从请求中获得数据,全都经过转义。

 

package com.example.emos.wx.config.xss;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class XssFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
                (HttpServletRequest) request);
        chain.doFilter(xssRequest, response);
    }

    @Override
    public void destroy() {
    }
}

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

标签:xss,String,攻击,value,values,Override,import,抵御,public
From: https://www.cnblogs.com/sgj191024/p/17744378.html

相关文章

  • 【Citrix篇】2-Citrix ADC/Gateway远程代码执行XSS漏洞修复方案
    、一、前言    最近我们根据修复了CVE-2023-3519漏洞,仍有部分安全厂商扫描出XSS漏洞,我们从400获悉该XSS漏洞不存在风险的,但是可拒绝请求,拦截掉。【Citrix篇】1-CitrixADC/Gateway远程代码执行漏洞CVE-2023-3519和升级方法二、漏洞详情    我们根据构建XSS语句,发现Citrix......
  • 43.227.223.x常见的网络攻击之一cc攻击&防护手段!
    HTTPFlood俗称CC攻击(ChallengeCollapsar)是DDOS(分布式拒绝服务)的一种,相比其它的DDoS攻击CC似乎更有技术含量一些。这种攻击你见不到虚假IP,见不到特别大的异常流量,但造成服务器无法进行正常连接,一条ADSL的普通用户足以挂掉一台高性能的Web服务器。由此可见其危害性,称其为“Web杀......
  • 《XSS-Labs》02. Level 11~20
    @目录索引Level-11题解Level-12题解Level-13题解Level-14题解Level-15题解Level-16题解Level-17题解Level-18~20题解靶场部署在VMware-Win7。靶场地址:https://github.com/do0dl3/xss-labs只要手动注入恶意JavaScript脚本成功,就可以证明xss漏洞存在。最简单的验证......
  • 《XSS-Labs》01. Level 1~10
    @目录索引Level-1题解Level-2题解Level-3题解总结Level-4题解Level-5题解总结Level-6题解Level-7题解Level-8题解Level-9题解Level-10题解靶场部署在VMware-Win7。靶场地址:https://github.com/do0dl3/xss-labs只要手动注入恶意JavaScript脚本成功,就可以证明xss漏......
  • 【故障公告】遭遇用心良苦的疯狂攻击:DDoS + CC攻击
    2023年10月2日19:32,收到阿里云的通知短信:【阿里云】尊敬的xxx:您的IP:xxx.xxx.xxx.xxxx实例名称:blog-xxxxxx受到攻击,攻击流量已超过DDoS基础防护的黑洞阈值,服务器的所有公网访问已被屏蔽,屏蔽时长20分钟,屏蔽时间内未再次被攻击将自动解除否则会延期解除。详情请登录流量安全控......
  • 生成树欺骗攻击与防御策略
    生成树欺骗攻击与防御策略工作目的掌握交换机生成树选举的过程、欺骗原理、攻击过程和防范策略任务分析生成树的端口有五种状态。交换机的边缘端口不接收BPDU,选举时直接从堵塞状态转变为转发状态,不参与生成树的选举过程,默认情况下,交换机的所有端口均为非边缘端口,为避免生成生......
  • 网络安全中DDoS攻击常见的分类!
    DDOS攻击是网络安全课程中非常常见的一种攻击方式,它利用带宽的流量来攻击服务器以及网站,从而造成严重的危害,被分为七大类。那么DDOS攻击有什么分类?以下是详细的内容介绍。DDOS攻击有什么分类?第一种:自动化程度分类1、手工的DDOS攻击:最早之前的DDOS攻击都是采用手......
  • jsp 之反射型 xss 示例
    jsp代码如下:<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><body><formaction=""method="get">姓名:<inputname="name"type......
  • 记一次有趣的XSS误报
    这几天更新了burp,就想试试它的漏洞扫描功能,在对http://testphp.vulnweb.com/漏扫时发现一个有趣的误报,遂有了这篇文章被动代理访问并扫描,结果如下发现一个灰色标记的XSS结果,复制url浏览器访问却显示的是张图片为什么会有XSS告警呢?看看返回包是一段代码报错,因为xss语句回显......
  • 整理php防注入和XSS攻击通用过滤
    对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags这些函数都使用上了也不一定能保证绝对的安全。那么如何预防XSS注入?主要还是需要在用户数据过滤方面得考虑......