知识待整理

慢攻击(http)

对暴露的端口发起slowhttp攻击导致系统拒绝服务

*慢速攻击原理:*

http慢速攻击是利用http合法机制,在建立连接后,尽量长时间保持连接,不释放,达到对HTTP服务攻击,攻击者发送POST请求,自行构造报文向服务器提交数据,将报文长度设置一个很大的值,且在随后每次发送中,每次只发送一个很小的报文,这样导致服务器一直等待数据,连接始终一直被占用。

如果攻击者使用多线程或傀儡机子去做同样操作,服务器WEB容器很快就被占满TCP连接而不再接受新请求

解决办法:

1.使用NGINX,因为其本身就对慢速攻击有很好防护

2.tomcat可通过运行模式NIO和connectionTimeout值进行缓解

t-io

  • 依赖:tools : hutool

Undertow

  • 和netty都是JBoss开源的,JBoss被redhat收购了
  • undertow 架构类似于Jetty,采用应用内嵌的方式
  • 底层基于XNIO

MongoDB

like %query% : db.getCollection('HistoryTdRunData_2020_12').find({"regCode" :/ROSEA10045/})

like query% : db.getCollection('HistoryTdRunData_2020_12').find({"regCode" :/^ROSEA10045/})

= : db.getCollection('HistoryTdRunData_2020_12').find({"regCode" :"748865688ROSEA10045000000000})

//根据ObejctId进行时间范围查询
db.HistoryTdRunData_2021_04.find({
    deviceId: "f8670acb-c122-4512-af13-79b485d117a0",
    _id: ObjectId("60649c8046e0fb02648290d1")
});

db.HistoryTdRunData_2021_04.find({
    deviceId:"f8670acb-c122-4512-af13-79b485d117a0",
    _id:{
        '$gt': ObjectId('60649c800000000000000000'),
        '$lt': ObjectId('60649d800000000000000000')

    }
    
}).projection({})
   .sort({_id:-1})
   .limit(3)


db.HistoryTdRunData_2021_06.find({
    $or: [
        { regCode: "7488656883400BFRFP5000000000" ,
            deviceId: "b085a806-a347-4f2c-8989-916a08fd6c50"
            
        }
        // { regCode: "748865688VY0076S4J9000000000" },
        // ,{ deviceId: "b085a806-a347-4f2c-8989-916a08fd6c50"}
    ],updateDay:"2021-06-07"
});

管理工具NoSQLBooster

https://www.jianshu.com/p/60b666ce420d

  • 破解

    ## 安装工具
    npm install asar -g
    ## 进入app资源目录
    cd ~/AppData/Local/Programs/nosqlbooster4mongo/resources
    ## 解压抽取资源
    asar extract app.asar app
    ## 修改试用期时长
    修改 shared\lmCore.js 
    MAX_TRIAL_DAYS=3000
    并把 return MAX_TRIAL_DAYS < f ? MAX_TRIAL_DAYS : f 改成 return MAX_TRIAL_DAYS
    ## 重新打包
    asar pack app app.asar
    ## 重启看效果
    

synchronized & @transactional

// 原因在于事务的范围比synchronized范围大,当锁释放了才会提交事务,在这期间就有可能别的线程读取到任务去执行

正则表达式

先行断言(lookahead)和后行断言(lookbehind)

(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)

  • 代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern

(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)

  • 代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。

(?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)

  • 代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern

(?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)

  • 先行断言和后行断言某种程度上就好比使用if语句对匹配的字符前后做判断验证。

    • 理解成时机 先行代表正预测 ,后发代表 回顾
      * 正预测,这个很好理解,就是表示这个表达式是一种预测,预测接下来会发生的情况。最后,先行断言,意即提前确定。结合起来,就是:我断言,在我所在的位置后面,必然要出现我所表达的东西 xxx(?=预测会出现)
      * 后发回顾:可以理解成 从前到后匹配 在我所在的位置前面(已经遍历过的回溯)出现过(pattern) (?<=出现过)xxx
    • 正向=代表包含,负向 !表示不包含
    • 如同^代表开头,$代表结尾,\b代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为“零宽”。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。
  • @Test
       public void testSmsContent(){
           String content = "施耐迪尔机械设备销售有限公司下的型号为FFAFASCR60EPM,编号为xxxZSW838803,名称为deviceName的空压机,在2020-12-11 10:30:31时间左右,产生了排气温度预警的告警。" ;
           logger.error("return Params:{}", JSON.toJSONString(getParams(content),true));
       }
     
       private Map<String, Object> getParams(String content) {
           Map<String, Object> params = new HashMap<>();
           String regModel = "(?<=型号为)((?!,)\\S){1,50}(?=,)";
           String regDeviceNo = "(?<=编号为)((?!,)\\S){1,50}(?=,)";
           String regDeviceName = "(?<=名称为)\\S{1,50}(?=的空压机)";
           String regTime = "(?<=在)[\\d -:]{19}?";
           String regFaultName = "(?<=产生了)\\S{1,25}(?=的)";
           String regFaultType = "(?<=的)\\S{2}(?=。)";
           String regCompanyName = "^\\S{1,50}(?=下的)";
     
           params.put("no",  RegexUtil.find(content,regDeviceNo));
           params.put("modelName", RegexUtil.find(content,regModel));
           params.put("createTime",  RegexUtil.find(content,regTime));
           params.put("faultName",  RegexUtil.find(content,regFaultName));
           params.put("faultType", RegexUtil.find(content,regFaultType));
           params.put("deviceName", RegexUtil.find(content,regDeviceName));
           params.put("companyName", RegexUtil.find(content,regCompanyName));
           
           return params;
       }
    
  • 强密码

    /^(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$/  
    
    /* 这个看起来比较复杂,是一个js群里的人发的,一个十分巧妙的正则。不过,分解开来其实一点也不复杂,这是由五个零宽断言和一个负向零宽断言(负向表否定)组成。前五个分别是:
    
    必须是8位以上、
    必须出现数字、
    必须出现特殊符号(非字母数字下划数)、
    必须出现大写字母、
    必须出现小写字母。
    
    最后一个负向零宽断言是:不得出现换行。
    
    大家会发现每个断言都是以 .* 开头,那这个表示什么意思呢?
    
    	因为这些断言都是写在同一位置,而同一位置是不可能同时出现以上六种情况的。所以用 .* 来告诉表达式,这个断言之前可以有字符(意即这个断言可以出现在接下来的字符串任何位置)。
    	
    那么这条正则表达式有什么作用呢?有做过密码验证的同学马上就反应过来了,这可以用来做强密码验证。*/
    
    

术语

  • CDI

Java EE的上下文和依赖注入(Contexts and Dependency Injection for Java EE,CDI)

posted @ 2021-06-29 11:03  沉梦匠心  阅读(122)  评论(0)    收藏  举报