springboot xss防护

概述

  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

  

  

原文地址:https://www.cnblogs.com/dslx/p/11551542.html

时间: 2024-10-12 01:30:00

springboot xss防护的相关文章

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

本文是 XSS防御检查单的翻译版本 https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 介绍 本文描述了一种恰当地使用输出转码或者转义(encoding or escaping)防御XSS攻击的简单积极模式. 尽管存在巨量XSS攻击方式,遵守一些简单的规则能够彻底防住这类严重的攻击. 本文不探讨XSS攻击的商业和技术影响. reflected and stored XSS 可以

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

每一个开发者都会意识到,网站发布之前,需要进行安全检查. 那么如何拦截攻击者注入恶意代码?如何防御诸如跨站脚本攻击(XSS).SQL注入攻击等恶意攻击行为? 针对目前常见的一些安全问题,结合目前一些常见的防护办法,通用权限管理系统底层增加了安全防护代码, 现将源码提供如下 namespace DotNet.Utilities { /// <summary> /// 网站安全通用防护 /// /// 主要功能: /// 拦截攻击者注入恶意代码,可以防御诸如跨站脚本攻击(XSS).SQL注入攻击等

XSS初体验

主要内容 什么是XSS? {:&.moveIn} XSS的危害有哪些? 常见的XSS漏洞 如何防范XSS? 什么是XSS? 跨站脚本攻击(Cross Site Scripting),是一种 Web 应用程序的漏洞,当来自用户的不可信数据被应用程序在没有验证以及反射回浏览器而没有进行编码或转义的情况下进行了处理,导致浏览器引擎执行了代码. XSS的危害有哪些? 盗取各类用户帐号,如机器登录帐号.用户网银帐号.各类管理员帐号 控制企业数据,包括读取.篡改.添加.删除企业敏感数据的能力; 盗窃企业重要

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

上回提到,由于需要使用代理页面解决POST请求的跨域请求,需要在代理页面上执行传递的函数.所以我们做了白名单只有我们认可的回调函数才能在页面上执行,防止执行非法的JS方法,做脚本攻击. 我们所采用的方式是,把白名单以及过滤方法单独提出作为单独的文件引入页面,然后进行使用(这就为新的漏洞提供了机会). 本次漏洞出现的原因有两个: 屏蔽了白名单的JS文件 当前页面如果检测不到这个方法就直接不过滤了(为什么这么处理呢?防止白名单失败之后,由于某些原因,导致某种请求失败,导致流程不通.真是因为这个原因,

前端XSS相关整理

前端安全方面,主要需要关注 XSS(跨站脚本攻击 Cross-site scripting) 和 CSRF(跨站请求伪造 Cross-site request forgery) 当然了,也不是说要忽略其他安全问题:后端范畴.DNS劫持.HTTP劫持.加密解密.钓鱼等 CSRF主要是借用已登录用户之手发起“正常”的请求,防范措施主要就是对需要设置为Post的请求,判断Referer以及token的一致性,本文不展开 相对来说,XSS的内容就非常庞大了,下面就来整理一下一些XSS的知识点.比较匆忙,

xss攻击(跨站脚本)

原理跨站脚本(Cross site script,简称xss)是一种"HTML注入",由于攻击的脚本多数时候是跨域的,所以称之为"跨域脚本". 我们常常听到"注入"(Injection),如SQL注入,那么到底"注入"是什么?注入本质上就是把输入的数据变成可执行的程序语句.SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以用来获取合法用户的数据,如Cookie信息. 其原理如下图所示: X

前端学HTTP之报文首部

前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 HTTP首部字段是构成HTTP报文的要素之一.在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用.使用首部字段是为了给浏览器和服务器提供报文主体大小.所使用的语言.认证信息等内容 HTTP首部字段是由首部字段名和字段值构成的,中间用

读《图解HTTP》总结--第六章

HTTP首部 HTTP协议的请求和响应报文中必定包含HTTP首部,只是我们平时在使用Web的过程中感受不到它.本篇主要介绍HTTP首部的结构,以及首部中各字段的用法. 6.1 HTTP报文首部 HTTP协议的请求和响应报文中必定包含HTTP首部.首部内容为客户端和服务器分别处理请求和响应提供所需要的信息.对于客户端用户来说,这些信息中大部分内容无须亲自查看. 报文首部由方法.URI.HTTP版本.HTTP首部字段等构成. 6.1.1 HTTP请求报文 在请求报文中,HTTP报文由方法.URI.H

PHP开发者应了解的24个库

@PHP开发者应了解的24个库 本文由 伯乐在线 - 贾朝藤 翻译.未经许可,禁止转载!英文出处:tutorialzine.欢迎加入翻译组. 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许多多有用的库分发出来,在Github上很容易发现和使用这些库.下面是我曾经遇到过最酷的24个库.你最喜欢的库没有在这个列表里面?那就在评论中分享吧! 1. Dispatch – 微框架 Dispatch是一个PHP小框架.它并没有给你完整的MVC设置,但你可以定义URL规则和方法,以便更好组织应用程