SpringBoot防Xss攻击

这篇具有很好参考价值的文章主要介绍了SpringBoot防Xss攻击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

这几天自己学习了一下SpringBoot项目怎么预防Xss攻击,这里记录一下怎么防止Xss攻击的代码,等以后有需要用到的话,自己可以快速找到。

依赖

这里需要注意的是1.5到1.9版本有高危漏洞,需要升级到1.10.0以上版本,这是当前时间最新的版本。

		<!--commons-text工具包,用于xss攻击对特殊参数字符做转换,1.51.9版本有高危漏洞-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.10.0</version>
        </dependency>

项目文件结构

处理非application/json提交方式使用下面二个类:
XssFilter类,重写doFilter方法,然后调用XssHttpServletRequestWrapper类。
XssHttpServletRequestWrapper类,只能对提交方式为x-www-form-urlencoded和form-data做特殊字符转换,不能对提交方式为application/json的数据格式做转换,如果没有指定提交方式,浏览器默认提交方式为x-www-form-urlencoded。
处理application/json提交方式使用下面三个类:
XssStringJsonDeSerializer类,这个类主要是对前端传递的数据格式为json格式的参数进行特殊字符转义。
XssStringJsonSerializer类,这个类主要是处理后端向前端返回的json数据,将数据里面包含的特殊字符进行转义后发送。
JacksonConfig类,调用上面2个自定义的序列化类,没有这个配置类,上面的2个类不会生效。
SpringBoot防Xss攻击

未处理Xss前的效果

测试代码:
SpringBoot防Xss攻击
在谷歌浏览器直接输入接口请求测试如下:
看到它这里是直接弹窗打印了,想要的返回值应该是浏览器页面中返回的是值才对。
SpringBoot防Xss攻击

处理非application/json提交方式的xss代码

XssFilter类代码

package com.hjl.mall.filter;

import org.springframework.stereotype.Component;

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

/**
 * XSS过滤器
 */
@Component
public class XssFilter implements Filter {
	
	@Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
	
	//重写doFilter方法
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /**
         * 1. 重写getParamter方法
         * 2. 在getParamter中判断属性,然后对特殊字符进行编码,使用官方提供的工具类.
         * 3. 继续提交请求
         */
        chain.doFilter(new XssHttpServletRequestWrapper(
                (HttpServletRequest) request), response);
    }

	@Override
    public void destroy() {
 
    }
}

XssHttpServletRequestWrapper类代码

package com.hjl.mall.filter;

import org.apache.commons.text.StringEscapeUtils;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.Objects;

/**
 * @ClassName XssHttpServletRequestWrapper
 * @Description 重写wrapper,只能对提交方式为x-www-form-urlencoded和form-data做特殊字符转换,不能对提交方式为json的数据格式做转换
 * @Version 1.0
 */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getHeader(String name) {
        return StringEscapeUtils.escapeHtml4(super.getHeader(name));
    }

    @Override
    public String getQueryString() {
        return StringEscapeUtils.escapeHtml4(super.getQueryString());
    }

    @Override
    public String getParameter(String name) {
        return StringEscapeUtils.escapeHtml4(super.getParameter(name));
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        return super.getInputStream();
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] parameterValues = super.getParameterValues(name);
        if (Objects.isNull(parameterValues)) {
            return null;
        }
        //对请求参数里面的特殊字符进行转义
        for (int i = 0; i < parameterValues.length; i++) {
            parameterValues[i] = StringEscapeUtils.escapeHtml4(parameterValues[i]);
        }

        return parameterValues;
    }
}

处理Xss后的效果

可以看到达到了自己想要的结果,没有弹窗显示了,直接将结果正确显示到了页面中。
SpringBoot防Xss攻击
转义后的值如下:
SpringBoot防Xss攻击
但是这样对于json格式的数据起不到作用,如下图,发现并没有对里面的<、>、"这三个特殊符号进行转义:
SpringBoot防Xss攻击

处理application/json提交方式的xss代码

XssStringJsonDeSerializer类代码

package com.hjl.mall.filter;

import java.io.IOException;

import org.apache.commons.text.StringEscapeUtils;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

/**
 * 对前端传递的数据格式为json格式的参数进行特殊字符转义
 */
public class XssStringJsonDeSerializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        //对json格式的参数值进行转义
        return StringEscapeUtils.escapeHtml4(jsonParser.getText());
    }
}

XssStringJsonSerializer类代码

package com.hjl.mall.filter;

import java.io.IOException;
import java.util.Objects;

import org.apache.commons.text.StringEscapeUtils;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

/**
 * 处理后端向前端返回的json数据,将数据进行转义后发送
 */
public class XssStringJsonSerializer extends JsonSerializer<String> {

    @Override
    public Class<String> handledType() {
        return String.class;
    }

    @Override
    public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (Objects.nonNull(value)) {
            //将json格式数据转义后发送给前端
            String encodedValue = StringEscapeUtils.escapeHtml4(value);
            jsonGenerator.writeString(encodedValue);
        }
    }
}

JacksonConfig类代码

package com.hjl.mall.config;

import com.hjl.mall.filter.XssStringJsonDeSerializer;
import com.hjl.mall.filter.XssStringJsonSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

/**
 * 对json格式数据做序列化和反序列化操作,防止xss攻击
 * XssFilter类
 * XssHttpServletRequestWrapper类
 * XssStringJsonDeSerializer类
 * XssStringJsonSerializer类
 * JacksonConfig类
 * 这5个类是一起的,都是用来防止xss攻击,前2个类是用来处理提交方式为x-www-form-urlencoded和form-data做特殊字符转换
 * 后面三类是对application/json提交方式做处理
 */
@Configuration
public class JacksonConfig implements WebMvcConfigurer{

    @Bean
    public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        //注入自定义的序列化工具,将@RequestBody的json格式参数做转义处理
        SimpleModule simpleModule = new SimpleModule(XssStringJsonSerializer.class.getSimpleName());
        //只对入参json进行特殊字符转义
        simpleModule.addDeserializer(String.class, new XssStringJsonDeSerializer());
        //对返回给前端的json数据(特殊字符)进行转义,这里暂时注释掉,当前项目暂不需要对返回给前端的数据进行转义
        //simpleModule.addSerializer(String.class, new XssStringJsonSerializer());
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}

json格式处理Xss后的效果

测试代码:
SpringBoot防Xss攻击
因为是post请求,所以这里使用postman工具对接口进行测试:
发现已经转义成功。
SpringBoot防Xss攻击

注意事项(补充说明)

这个JacksonConfig类 里面的代码,我注释掉了对返回json数据格式做转义的处理。
SpringBoot防Xss攻击
不注释掉的话,会进行2次转义处理,效果如下:
它这里先是对入参<转义为&lt;,然后又将&lt;里面的&符合在返回给前端的时候又进行了一次转义,所以变成了&amp;lt;
SpringBoot防Xss攻击
这一种会出现这一种情况,我这里用txt简单写一个html页面代码:
SpringBoot防Xss攻击
然后我将txt后缀改为html,效果如下:
SpringBoot防Xss攻击
所以这里JacksonConfig类里面的XssStringJsonSerializer类调用需要根据自己的项目实际情况需要是否引用。
SpringBoot防Xss攻击
好了,笔记先做到这里,等以后自己有需要直接引用即可。文章来源地址https://www.toymoban.com/news/detail-448592.html

到了这里,关于SpringBoot防Xss攻击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot防Xss攻击

    这几天自己学习了一下SpringBoot项目怎么预防Xss攻击,这里记录一下怎么防止Xss攻击的代码,等以后有需要用到的话,自己可以快速找到。 这里需要注意的是1.5到1.9版本有高危漏洞,需要升级到1.10.0以上版本,这是当前时间最新的版本。 处理非application/json提交方式使用下面二

    2024年02月05日
    浏览(46)
  • SpringBoot 该如何预防 XSS 攻击

    XSS 漏洞到底是什么,说实话我讲不太清楚。但是可以通过遇到的现象了解一下。在前端Form表单的输入框中,用户没有正常输入,而是输入了一段代码: /inputimg src=1 onerror=alert1  这个正常保存没有问题。问题出在了列表查询的时候,上面的代码就生效了,由于图片的地址乱写

    2024年02月13日
    浏览(37)
  • Springboot 实战一个依赖解决XSS攻击

    XSS : Cross Site Scripting,为不和层叠样式表(Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中 Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 在一开始的时候,这种攻击的

    2024年02月03日
    浏览(43)
  • springboot-防止sql注入,xss攻击,cros恶意访问

    1.sql注入 sql注入: 把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令 解决方法: 1)无论是直接使用数据库还是使用如mybatis组件,使用sql的预编译,不要用拼接字符串。 2)后台过滤检测:使用正则表达式过滤传入的参数**;

    2024年02月16日
    浏览(61)
  • web安全学习日志---xss漏洞(跨站脚本攻击)

      仅执行一次,非持久型。主要存在于攻击者将恶意脚本附加到url的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。 利用场景: 直接插入JS代码,修改url参数    攻 scriptalert(\\\'hack\\\')/script 防 $name=str_replace(\\\'script\\\', \\\'  \\\',$name

    2024年02月13日
    浏览(114)
  • 网络安全进阶学习第二课——XSS跨站脚本攻击

    首先了解什么是前端。前端从定义上来讲是指一个网站的前台部分,是展示给用户看的部分。它不需要关注任何业务之间的逻辑处理,只需要安安静静地做好自己,老老实实的把自己最美的一面展示给用户。 Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的

    2024年02月11日
    浏览(46)
  • 保护网站安全:学习蓝莲花的安装和使用,复现跨站脚本攻击漏洞及XSS接收平台

     这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。  环境准备 攻击介绍 原理 攻击者通过向目标网站提交包含恶意脚本的请求,然后将该恶意脚本注入到响应页面中,使其他用户在查看包含注入恶意脚本的页面时运行该恶意脚本。 图片来源 使用方法

    2024年02月10日
    浏览(51)
  • 了解一下XSS

    XSS,即跨站脚本攻击(Cross-Site Scripting),是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本代码,使得浏览器执行这些脚本,从而控制网页上的内容或者获取用户的敏感信息 。XSS 攻击一般分为反射型、存储型和 DOM 型三种类型。 1. 反射型 XSS 攻击 反射型 XSS 攻

    2023年04月25日
    浏览(37)
  • 图片转换成pdf格式?这几种转换格式方法了解一下

    图片转换成pdf格式?将图片转换成PDF格式的好处有很多。首先,PDF格式具有通用性,可以在几乎任何设备上查看。其次,PDF格式可以更好地保护文件,防止被篡改或者复制。此外,PDF格式还可以更好地压缩文件大小,使其更易于共享和传输。因此,将图片转换成PDF格式是一个

    2024年02月12日
    浏览(41)
  • XSS 攻击是什么?怎么验证是否有XSS攻击漏洞?

    XSS(跨站脚本,Cross-Site Scripting)攻击是一种网络攻击,攻击者利用网站漏洞将恶意脚本注入用户的浏览器,从而在用户浏览网页时执行恶意代码。这种攻击可能造成用户敏感信息泄露、钓鱼、欺诈等安全问题。 验证是否有 XSS 攻击漏洞的方法: 手动测试:通过对输入框、

    2024年02月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包