范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Web安全头号大敌XSS漏洞解决最佳实践

  写在前面
  虽然今天是周末,但职位每日推荐不可少,万一有努力找工作的小伙伴因为我一天偷懒导致没找到满意工作那就是我的罪过了,今日职位已放置在文章末尾,请注意查看!
  引言
  XSS 是目前最普遍的 Web 应用安全漏洞,它带来的危害是巨大的,是 Web 安全的头号大敌。
  关键词: 跨站 脚本(JavaScript、Java、 VBScript、ActiveX、 Flash 或者 HTML) 注入 执行 1. 什么是 XSS 漏洞?
  XSS 攻击:跨站脚本攻击(Cross Site Scripting),为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆,故将跨站脚本攻击缩写为 XSS。
  XSS(跨站脚本攻击)是指恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。类似于 sql 注入。是目前最普遍的 Web 应用安全漏洞,也是 Web 攻击中最常见的攻击方式之一。
  XSS( 跨站脚本攻击)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。 2. XSS 漏洞攻击原理及攻击手段
  HTML 是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是 HTML 标签的开始,之间的字符是页面的标题等等。
  当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了 HTML 标签,当这些 HTML 标签引入了一段 JavaScript 脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生 XSS 漏洞。
  常用的 XSS 攻击手段和目的有:
  1、盗用 cookie,获取敏感信息。
  2、利用植入 Flash,通过 crossdomain 权限设置进一步获取更高权限;或者利用 Java 等得到类似的操作。
  3、利用 iframe、frame、XMLHttpRequest 或上述 Flash 等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
  4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
  5、在访问量极大的一些页面上的 XSS 可以攻击一些小型网站,实现 DDoS 攻击的效果。
  最简单的 XSS 示例:   3. XSS 分类如下:
  分类
  主要特点
  存储型 XSS
  经过后端服务处理,数据存储在数据库端
  反射型 XSS
  经过后端服务处理,不存储数据库
  DOM型 XSS
  不经过后端服务处理,不存储数据库
  4. XSS 漏洞分析
  4.1 存储型 XSS
  通过网页注入的代码最终会存储在数据库或其他物理文件中,在某个页面中注入的代码会被浏览器成功执行,该类型的漏洞存在持久性的特点。
  主要特点: 存储 持久性
  图解成因分析:
  4.2 反射型 XSS
  一般是通过 url 的形式注入代码,注入的代码不在服务器端存储,但会在服务器端进行处理然后进行回显,在回显时浏览器会触发漏洞执行注入代码,该类型攻击具有临时性特点。
  主要特点: 回显 临时性
  图解成因分析
  4.3 DOM 型 XSS
  也是通过 url 的形式注入代码,注入的代码服务器端程序不存储、不处理,而是由浏览器进行处理,该类型攻击也具有临时性特点。主要特点: 不存储、不处理 浏览器 临时性
  图解成因分析
  5. 三种XSS漏洞对比
  分类
  一般表现形式
  特点
  存储型 XSS
  表现为包含表单的页面,post提交后数据存储在数据库,通过其他页面访问触发
  存储、持久性
  反射型XSS
  表现为包含参数的url地址,参数经后端程序程序处理后回显,通过访问 url 触发
  url参数、后端处理参数、临时性
  DOM型XSS
  表现为包含参数的url地址,参数由页面中的JS代码处理,通过访问 url 触发
  url参数、JS处理参数、临时性
  6. 植入 JS 代码攻击及危害分析
  外在表现形式: 直接注入 JavaScript 代码 引用外部 JS 文件
  基本实现原理: 通过 img 标签的 src 发送数据 构造表单诱导用户输入账密 构造隐藏的 form 表单自动提交 页面强制跳转 植入文字链接、图片链接
  潜在危害: 获取管理员或者其他用户 Cookie,冒充用户身份登录 构造表单诱导用户输入账号、密码,获取账密 跳转到其他网站,网站流量被窃取 植入广告、外链等 通过隐藏友链提升其他网站百度权重(SEO 黑帽)
  7. 植入 HTML 代码攻击及危害分析
  外在表现形式: 构造 img 标签 构造 a 标签 构造 iframe 构造其他 HTML 标签
  基本实现原理: 通过 img 标签的 src 发送数据 通过 img 的 onerror 触发脚本代码 通过 a 标签被动触发脚本代码 href/onclick 通过 iframe 引入第三方页面 直接构造文字链接或图片链接 style 属性嵌入脚本代码 background-image:url("javascript:…");(浏览器已可防范)
  潜在危害: 获取管理员或者其他用户 Cookie,冒充用户身份登录 构造表单诱导用户输入账号、密码,获取账密 植入广告、外链等 通过隐藏友链提升其他网站百度权重(SEO 黑帽)
  8. XSS 简单预防策略
  8.1 对 html 标签进行字符替换: replaceAll("

存在问题:

大小写问题

优化升级:

正则表达式

存在问题:

反替换

8.2 对 html 字符转义或是半角转全角字符:

{ "<", ">", """}
  转义:
  { "<", ">", """})
  全角:
  { " , " ", """}

新场景:

页面中需要根据某个参数生成文字链接

存在问题:

a 标签的 href 属性 javascript:

其他问题:

针对 json 字符串的场景

如何公用的问题

  

9. XSS 漏洞预防策略最佳实践

9.1 输入环节

  • 页面限制输入长度、特殊字符限制,后端代码限制输入长度、处理特殊字符
  • Filter 过滤器统一处理(自定义处理规则、使用 Apache Text、使用 Owasp AntiSamy)

9.2 Cookie 防护

  • cookie 设置 httponly,一般 servlet 容器默认 httponly 为 true
  • resp.setHeader("SET-COOKIE", "JSESSIONID=" + request.getSession().getId()+ "; HttpOnly");

9.3 X-Frame-Options 响应头 (是否允许frame、iframe等标记)

  • DENY 不允许、SAMEORIGIN 可在相同域名页面的 frame 中展示、ALLOW-FROM uri 可在指定页的 frame 中展示
  • add_header X-Frame-Options SAMEORIGIN; //在nginx的 http 或 server 节点中配置即可
  • 也可通过 Filter 设置 resp.setHeader("x-frame-options","SAMEORIGIN");

9.4 输出环节

  • OWASP ESAPI for Java
  • 显示时对字符进行转义处理,各种模板都有相关语法,注意标签的正确使用
  • 示例如下:

thymeleaf

--->
  

JSP

---> 

9.5 DOM 型 XSS

  • 避免 .innerHTML、.outerHTML、document.write() 的使用,应使用 .textContent、.setAttribute() 等。
  • Vue/React 技术栈,避免使用 v-html/dangerouslySetInnerHTML
  • 尤其注意 onclick、onerror、onload、onmouseover 、eval()、setTimeout()、setInterval() 以及 a 标签的 href
  • 可使用 OWASP esapi4js : esapi.js

  

10. 后端服务编码实践

通过 https://start.spring.io/ 快速创建 springboot 应用:

解压并在 IDEA 导入刚刚创建的 xss-demo 项目

在 pom.xml 添加相关依赖:


  
  org.owasp.antisamy
  antisamy
  1.5.7
  
  
  
  com.alibaba
  fastjson
  1.2.62
  

修改 xss-demo 工程包结构如下:

XSSFilter 编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:45
  **/
  public class XssFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  HttpServletRequest req = (HttpServletRequest) request;
  String path = req.getServletPath();
  //注解配置的是urlPatterns="/*"(过滤所有请求),所以这里对不需要过滤的静态资源url,作忽略处理(大家可以依照具体需求配置)
  String[] exclusionsUrls = {".js", ".gif", ".jpg", ".png", ".css", ".ico"};
  for (String str : exclusionsUrls) {
  if (path.contains(str)) {
  chain.doFilter(request, response);
  return;
  }
  }
  chain.doFilter(new XssRequestWrapper(httpServletRequest), response);
  }
  }

XssRequestWrapper 包装类编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:46
  **/
  @Slf4j
  public class XssRequestWrapper extends HttpServletRequestWrapper {
  public XssRequestWrapper(HttpServletRequest request) {
  super(request);
  }
  /**
  * 获取策略文件,直接使用jar中自带的ebay策略文件
  */
  private static InputStream inputStream = XssRequestWrapper.class.getClassLoader()
  .getResourceAsStream("antisamy-ebay.xml");
  private static Policy policy = null;
  static {
  try {
  // 使用静态代码块处理策略对象的创建
  policy = Policy.getInstance(inputStream);
  } catch (PolicyException e) {
  e.printStackTrace();
  }
  }
  /**
  * 使用AntiSamy进行过滤数据
  * @param html
  * @return
  */
  private String xssClean(String html) {
  String cleanHTML = "";
  try {
  AntiSamy antiSamy = new AntiSamy();
  CleanResults scan = antiSamy.scan(html, policy);
  cleanHTML = scan.getCleanHTML();
  } catch (ScanException e) {
  e.printStackTrace();
  } catch (PolicyException e) {
  e.printStackTrace();
  }
  return cleanHTML;
  }
  /**
  * 重写处理请求参数的方法
  * @param name
  * @return
  */
  @Override
  public String[] getParameterValues(String name) {
  String[] values = super.getParameterValues(name);
  // 判断参数有值,如果没有值,直接返回
  if (values == null) {
  return null;
  }
  // 遍历参数数组,使用AntiSamy进行过滤
  int len = values.length;
  String[] newValues = new String[len];
  for (int i = 0; i < len; i++) {
  // 过滤前的数据
  log.info("使用AntiSamy进行过滤清理,过滤清理之前的数据:{}", values[i]);
  // 进行过滤
  newValues[i] = xssClean(values[i]);
  // 过滤后的数据
  log.info("使用AntiSamy进行过滤清理,过滤清理之后的数据:{}", newValues[i]);
  }
  //返回过滤后的结果
  return newValues;
  }
  /**
  * 重写处理json数据的方法
  * @return
  * @throws IOException
  */
  @Override
  public ServletInputStream getInputStream() throws IOException {
  // 读取流
  BufferedReader reader = new BufferedReader(
  new InputStreamReader(super.getInputStream(), "UTF-8"));
  // 获取json格式的数据
  StringBuilder sb = new StringBuilder();
  String inputStr;
  while ((inputStr = reader.readLine()) != null) {
  sb.append(inputStr);
  }
  // 把json转为map
  Map map = JSON.parseObject(sb.toString(), Map.class);
  // 过滤前
  log.info("json过滤前:{}", sb.toString());
  // 对map中的value值进行AntiSamy的过滤
  map.keySet().forEach(k -> {
  map.put(k, xssClean(map.get(k).toString()));
  });
  // 过滤后
  String json = JSON.toJSONString(map);
  log.info("json过滤后:{}", json);
  // 把json数据转为流的格式进行返回
  ByteArrayInputStream bais = new ByteArrayInputStream(json.getBytes());
  return new ServletInputStream() {
  @Override
  public boolean isFinished() {
  return false;
  }
  @Override
  public boolean isReady() {
  return false;
  }
  @Override
  public void setReadListener(ReadListener listener) { }
  @Override
  public int read() throws IOException {
  return bais.read();
  }
  };
  }
  }

AntiSamyConfig 配置过滤器类编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:58
  **/
  @Configuration
  public class AntiSamyConfig {
  /**
  * 配置xss过滤器
  * @return
  */
  @Bean
  public FilterRegistrationBean create() {
  FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new XssFilter());
  filterRegistrationBean.addUrlPatterns("/*");
  filterRegistrationBean.setOrder(1);
  return filterRegistrationBean;
  }
  }

User 实体类:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:42
  **/
  @Data
  public class User {
  private int id;
  private String name;
  private int age;
  }

UserController 测试控制器类编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:43
  **/
  @Slf4j
  @RestController
  @RequestMapping("user")
  public class UserController {
  /**
  * 表单
  * @param user
  * @return
  */
  @PostMapping("save")
  public String save(User user) {
  log.info("name={}, age={}", user.getName(), user.getAge());
  return JSON.toJSONString(user);
  }
  /**
  * json数据格式请求体
  * @param user
  * @return
  */
  @PostMapping("json")
  public String saveJson(@RequestBody User user) {
  log.info("user={}", user.toString());
  return JSON.toJSONString(user);
  }
  }

application.properties 配置文件为空,运行启动类后默认端口号8080。

Postman 模拟表单数据请求及响应效果如下:

  

后端程序控制台日志打印如下:

Postman 模拟 json 数据请求及响应效果如下:

后端程序控制台日志打印如下:

以上两个情况,请求参数中隐藏的 xss 攻击代码被过滤器过滤后再进入 Contrlloer 层处理。

  

11. 能不能根本上解决问题,即浏览器自动禁止外部注入恶意脚本?

开启 CSP (内容安全策略 Content Security Policy)方法:设置 HTTP 的 头部字段

resp.setHeader("Content-Security-Policy","default-src http: https:");

设置网页的标签

CSP 常见可选策略设置如下:

策略

含义

default-src http: https: ;

只能通过外联的方式引用 js 和 css

default-src "self" http://smart4j.cn/;

只能在指定的域下加载文件(包含 img)

form-action "self"";

form 表单的只能在指定域提交

script-src "self";

只限制 js 文件在同域加载文件

report-uri /report;

向指定uri发送违规报告(不支持 meta 方式)

本文转载自码上修行

今日职位推荐:

前端开发主管

要求:

1. 本科及以上学历,软件技术、计算机科学与技术、电子工程等相关专业,5年及以上前端开发经验

2. 精通Vue/JQuery等JS框架,HTML/HTML5/CSS3/JavaScript,熟练使用uniapp

3. 具备浏览器开发调试技能,能分析解决问题

4. 掌握Web前端构建工具,能够运用构建工具

5. 具有基于VUE 低代码开发经验

办公地址:苏州市吴中区

薪资范围:20k-25k

投递方式:Freemen App中定位苏州搜索前端开发主管

  

  
  
  展开阅读全文   
  

投稿时间:2023-02-13最后更新:2023-03-20   

  标签:攻击者 大敌 表单 头号 过滤器 脚本 漏洞 恶意 策略 参数 代码 文件 网页   

  

  1   2   3   4   5   

  
红旗打响新能源价格战,EQM512。28万元起售,续航最高605km红旗品牌家喻户晓,旗下拥有多种类型的车,不断进行细分化的需求供应,提供给用户更好的家用车。红旗不仅有家用车,另外商务用车也十分霸气,比如老板们钟爱的红旗H9,大气的外观让整体车身气记者因凡蒂诺表示将办FIFA世界系列赛,4支不同大洲球队参赛直播吧12月16日讯据记者RobHarris报道,国际足联主席因凡蒂诺在新闻发布会中表示,国际足联正在酝酿由不同大洲的四支国家队参加的FIFA世界系列赛。因凡蒂诺出席新闻发布会,他中超最新积分战报上港国安齐赢球2黑马平局山东送广州队进降级区北京时间12月15日晚,2022赛季中超联赛第31轮进行了最后6场比赛的争夺。经过一番鏖战,成都蓉城11平浙江队,北京国安30大胜长春亚泰,沧州雄狮11绝平河南嵩山,山东泰山42击脑血管健康应该关注哪几个方面?来看看书里怎么说冬季往往是脑血管病的高发期,脑血管病的致死率和致残率都很高,所以我们应该提高对脑血管健康的重视。那么,除了控制血压注意保暖适当运动以及保持情绪稳定外,我们还可以从哪些方面进行脑血管阳了,经历分享前几天阳了,这才缓过来,把精力跟大家分享一下,希望我的经历对大家预防治疗带来一些帮助第一天,病的很突然,突然就开始发烧了,当天就烧到39度,浑身疼,感觉自己要晕死过去的感觉,吃了4血脂过高的人,腿脚往往会有4个异常,若全占,或许该及时就医高血脂是现代中老年人群中的普发性疾病之一,由于饮食习惯或是日常作息上的不合理行为,血脂过高以及血管健康问题,已经成为了危及老人生命安全的重大隐患。因此,如何科学防治高血脂,成为亟待为什么压力大时会长白头发?少白头是怎么回事?中国古话有云笑一笑,十年少愁一愁,白了头。经过众多科学研究人员的研究发现,超负荷的压力确实会催生白发的发生,一夜间冒出些白头发是存在的,当压力缓解后白头发有可能再恢复原状。有研究报老外疑惑这玩意我们恨不得天天吃,怎么中国人从不烹饪端上桌?有人说美食无国界,但世界这么大,美食那么多,生活在不同的自然环境和文化中的人,饮食习惯也有很大的不同,就像是南方人多爱吃米饭,北方人多爱吃面食。如果是不同国家,饮食习惯就差距更大了炒豆角时,记住不要直接下锅炒,教你一招,脆嫩入味,营养又下饭炒豆角时,记住不要直接下锅炒,教你一招,脆嫩入味,营养又下饭。豆角在日常生活中是特别常见的,因为豆角的口感比较好,吃起来比较嫩,而且是脆的,其蛋白质含量较一般蔬菜偏高,因此豆角也被BLACKPINK的水钻眼妆,是我画不起的样子?正值年末,除了各大颁奖礼之外,BLACKPINK的世界巡回演唱会也在如火如荼地进行中。每一位成员的状态都太好啦,编辑盯着四位美女的脸,不自觉地就被她们blingbling的眼妆吸引中年男人,远离油腻男,建议多穿具备户外功能性的运动服装目前互联网很火热的中年男人三宝钓鱼茅台始祖鸟,无论前面两宝换成谁,最后一宝永远都是始祖鸟。始祖鸟作为对标爱马仕的全球最顶级户外运动品牌,一直是全球户外爱好者心目中的NO。1。而中年
钟镇涛携妻现身活动,57岁范姜深V白裙身材玲珑,比章小蕙美太多女性在挑选连衣裙的时候,大多数都会非常看重元素的运用,其次就是整体配色的选择,只有这两个大方向选对了,那么,整体的造型才能够显得更加高级优雅,尤其是对于女明星来说,在出席各种重要场刘銮雄给十三姨的鸽子蛋,是这里面哪一件呢?头条创作挑战赛既然大家喜欢看关大美人的珠宝,上一篇说得不够齐全,这篇再补充一部分吧!关之琳去年过六十大寿,随手拿出自己私藏多年的一小部分珠宝,(注意,是一小部分。)进行拍卖,所得再超模ROMEESTRIJD(罗蜜史戴)是SEAFOLLY泳装的新面孔自1975年以来,Seafolly宣布RomeeStrijd将成为其夏季宣传活动的代言人。由业内最具影响力的摄影师之一吉尔斯本西蒙(GillesBensimon)拍摄,拍摄地点是黄十二星座最适合的穿衣风格有哪些?每个星座都有自己独一无二的气质,找对自己的穿衣风格会有容易展现出自己的个人气质,那么十二星座的气质与服装搭配如何呢?以下主要参考上升星座和太阳星座金星星座,上升星座和你的外在气质有开启时装设计REMAKE新征程MaisonMargielaFall2020ReadytoWear对于平日里关注时尚圈动向的时装爱好者来说,remake算不上什么新鲜事物,簇拥者众多的解构风格便属于remake的摊牌了?国产手机暴露优势,苹果担心的情况出现了自从华为遭遇以老美为首等西方国家的极限施压后,国内友商就彻底摒弃了买办观念,纷纷加大核心技术研发,走上自主化之路。尤其是智能手机领域,小米等国内厂商更是喊出了对标苹果的口号。事实上穿大衣时,一定不要再搭配平底鞋了,看看这些素人穿搭,美得高级优雅利落又极富质感的大衣是秋冬季节炙手可热的单品之一,不管各种搭配场合选择它都不用担心会出错,轻轻松松穿出不费力的高级感。但是要是想让大衣的搭配看起来更加精致时髦,那在鞋子的搭配方耐克签名鞋年终总结!JA1代太敷衍,AJ37有硬伤,LUKA1代很惊喜看完李宁的篮球鞋总结,这篇内容我们再看看耐克篮球鞋2022年的成绩,世界第一大运动品牌,表现如何呢?2022年,耐克发布更新了10双签名鞋,体量非常大,国产品牌难以企及。还有不计其公价5万多更加纤巧的40毫米沛纳海推荐腕表之家腕表品鉴作为硬汉风的代名词沛纳海(Panerai),旗下的潜水表一直是霸气型男的腕间标配。其中,早在1949年被品牌申请专利的Luminor(庐米诺),如今已成成为了旗下最这场雪地足球邀请赛,看看是谁夺冠原标题这场雪地足球邀请赛,看看是谁夺冠1月8日,由长春莲花山生态旅游度假区管委会与长春市足球协会联合主办的第三届莲花山雪地足球锦标赛暨2022年春城杯雪地足球邀请赛在长春冰雪新天地一文详解杜兰特膝伤伤情确诊预计伤停1个月6年3次遭误伤太倒霉北京时间1月10日,杜兰特的核磁检查结果出炉,篮网官方宣布杜兰特遭遇右膝内侧副韧带扭伤,2周后接受复查究竟杜兰特的伤势有多严重?名记woj透露预计杜兰特将休战一个月,篮网内部认为他