返回顶部
首页 > 资讯 > 后端开发 > Python >springboot项目如何防止XSS攻击
  • 162
分享到

springboot项目如何防止XSS攻击

2024-04-02 19:04:59 162人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 什么是XSS攻击? 2. 如何防范? 2.1 什么时候注入请求参数 3. 具体处理细节 1. 什么是XSS攻击?     XSS攻

1. 什么是XSS攻击?

    XSS攻击全称跨站脚本攻击,是一种在WEB应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。也就是作恶的用户通过表单提交一些前端代码,如果不做处理的话,这些前端代码将会在展示的时候被浏览器执行。

2. 如何防范?

有两种方式,一种是一些特殊字符转义,另一种是去除一些危险html元素。本文通过jsOUP库实现第二种方式。

现在问题是,在什么时候对XSS攻击的字符串进行处理呢?这就涉及到spring mvc的Controller中的method params什么时候注入的问题。下面对方法参数注入的原理进行简单说明。

2.1 什么时候注入请求参数

常见的控制器方法有下面几种,分别是通过GET获取请求参数,POST获取JSON或者fORM表单的参数


        
        @ResponseBody
        @GetMapping("/xssByGetUsingPath/{content}")
        public String testGetUsingPath(@PathVariable(name = "content") String content) {
            return content;
        }       


         
        @ResponseBody
        @GetMapping("/xssByGetUsingSimple")
        public String testUsingSimple(@RequestParam(name = "content") String content) {
            return content;
        }

        
        @ResponseBody
        @GetMapping("/xssByGetUsingModel")
        public String testGetUsingModel(BaseTest.Paper paper) {
            return paper.getContent();
        }

        
        @ResponseBody
        @PostMapping("/xssByFormPostUsingSimple")
        public String testFormPostUsingSimple(@RequestParam(name = "content") String content) {
            return content;
        }

        
        @ResponseBody
        @PostMapping("/xssByFormPostUsingModel")
        public String testFormPostUsingModel(BaseTest.Paper paper) {
            return paper.getContent();
        }

        
        @ResponseBody
        @PostMapping("/xssByPostJsonBody")
        public String testPostJsonBody(@RequestBody BaseTest.Paper paper) {
            return paper.getContent();
        }

大家都知道,在spring mvc中处理请求的入口在 DispatcherServlet 类中,其中 doDispatch() 方法完成所有核心功能。在该主流程中,HandlerAdapter 将会对Http请求进行 Controller 的方法调用,以及对请求结果进行转换,并封装为DispatcherServlet 类需要的 ModelAndView 。在这里,由于使用注解的方式进行 Controller 定义,所以 HandlerAdapter 的实现类为 RequestMappingHandlerAdapter 。RequestMappingHandlerAdapter 类的 handle() 方法中,委托给 HandlerMethodArgumentResolver 对每个 Controller 的 方法的每个参数进行解析,反射调用 Controller 的 方法后,再 委托 HandlerMethodReturnValueHandler 对反射调用的返回值进行处理。

至此,本文的主角出现了,也就是 HandlerMethodArgumentResolver 。我们看下有关于本文的HandlerMethodArgumentResolver 类继承关系。

上面的常见controller定义方法的 参数解析(注意,这里是说方法那里的参数解析) 对应 HandlerMethodArgumentResolver  的关系如下图:

现在,我们已经知道了他们都由什么样 HandlerMethodArgumentResolver  解析方法参数,我们继续分析他们之前的共同点,并得到在哪里对http传过来的数据进行XSS处理。

RequestResponseBodyMethodProcessor 是一个对request body的JSON数据反序列化的处理器,在 resolveArgument() 方法中,将会获取合适的 org.springframework.http.converter.HttpMessageConverter  类对string数据进行反序列化处理。SpringBoot 在初始化的时候,已经默认注册了 jackson 的 MappingJackson2HttpMessageConverter ,并使用它对 JSON 数据进行反序列化操作。在 jackson 里面,JsonDeserializer 类 用于json数据的property的反序列化,因此,我们可以通过扩展 JsonDeserializer ,并在里面处理XSS即可。

对于  PathVariableMethodArgumentResolver、 RequestParamMethodArgumentResolver、 ServletModelAttributeMethodProcessor ,在 resolveArgument() 方法中,他们对需要对请求参数调用 DataBinder 类 对获取到的参数类型转换和数据绑定。对于类型转换的过程,他们会使用 org.springframework.core.convert.converter.Converter  进行转换。同样,在SPRINGBOOT初始化的过程,也注册了很多个默认的转换器,我们可以注册一个自定义转换器,用于对数据进行xss处理。

3. 具体处理细节

抽象XSSCleaner,用于对string进行XSS处理


public interface XssCleaner {

    
    String clean(String html);

}

使用JSOUP,做HTML节点的白名单处理


public class DefaultXssCleaner implements XssCleaner {

    public static final HtmlWhitelist WHITE_LIST = new HtmlWhitelist();

    @Override
    public String clean(String html) {
        if (StringUtils.hasText(html)) {
            return Jsoup.clean(html, WHITE_LIST);
        }
        return html;
    }

    private static class HtmlWhitelist extends Whitelist {

        public HtmlWhitelist() {
            //定义标签和属性的白名单

            addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col", "colgroup", "dd", "div", "span", "embed", "object", "dl", "dt",
                    "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img", "li", "ol", "p", "pre", "q", "small",
                    "strike", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u", "ul");

            addAttributes("a", "href", "title", "target");
            addAttributes("blockquote", "cite");
            addAttributes("col", "span");
            addAttributes("colgroup", "span");
            addAttributes("img", "align", "alt", "src", "title");
            addAttributes("ol", "start");
            addAttributes("q", "cite");
            addAttributes("table", "summary");
            addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width");
            addAttributes("th", "abbr", "axis", "colspan", "rowspan", "scope", "width");
            addAttributes("video", "src", "autoplay", "controls", "loop", "muted", "poster", "preload");
            addAttributes("object", "width", "height", "classid", "codebase");
            addAttributes("param", "name", "value");
            addAttributes("embed", "src", "quality", "width", "height", "allowFullScreen", "allowScriptAccess", "flashvars", "name", "type", "pluginspage");

            addAttributes(":all", "class", "style", "height", "width", "type", "id", "name");

            addProtocols("blockquote", "cite", "http", "https");
            addProtocols("cite", "cite", "http", "https");
            addProtocols("q", "cite", "http", "https");

        }

        @Override
        protected boolean isSafeAttribute(String tagName, Element el, Attribute attr) {
            //不允许 javascript 开头的 src 和 href
            if ("src".equalsIgnoreCase(attr.geTKEy()) || "href".equalsIgnoreCase(attr.getKey())) {
                String value = attr.getValue();
                if (StringUtils.hasText(value) && value.toLowerCase().startsWith("javascript")) {
                    return false;
                }
            }

            //允许 base64 的图片内容
            if ("img".equals(tagName) && "src".equals(attr.getKey()) && attr.getValue().startsWith("data:;base64")) {
                return true;
            }

            return super.isSafeAttribute(tagName, el, attr);
        }
    }
}

新增一个jackson的JsonDeserializer 



public class JacksonXssCleanJsonDeserializer extends JsonDeserializer<String> {

    private final static Logger LOGGER = LoggerFactory.getLogger(JacksonXssCleanJsonDeserializer.class);

    private final XssCleaner xssCleaner;

    public JacksonXssCleanJsonDeserializer(XssCleaner xssCleaner) {
        this.xssCleaner = xssCleaner;
    }

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

    @Override
    public String deserialize(JsonParser p, DeserializationContext context) throws IOException, JsonProcessingException {
        // XSS clean
        String text = p.getValueAsString();
        if (StringUtils.hasText(text) && XssCleanMarker.shouldClean()) {
            String cleanText = xssCleaner.clean(text);
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Json property value: [{}] cleaned up by JacksonXssCleanJsonDeserializer, current value is:{}.", text, cleanText);
            }
            return cleanText;
        }
        return text;
    }
}

新增 Converter 



public class XssCleanConverter implements Converter<String, String> {

    private final Logger LOGGER = LoggerFactory.getLogger(XssCleanConverter.class);

    private XssCleaner xssCleaner;

    public XssCleanConverter(XssCleaner xssCleaner) {
        this.xssCleaner = xssCleaner;
    }

    @Override
    public String convert(String text) {
        if (StringUtils.hasText(text) && XssCleanMarker.shouldClean()) {
            String cleanText = xssCleaner.clean(text);
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("request param [{}] cleaned up by XssCleanConverter, current value is:{}.", text, cleanText);
            }
            return cleanText;
        }
        return text;
    }
}

对 JsonDeserializer  和 Converter 进行注册


@Configuration
@ConditionalOnProperty(value = XSS_PROPERTIES_ENABLED, havingValue = "true", matchIfMissing = true)
@ConditionalOnWebApplication
@EnableConfigurationProperties({XssProperties.class})
public class WebXssConfiguration implements WebMvcConfigurer {

    private XssProperties properties;

    public WebXssConfiguration(XssProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean
    public XssCleaner xssCleaner() {
        return new DefaultXssCleaner();
    }

    @Bean
    @ConditionalOnClass(value = {ObjectMapper.class, Jackson2ObjectMapperBuilder.class})
    public Jackson2ObjectMapperBuilderCustomizer jacksonXssCleanJsonDeserializerCustomer(XssCleaner xssCleaner) {
        return builder -> builder.deserializers(new JacksonXssCleanJsonDeserializer(xssCleaner));
    }

    @Override
    public void addFormatters(FormatterReGIStry registry) {
        XssCleaner xssCleaner = xssCleaner();
        registry.addConverter(new XssCleanConverter(xssCleaner));
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        XssCleanMarkerHandlerInterceptor handlerInterceptor = new XssCleanMarkerHandlerInterceptor(properties);
        registry.addInterceptor(handlerInterceptor);
    }
}

上面是XSS处理的核心代码。处理XSS处理,还进行了一些扩展,比如 http path 路径的过滤 和 一些使能控制。

完整的代码可以参考仓库:仓库地址

以上就是springboot项目如何防止XSS攻击的详细内容,更多关于springboot防止XSS攻击的资料请关注编程网其它相关文章!

--结束END--

本文标题: springboot项目如何防止XSS攻击

本文链接: https://lsjlt.com/news/128875.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot项目如何防止XSS攻击
    目录1. 什么是XSS攻击? 2. 如何防范? 2.1 什么时候注入请求参数 3. 具体处理细节 1. 什么是XSS攻击?     XSS攻...
    99+
    2024-04-02
  • js如何防止xss攻击
    js防止xss攻击的方法:对用户的输入及请求都进行过滤检查,如对特殊字符进行过滤,设置输入域的匹配规则等,例如:function removeXss(val){val = val.replace(/([\x00-\x08][\x0b-\x0...
    99+
    2024-04-02
  • yii2如何防止xss攻击
    yii2防止xss攻击的示例代码:在对应文件中添加以下代码进行调用:function actionClean($str){$str=trim($str);$str=strip_tags($str);$str=stripslashe...
    99+
    2024-04-02
  • django如何防止xss攻击
    django防止xss攻击的方法:使用escape过滤器,无需转义时使用safe过滤器,对单一变量进行转义过滤,例如:Hello {{ a|escape }} # 转义{{a}} # 转义{{a|safe}} # 认为a安全,不进行转义利用...
    99+
    2024-04-02
  • react如何防止xss攻击
    react防止xss攻击的方法:react在渲染html内容和渲染dom属性时都会将 "'&<>这几个字符进行转义,转义部分源码如下:for (index = match....
    99+
    2024-04-02
  • angular如何防止xss攻击
    angular防止xss攻击的示例:angular提供了一个DomSanitizer服务,提供的方法如下:export enum SecurityContext { NONE, HTML, STYLE, SCRIPT, URL, RESOU...
    99+
    2024-04-02
  • java如何防止xss攻击
    java防止xss攻击的方案:配置过滤器,代码如下:public class XSSFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig)...
    99+
    2024-04-02
  • emlog如何防止xss攻击
    emlog防止xss攻击的方法:给cookie设置上httponly检查,操作步骤:打开“include\lib\loginauth.php”文件,找到第134行的setAuthCookie函数,改成以下代码:public static f...
    99+
    2024-04-02
  • vue如何防止xss攻击
    这篇“vue如何防止xss攻击”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何防止xss攻击”文章吧。vue防止xs...
    99+
    2023-07-04
  • SpringBoot如何防止XSS注入攻击详解
    什么是 XSS 攻击 在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本。这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的。攻击者在使用...
    99+
    2024-04-02
  • 前端如何防止xss攻击
    前端防止xss攻击的方法:过滤非法字符,例如:// 过滤XSS反射型漏洞filterInputTxt: function (html) {html = html.replace(/(.*]+>.*)/g,""); // HTML标记html...
    99+
    2024-04-02
  • 网页如何防止xss攻击
    网页防止xss攻击的方法:实现过滤器对特殊字符进行转义过滤,例如:function filter(xss) {  var whiteList = ['h1'...
    99+
    2024-04-02
  • 表单如何防止xss攻击
    表单防止xss攻击的方法:可以使用PHP中trim()函数去除用户输入数据中不必要的字符(如:空格、tab、换行)。使用PHP中stripslashes()函数去除用户输入数据中的反斜杠(\),示例代码:function chec...
    99+
    2024-04-02
  • SpringBoot防止XSS注入攻击的方法
    这篇文章将为大家详细讲解有关SpringBoot防止XSS注入攻击的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是 XSS 攻击在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚...
    99+
    2023-06-15
  • 如何防止xss和sql注入攻击
    防止xss和sql注入攻击的通用方法:php防sql注入和xss攻击通用过滤如下:function string_remove_xss($html) {preg_match_all("/\...
    99+
    2024-04-02
  • vue怎么防止xss攻击
    vue防止xss攻击的示例分析:用node.js做测试,在终端引入xss,命令如下:npm install xss --save在vue的页面进行引入,例如:import xss from&...
    99+
    2024-04-02
  • antixss怎么防止xss攻击
    antixss防止xss攻击的方法:antixss是由微软推出用于防止xss攻击的一个类库,可在将html数据保存到数据库之前,使用AntiXSS Sanitizer对象调用GetSafeHtml或GetSafeHtmlFragment,并...
    99+
    2024-04-02
  • ci怎么防止xss攻击
    ci防止xss攻击的方法:对全局的POST、GET、COOKIE进行过滤,打开config.php文件,配置如下:$config['global_xss_filtering'] = TRUE;...
    99+
    2024-04-02
  • JSP如何写过滤器防止xss攻击
    JSP写过滤器防止xss攻击的方法:利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符,代码如下:...
    99+
    2024-04-02
  • tp5如何防xss攻击
    tp5防xss攻击的方法:在公共函数文件common.php中加入以下方法:function filter_default($value){return htmlspecialchars($value, ENT_NOQUOTES);}在配置...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作