热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于XSS脚本注入攻击和重定向攻击

1.脚本注入攻击例如:

 

1.脚本注入攻击

例如:

更多请参考:

XSS脚本注入 - 美女爱找茬 - 博客园 (cnblogs.com)

那么怎么来预防这类攻击?

我们可以添加参数过滤,例如:

增加对get请求,form表单,json数据的过滤

将这五个文件导入项目即可

a.新建get请求和表单过滤的转义类

文件中是针对参数值含有"<" ">"进行转义,如果有特殊要求,可以自己写正则或其它


import org.springframework.util.StringUtils;
import org.springframework.web.util.HtmlUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;/**** XXS转义*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {String value = super.getParameter(name);if (!StringUtils.isEmpty(value)) {//如果请求参数的值含有"<",">" 则转义if (value.contains("<") || value.contains(">")) {value = HtmlUtils.htmlEscape(value);}}return value;}@Overridepublic String[] getParameterValues(String name) {String[] parameterValues = super.getParameterValues(name);if (parameterValues == null) {return null;}for (int i = 0; i " 则转义if (value.contains("<") || value.contains(">")) {parameterValues[i] = HtmlUtils.htmlEscape(value);}}}return parameterValues;}
}

注:JS和JQuery都提供转义的函数,在此不介绍了。

后端,Spring也提供了转义的方法:

/** HTML转义 **/
String s = HtmlUtils.htmlEscape("

hello world

 

");
System.out.println(s);
String s2 = HtmlUtils.htmlUnescape(s);
System.out.println(s2); 结果:
hello world

 

hello world

 

为什么要转义?  转义的目的是防止前端传送的参数,影响后端的响应,带出一些关键的信息。例如:COOKIEs等等。

如果我们不想转义,可以直接进行删除或替换。

如果有特殊的要求,可以继承HttpServletRequestWrapper.java 然后根据自己的要求来重新相关的方法。

b.json

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import java.io.IOException;
import java.lang.reflect.Type;
/**
*json*/public class XSSMappingJackson2HttpMessageConverter extendsMappingJackson2HttpMessageConverter {private ObjectMapper mapper = new ObjectMapper();public XSSMappingJackson2HttpMessageConverter() {super();mapper.getFactory().setCharacterEscapes(new HTMLCharacterEscapes());}@Overridepublic Object read(Type type, Class contextClass,HttpInputMessage inputMessage) throws IOException,HttpMessageNotReadableException {JavaType javaType = getJavaType(type, contextClass);// 下面的对@RequestBody的信息做XSS过滤try {// json字串转实体Object object = mapper.readValue(inputMessage.getBody(), javaType);// 实体转字串String jsOnString= mapper.writeValueAsString(object);// json字串转实体object = mapper.readValue(jsonString, javaType);return object;} catch (IOException ex) {throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);}}
}

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.web.util.HtmlUtils;
import java.io.IOException;
/***/
public class XssStringJsonSerializer extends JsonSerializer {@Overridepublic Class handledType() {return String.class;}@Overridepublic void serialize(String value, JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException {if (value != null) {String encodedValue = HtmlUtils.htmlEscape(value);jsonGenerator.writeString(encodedValue);}}
}

import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class XssFilter implements Filter {FilterConfig filterCOnfig= null;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.filterCOnfig= filterConfig;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;XssHttpServletRequestWrapper xssRequestWrapper = new XssHttpServletRequestWrapper(req);chain.doFilter(xssRequestWrapper, response);}@Overridepublic void destroy() {this.filterCOnfig= null;}@Beanpublic MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {return new XSSMappingJackson2HttpMessageConverter();}@Beanpublic XssStringJsonSerializer xssStringJsonSerializer(){return new XssStringJsonSerializer();}
}

web.xml 新增配置:

xssFilterdemo.XssFilterxssFilter/*

 

关于重定向攻击:

我们使用过滤器来处理:

a.新建过滤器

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/***/
public class XssRedirectFilter implements Filter {public final static String REDIRECT_URL = "redirectUrl";//一但发现攻击,跳转到我们指定的网址(根据实际修改)public final static String DEFAULT_URL = "http://www.lili.study.com";@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest)request;HttpServletResponse resp = (HttpServletResponse)response;String uri = req.getRequestURI();String redirectUrl = req.getParameter(REDIRECT_URL);if (redirectUrl != null) {String xssPath = PropertiesUtil.getXssPath();String[] xssPaths = xssPath.split(",");List list = Arrays.asList(xssPaths);if(list.contains(uri)){String[] paths = redirectUrl.split(REDIRECT_URL);//如果有两个及两个以上重定向url,则默认重定向到DEFAULT_URLif (paths.length >= 3) {resp.sendRedirect(DEFAULT_URL);return;}//重定向为一个,判断重定向的路径中,是否包含guanyi或edgjString path = paths[0];if(path.contains("?")){path = path.substring(0,path.indexOf("?"));}//如果跳转的路径,不包含我们的字段,则跳转if(!path.contains("lili") && !path.contains("ll")){resp.sendRedirect(DEFAULT_URL);return;}}}filterChain.doFilter(request,response);}@Overridepublic void destroy() {}
}

2.获取属性的工具类(默认需要拦截的是登录接口)

package gy.erp.util;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/***/
@Component
public class PropertiesUtil {private static String xssPath;//需要拦截的接口,指定拦截@Value("${xss.path.filter:/login}")public void setXssPath(String xssPath) {PropertiesUtil.xssPath=xssPath;}public static String getXssPath() {return xssPath;}
}

如果想拦截所有,则不需要该类,并且去除XssRedirectFilter.java相关的代码即可。

3.配置web.xml

xssPathFilterdemo.XssRedirectFilterxssPathFilter/*

可以根据实际情况做相应的调整修改。


推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • springboot项目引入jquery浏览器报404错误的解决办法
    本文介绍了在springboot项目中引入jquery时,可能会出现浏览器报404错误的问题,并提供了解决办法。问题可能是由于将jquery.js文件复制粘贴到错误的目录导致的,解决办法是将文件复制粘贴到正确的目录下。如果问题仍然存在,可能是其他原因导致的。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
只属于天天的牛牛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有