概述

  XSS(Cross Site Script)全称跨站脚本攻击,为了跟CSS区分开来,所以变成了XSS。它允许恶意代码植入到正常的页面中,盗取正常用户的账号密码,诱使用户访问恶意的网站。

攻击

  实施XSS攻击必须具备两个条件

  1. 向web页面注入恶意代码。
  2. 这些恶意代码能够被浏览器执行。

看一个简单的demo,更能清晰的了解什么XSS攻击

    @RequestMapping(value = "/demo11",method = RequestMethod.GET)
public String demo11(@RequestParam String name,@RequestParam int age)
{
return name;
}

我们输入访问地址

127.0.0.1:8080/demo11?name=<script>alert("正在发动xss攻击")</script><a href="http://www.baidu.com">澳门皇家赌场上线了<a>&age=11

点击诱惑连接

这就是一个简单的反射性XSS攻击,也叫非持久性XSS,将非法代码提交到服务器,服务器解析并响应,而响应中包含XSS代码,最后浏览器解析并执行。另一种XSS攻击也叫持久型XSS,将XSS代码发送到服务器,如果没有后台效验,直接给存上了,在回显时,会从服务起解析加载出来,浏览器发现XSS代码,当做正常的HTML和js解析,那XSS攻击就产生了(有兴趣的童鞋可以尝试下)。

防护

  1. XSS防护最简单的就是从源头把控,把输入的一些不合法数据过滤或转义,让xss攻击代码无效,保证数据的安全性,还得控制参数的长度等。
  2. 如果源头没把控住,那就得从出口处理需要显示的数据。

springboot的防护

用到的工具包,maven坐标

        <!--XSS-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.4</version>
</dependency>
这里初始化了两个方法:getParameter和getParameterValues,getParameter方法是直接通过请求获取查询字符串类型的入参调用的方法。如果是通过springMVC注解类型来获得参数的话,调的是getParameterValues的方法
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper
{
private HttpServletRequest request; public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
} @Override
public String getParameter(String name)
{
String value = request.getParameter(name);
if (!StringUtils.isEmpty(value))
{
value = StringEscapeUtils.escapeHtml4(value);
}
return value;
} @Override
public String[] getParameterValues(String name)
{
String[] parameterValues = super.getParameterValues(name);
if (parameterValues == null)
{
return null;
}
for (int i = 0; i < parameterValues.length; ++i)
{
String value = parameterValues[i];
parameterValues[i] = StringEscapeUtils.escapeHtml4(value);
}
return parameterValues;
}
}

过滤json类型的代码

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.text.StringEscapeUtils; import java.io.IOException;
//出参处理
public class XssStringJsonSerializer extends JsonSerializer<String>
{
@Override
public Class<String> handledType()
{
return String.class;
} @Override
public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException
{
if (s == null)
{
String encodedValue = StringEscapeUtils.escapeHtml4(s);
jsonGenerator.writeString(encodedValue);
}
}
}

过滤器

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.stereotype.Component; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; @Component
@WebFilter
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
{
HttpServletRequest request = (HttpServletRequest) servletRequest;
XssAndSqlHttpServletRequestWrapper xssAndSqlHttpServletRequestWrapper = new XssAndSqlHttpServletRequestWrapper(request);
filterChain.doFilter(xssAndSqlHttpServletRequestWrapper,servletResponse);
} @Override
public void destroy()
{ } @Bean
@Primary
public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder)
{
//解析器
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//注册xss解析器
SimpleModule xssModule = new SimpleModule("XssStringJonSerializer");
xssModule.addSerializer(new XssStringJsonSerializer());
objectMapper.registerModule(xssModule);
return objectMapper;
}
}

lz使用的springboot security安全框架,将过滤器放置在添加过滤里头。

  @Bean
public XssFilter authenticationXssFilterBean()
{
return new XssFilter();
}
/*xss过滤*/
http.addFilterBefore(authenticationXssFilterBean(),UsernamePasswordAuthenticationFilter.class);

试验

127.0.0.1:8080/huangweicheng/hwc/test?name=<script>alert('hello');</script>

后台日志,传入的xss代码就成功转义了

参考链接:https://juejin.im/post/5d079e555188251ad81a28d9

  

  

springboot xss防护的更多相关文章

  1. XSS (Cross Site Scripting) Prevention Cheat Sheet(XSS防护检查单)

    本文是 XSS防御检查单的翻译版本 https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sh ...

  2. Springboot Xss注入过滤

    1.编写  XssHttpServletRequestWrapper import javax.servlet.http.HttpServletRequest; import javax.servle ...

  3. django后台返回html字段会产生XSS防护的解决方式

    1.在前端模块里面写 {{  page_str|safe }} 2.在后端 from django.utils.safestring import mark_safe pake_str = mark_ ...

  4. Springboot使用Shiro-整合Redis作为缓存 解决定时刷新问题

    说在前面 (原文链接: https://blog.csdn.net/qq_34021712/article/details/80774649)本来的整合过程是顺着博客的顺序来的,越往下,集成的越多,由 ...

  5. 网站安全通用防护代码(C#版本源码提供)

    每一个开发者都会意识到,网站发布之前,需要进行安全检查. 那么如何拦截攻击者注入恶意代码?如何防御诸如跨站脚本攻击(XSS).SQL注入攻击等恶意攻击行为? 针对目前常见的一些安全问题,结合目前一些常 ...

  6. XSS初体验

    主要内容 什么是XSS? XSS的危害有哪些? 常见的XSS漏洞 如何防范XSS?   什么是XSS? 跨站脚本攻击(Cross Site Scripting),是一种 Web 应用程序的漏洞,当来自 ...

  7. 一个跨域请求的XSS漏洞再续

    上回提到,由于需要使用代理页面解决POST请求的跨域请求,需要在代理页面上执行传递的函数.所以我们做了白名单只有我们认可的回调函数才能在页面上执行,防止执行非法的JS方法,做脚本攻击. 我们所采用的方 ...

  8. XSS分析及预防(转)

    阅读目录 XSS的种类和特点 XSS预防 总结 XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏 ...

  9. 【转载】目前主流过滤XSS的三种技术

    目前主流过滤XSS的三种技术 过滤 过滤,顾名思义,就是将提交上来的数据中的敏感词汇直接过滤掉.例如对"<script>"."<a>". ...

随机推荐

  1. boa移植 boa交叉编译

    官网:http://www.boa.org/ BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的.适合于嵌入式系统的单任务的http服务器,源代码开放.性能 ...

  2. [TCP/IP] 三次握手过程中有哪些不安全性

    1)SYN flood 泛洪攻击 , 伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送.当大量的攻击 ...

  3. linux 使用indent格式化代码

    indent是一个代码整理工具,能够方便快速的将代码格式化. 这是我较习惯的代码风格,网上还有很多其他的 参数: -nbad -bap -bbo -nbc -br -brs -c33 -cd33 -n ...

  4. React 借助pubsub-js进行兄弟组件的传递值

    1===> raect中两个 兄弟组件 互相通信使用的技术 使用 消息订阅(subscribe)和发布(publish)机制 s儿 伯 s rai b pʌ b lɪ ʃ 有一个库可以处理 Pu ...

  5. python3 AES 加解密

    #coding:utf-8 import base64 from Crypto.Cipher import AES #注:python3 安装 Crypto 是 pip3 install -i htt ...

  6. C++和C的相互调用

    C++和C相互调用实际工程中C++和C代码相互调用是不可避免的C++编译器能够兼容C语言的编译方式C++编译器会优先使用C++编译的方式extern关键字能强制让C++编译器进行C方式的编译 exte ...

  7. ssh config 配置

    一个打开新连接免密码的小技巧 Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p

  8. LeetCode 153. Find Minimum in Rotated Sorted Array寻找旋转排序数组中的最小值 (C++)

    题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...

  9. Computer Network Chapter4 solution

    1.以太网使用曼彻斯特编码,效率50% 2.侦听信道时间:来回延时时间(10usec):发送数据(25.6usec): 3.单向时延t=S(距离)/V(电缆传输速率):最小帧长=2*t*C(数据传输速 ...

  10. ASP.NET开发实战——(二)为什么使用ASP.NET

    本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...