首页 > 其他分享 >一起来找bug茬-01

一起来找bug茬-01

时间:2024-07-05 10:43:23浏览次数:14  
标签:起来 01 String value public replaceAll iframe amp bug


/**
 * @description 对HttpServletRequest 请求的数据进行转义,防止xss攻击
 * URL: home.html?mothod=space&pid=335511
 */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

  private byte[] body;

  public XssHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
    super(request);

    String method = request.getMethod();
    String pathInfo = request.getPathInfo();
    String contentType = request.getContentType();
    // 由于request并没有提供现成的获取json字符串的方法,所以我们需要将body中的流转为字符串
    BufferedReader reader = request.getReader();
    StringBuilder stringBuilder = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      stringBuilder.append(line);
    }
    String json = stringBuilder.toString();
    if ((HttpMethod.POST.equalsIgnoreCase(method) ||
      HttpMethod.PUT.equalsIgnoreCase(method)) && StrUtil.isNotEmpty(contentType) && contentType.contains(
      MediaType.APPLICATION_JSON_VALUE)) {
      json = HtmlUtil.cleanHtmlTag(json);
      json = json.replaceAll("iframe.*iframe","").replaceAll("javascript.*\\)","").replaceAll("alert","");
      body = json.getBytes();
    }
  }

  /**
   * 重写getParameter方法,用HtmlUtil转义后再返回
   */
  @Override
  public String getParameter(String name) {
    String value= super.getParameter(name);
    if(!StrUtil.hasEmpty(value)){
//      value= HtmlUtil.filter(value);
      value = value.replaceAll("<iframe.*iframe>","").replaceAll("iframe.*iframe","").replaceAll("javascript.*\\)","").replaceAll("alert","");
    }
    return value;
  }


  public static void main(String[] args) {
    String address = "<p>fegreef&lt;iframe+src=javascript:&amp;#37;&amp;#53;&amp8#67;&amp;#117;&amp;#48;&amp;#48;&amp8#54;&amp;#49;&amp;#37;&amp;#53;&amp;#67;&amp;#117;&amp;#48;&amp;#48;&amp;#54;&amp;#67;&amp;#378&amp;#53;&amp;#67;&amp;#117;&amp;#48;&amp;#48;&amp;#54;&amp;#53;&amp;#37;&amp;#53;&amp;#67;&amp;#11F;&amp8#48;&amp;#48;&amp;#55;&amp;#50;&amp;#37;&amp;#53;&amp;#67;&amp;#117;&amp;#48;&amp;#48;&amp;#55;&amp;#52;(88888)&gt;&1t;/iframe&gt;e</p>alert909090></p>";

    String b = "<iframe src=//a.com></iframe>";

    System.out.println(b.replaceAll("iframe.*iframe","").replaceAll("javascript.*\\)","").replaceAll("alert.*",""));

  }

  /**
   * 重写getParameterValues方法,
   * 遍历每一个值,用HtmlUtil转义后再返回
   */
  @Override
  public String[] getParameterValues(String name) {
    String[] values= super.getParameterValues(name);
    if(values!=null){
      for (int i=0;i<values.length;i++){
        String value=values[i];
        if(!StrUtil.hasEmpty(value)){
//          value= HtmlUtil.filter(value);
          value = value.replaceAll("<iframe.*iframe>","").replaceAll("iframe.*iframe","").replaceAll("javascript.*\\)","").replaceAll("alert","");
        }
        values[i]=value;
      }
    }
    return values;
  }

  /**
   * 重写getParameterMap方法,
   * 拿到所有的k-v键值对,用LinkedHashMap接收,
   * key不变,value用HtmlUtil转义后再返回
   */
  @Override
  public Map<String, String[]> getParameterMap() {
    Map<String, String[]> parameters = super.getParameterMap();
    LinkedHashMap<String, String[]> map=new LinkedHashMap();
    if(parameters!=null){
      for (String key:parameters.keySet()){
        String[] values=parameters.get(key);
        for (int i = 0; i < values.length; i++) {
          String value = values[i];
          if (!StrUtil.hasEmpty(value)) {
//            value = HtmlUtil.filter(value);
            value = value.replaceAll("<iframe.*iframe>","").replaceAll("iframe.*iframe","").replaceAll("javascript.*\\)","").replaceAll("alert","");
          }
          values[i] = value;
        }
        map.put(key,values);
      }
    }
    return map;
  }

  /**
   * 重写getHeader方法,用HtmlUtil转义后再返回
   */
  @Override
  public String getHeader(String name) {
    String value= super.getHeader(name);
    if (!StrUtil.hasEmpty(value)) {
      value = HtmlUtil.filter(value);
    }
    return value;
  }

  @Override
  public ServletInputStream getInputStream(){
    if (body != null && body.length > 0) {
      final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
      //匿名内部类,只需要重写read方法,把转义后的值,创建成ServletInputStream对象
      return new ServletInputStream() {
        @Override
        public boolean isFinished() {
          return byteArrayInputStream.available() == 0;
        }

        @Override
        public boolean isReady() {
          return true;
        }

        @Override
        public void setReadListener(ReadListener readListener) {

        }

        @Override
        public int read() throws IOException {
          return byteArrayInputStream.read();
        }
      };
    } else {
        try {
            return super.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
  }
    @Override
    public BufferedReader getReader(){
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
}

标签:起来,01,String,value,public,replaceAll,iframe,amp,bug
From: https://www.cnblogs.com/bigorang/p/18285313

相关文章

  • China.NETConf2019 - 用ASP.NETCore构建可检测的高可用服务
    一、前言2019中国.NET开发者峰会(.NETConfChina2019)于2019年11月10日完美谢幕,校宝在线作为星牌赞助给予了峰会大力支持,我和项斌等一行十位同事以讲师、志愿者的身份公司参与到峰会的支持工作中,我自己很荣幸能够作为讲师与大家交流,分享了主题《用ASP.NETCore构建可检测的高......
  • Microsoft SQL Server 2012 中常用的 Transact-SQL 命令示例,涵盖了数据库管理和查询操
    MicrosoftSQLServer2012中常用的Transact-SQL命令示例,涵盖了数据库管理和查询操作:创建数据库sqlCopyCodeCREATEDATABASEYourDatabaseName;删除数据库sqlCopyCodeDROPDATABASEYourDatabaseName;创建表sqlCopyCodeCREATETABLEEmployees(EmployeeIDIN......
  • 在 Microsoft SQL Server 2012 中,可以使用 sqlcmd 命令行工具来执行 Transact-SQL 脚
    sqlcmd实用工具-SQLServer|MicrosoftLearn在MicrosoftSQLServer2012中,可以使用sqlcmd命令行工具来执行Transact-SQL脚本和命令。这个工具提供了一种在命令行下管理和操作SQLServer的便捷方式。以下是一些sqlcmd命令的实例用法:连接到SQLServer实例bashC......
  • Bug记录|vivia主题|Hexo+GitHub搭建个人博客
    1.将本地SSH添加到远程github 中,之后关联远程或push出现以下错误:fatal:Notagitrepository(oranyoftheparentdirectories):.git解决方案:执行 gitinit。gitinit2.hexog无法成功运行,出现以下错误:TypeError:C:\Users\Maxence\Desktop\项目\MyBlog\Hexo......
  • 量化界狠人,离职前埋了700处bug,公司惨亏近千万
    前段时间看了一部大火的台湾电影《周处除三害》,快结尾的时候有这么一个片段,就是陈桂林在灵修礼堂里面,将执迷不悔的邪教信徒们一个个爆头干掉,让人看得热血沸腾,直呼过瘾,着实一狠人也。这不禁也让我联想起之前看到过的一宗与量化相关的台湾刑事案件,有两个宽客不满公司未按承诺发......
  • [题解]P1083 [NOIP2012 提高组] 借教室
    [题解]P1083[NOIP2012提高组]借教室解法\(1\):线段树-\(O((n+m)\logn)\)比较直观的一种做法,但是可能需要卡一下输入(这里没卡也过了,但要注意输入是\(10^6\)级的,为了保险一定要加)。#include<bits/stdc++.h>#definelc(x<<1)#definerc((x<<1)|1)#defineintlonglong......
  • 5分钟教你用AI把老照片动起来,别再去花49块9的冤枉钱了
    文章目录需要的工具最近,AI视频在各大平台上,又火了。只是火的形式,变成了将老照片动起来,打情感牌,或者做很多经典电视剧的再整活。直接把可灵的生成时间,从以前的4分钟,生生的干成了20分钟。火的原因,一方面是因为快手可灵的图生视频正式上线,给大家提供了一个工具的......
  • Python酷库之旅-第三方库Pandas(001)
    目录一、Pandas库的由来1、背景与起源1-1、开发背景1-2、起源时间2、名称由来3、发展历程4、功能与特点4-1、数据结构4-2、数据处理能力5、影响与地位5-1、数据分析“三剑客”之一5-2、社区支持二、Pandas库的应用场景1、数据分析2、数据清洗3、数据可视化4、......
  • 比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现
    比赛获奖的武林秘籍:01如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象?正文目前现状对于大部分的比赛小白来说,对当前比赛的现状恐怕还不太了解。通过我打比赛这么些年的经验来看,关于目前比赛中存在的“卷”现象,确实有一些情况值得关注。比如说,有些同学会选择......
  • C语言程序是怎么在计算机中运行起来的
    hello.c#include<stdio.h>intmain(){ printf("hello,world\n"); return0;}这段C语言程序的代码能被编程人员读懂,但是计算机系统读不懂。C语言、C++、java这些高级编程语言本质上还是人类用的语言而不是计算机用的语言。为了能在计算机上运行这个C语言程序,需......