由于公司的产品准备全面互联网化,所以就对安全问题进行了一系列的排查,排查过程中发现了xss脚本攻击的问题,开始着手了解和修改代码

xss攻击的简单解释

跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
—维基百科跨站脚本

通过开源项目Antisamy防御Xss攻击

Antisamy是owasp下的开源项目(下载地址,需要翻墙),主要用于防御富文本的xss攻击。
需要说明的是,在实际情况中,最经常出现的攻击情况是输入框的js代码传入和按钮的url篡改,但是由于实际业务的需要,我们并不能严格控制输入框的内容为汉字或者数字,所以应当对输入进行过滤。

引入Antisamy包

<dependency><groupId>org.owasp.antisamy</groupId><artifactId>antisamy</artifactId><version>1.5.5</version>
</dependency>```
  • 1

这段代码是通过maven工具引入antisamy最新版本的jar包到项目中,如果没有使用maven项目,就需要手动下载jar包在项目中建立依赖。

jar包中的xml文件

antisamy jar包中包含多个xml配置文件,用于配置项目中允许输入的内容。其中有
转存失败重新上传取消

antisamy-ebay.xml文件是ebay网站使用的过滤富文本输入的配置文件,其他几个带有公司名称后缀的配置文件是相应公司使用的配置策略。需要注意的是antisamy-anythinggoes.xml文件,这个文件允许所有有效的html和css元素输入,但是拒绝javascript和css相关的网络钓鱼攻击。一般不推荐使用,但是可以当作参考,用于研究策略文件定义的基本规则。

Antisamy项目使用

项目的使用并不复杂,下面给出一个最简单的思路

//定义过滤的策略
Policy policy = Policy.getInstance("file"); //此处的file指使用的策略文件,如antisamy-ebay.xml
//对html输入进行过滤
Antisamy antisamy = new Antisamy();
CleanResult cr = antisamy.scan(innerHtml,policy);
//输出过滤后安全的html或异常信息
String cleanHtml = cr.getCleanHTML();
String errMsg = cr.getErrorMessages();
  • 1

而在项目中的使用是这样的:

  • 定义一个filter
package com.vivi.test.xssfilter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;public class XssFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubSystem.out.println("enter xssFilter----------------------------");chain.doFilter(new XssRequestWrapper((HttpServletRequest) request),response);}public void destroy() {// TODO Auto-generated method stub}}
  • 1
  • 重写request
package com.vivi.test.xssfilter;import java.util.Iterator;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;import org.apache.log4j.Logger;
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;public class XssRequestWrapper extends HttpServletRequestWrapper {private static Policy policy = null;public static Logger logger = Logger.getLogger(XssRequestWrapper.class);static {try {policy = Policy.getInstance(XssRequestWrapper.class.getClassLoader().getResourceAsStream("antisamy-ebay.xml"));} catch (PolicyException e) {e.printStackTrace();}}public XssRequestWrapper(HttpServletRequest request) {super(request);}@SuppressWarnings("rawtypes")public Map<String, String[]> getParameterMap() {Map<String, String[]> request_map = super.getParameterMap();Iterator iterator = request_map.entrySet().iterator();System.out.println("request_map" + request_map.size());logger.debug("request_map" + request_map.size());while (iterator.hasNext()) {Map.Entry me = (Map.Entry) iterator.next();System.out.println(me.getKey() + ":");String[] values = (String[]) me.getValue();for (int i = 0; i < values.length; i++) {System.out.println(values[i]);logger.debug(values[i]);values[i] = xssClean(values[i]);}}return request_map;}public String[] getParameterValues(String paramString) {String[] arrayOfString1 = super.getParameterValues(paramString);if (arrayOfString1 == null)return null;int i = arrayOfString1.length;String[] arrayOfString2 = new String[i];for (int j = 0; j < i; j++)arrayOfString2[j] = xssClean(arrayOfString1[j]);return arrayOfString2;}public String getParameter(String paramString) {String str = super.getParameter(paramString);if (str == null)return null;return xssClean(str);}public String getHeader(String paramString) {String str = super.getHeader(paramString);if (str == null)return null;return xssClean(str);}private String xssClean(String value) {AntiSamy antiSamy = new AntiSamy();try {if (policy.equals(null)) {getPolicy();}final CleanResults cr = antiSamy.scan(value, policy);// 安全的HTML输出return cr.getCleanHTML();} catch (ScanException e) {e.printStackTrace();} catch (PolicyException e) {e.printStackTrace();}return value;}private void getPolicy() throws PolicyException {try {policy = Policy.getInstance(XssRequestWrapper.class.getClassLoader().getResourceAsStream("antisamy-ebay.xml"));} catch (PolicyException e) {e.printStackTrace();}}
}
  • 1

实际使用起来也特别方便。

时间所限,这是上篇,下篇写antisamy原理的简单解析。

XSS脚本攻击防御(Antisamy)相关推荐

  1. 安全编码实践之二:跨站点脚本攻击防御

    安全编码实践之二:跨站点脚本攻击防御 声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用. 文章来源:https://medium.com/bugbountywriteup/how-to-w ...

  2. vue 如何防止xss攻击 框架_LearningNotes-1/Vue/Vue中防止XSS脚本攻击 at master · axuu/LearningNotes-1 · GitHub...

    Vue中防止XSS脚本攻击 最近写了一个博客评论模块,因为引入了表情包,所以就将原来的v-text的形式,改成了v-html,也就是渲染html标签,但是这样不可不免的会带来问题,就是XSS跨站脚本攻 ...

  3. Java过滤XSS脚本攻击记录一下

    背景 之前公司信息安全部门对公司项目进行网络安全升级时,发现项目里可能会出现XSS脚本攻击漏洞,所以就需要对其参数进行过滤拦截. XSS 百度百科:XSS攻击全称:cross site scripti ...

  4. java 过滤脚本_【快学SpringBoot】过滤XSS脚本攻击(包括json格式)

    XSS攻击是什么 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安 ...

  5. XSS跨站脚本攻击防御和Cookie,及SSO单点登录原理

    XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...

  6. XSS及CSRF攻击防御

    一.概念: XSS攻击全称跨站脚本攻击(Cross Site Scripting); CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Clic ...

  7. 45-互联网安全架构-Web常用攻击手段之XSS脚本SQL注入攻击

    文章目录 1. 什么是XSS攻击&XSS攻击应用场景 2. XSS脚本攻击原理分析 3. 使用过滤器防御XSS攻击 4. 使用#传递参数防御SQL注入攻击 1. 什么是XSS攻击&XS ...

  8. 如何尽量规避XSS(跨站点脚本)攻击

    2019独角兽企业重金招聘Python工程师标准>>> 跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为XSS ...

  9. 网络安全——XSS跨站脚本攻击

    一.XSS概述 1.XSS被称为跨站脚本攻击,由于和CSS重名,所以改为XSS: 2.XSS主要基于JavaScript语言完成恶意的攻击行为,因为JavaScript可以非常灵活的操作html.CS ...

最新文章

  1. Java servlet项目里的web.xml
  2. 浅述几年建站SEO之路的失败与反思
  3. npp夜光数据介绍 viirs_优化的NPP夜光月度数据下载
  4. 汉诺塔python执行流程_hannoi塔(汉诺塔)移动过程解析
  5. 性能指标之速率、带宽、吞吐量
  6. 解决coding上的hexo博客访问不了的问题
  7. zookeeper 进入客户端_Zookeeper基础知识简单介绍
  8. 1.MySql驱动的jar包下载
  9. iGoogle创新设计大赛
  10. 活动报名 | 保护儿童,保护未来!智源发布《面向儿童的人工智能北京共识》
  11. 鲜有人知道的项目,各种邀请码偷偷做几个W
  12. 台式电脑计算机硬盘清理,台式机的硬盘不够用怎么办 解决台式机电脑硬盘
  13. 10G PON 进入到全面部署阶段
  14. Linux—shell—nohup命令使用
  15. MySQL学习笔记day2--DQL案例练习
  16. C51单片机程序注释与样例
  17. html蒙尘效果,vr看车.html
  18. get 到的html代码如何转码,爬虫网页转码逻辑
  19. .flo光流文件转换为png图片
  20. 使用CH340串口模块对STM32进行程序下载

热门文章

  1. 企业云办公最佳方案油塔企业云盘
  2. 三、histeq的原理和用法
  3. 软考中级到高级我都是怎么考的
  4. 网课-文献管理与信息分析-罗昭峰作业答案(二)
  5. [LeetCode]Number of Digit One,解题报告
  6. 从4方面解释,什么叫云原生应用?
  7. Alien Skin Eye Candy v7.x(眼睛糖果7)最新通用汉化补丁32/64位
  8. 蔡司影像,超越所见 巅峰旗舰vivo X80系列正式发布
  9. C语言冒泡法和选择排序法
  10. 如何修改rk3399 ddr初始化代码的波特率