网络安全学习(3):DHCP
DHCP
DHCP具体在这里不会赘述,主要讲DHCP原理、部署、安全。
DHCP原理
可以称为DHCP租约过程,分为四个步骤
客户机发生DHCP Discovery(发现)广播包
客户机广播请求IP地址(包含客户机的MAC地址)
服务器响应DHCP Offer广播包
服务器响应提供IP地址(无子网掩码、网关等参数)
客户机发送DHCP Request广播包
客户机选择IP(也可认为确认使用哪个IP)
发送DHCP ACK(确认)广播包
服务器确定租约,并提供网卡详细参数IP、掩码、网关、DNS、租期等
DHCP续约
当50%过后,客户机会再次发送DHCP Request包进行续约;
若服务器未响应,则会继续使用且在87.5%再次发送进行续约,如果仍然无响应,则释放IP地址,重新进行DHCP租约过程获取IP地址。
当无任何服务器响应时,会自动给自己分配一个169.254.x.x/16(无效IP地址)。
部署DHCP服务器
使用的服务器版本:Windows Server 2022
首先我们打开设置,找到应用,选择程序与功能(相关设置)
我们选择启用或关闭Windows功能 ...
渗透测试学习(2):在docker下搭建Kali-Linux环境
概述
先来谈谈这种方式的优缺点
优点:
可以不用运行额外的完整操作系统
可以直接在当前终端启动Kali,并使用其工具
缺点:
无法直接访问硬件,导致部分工具使用相当复杂
达到的效果:
过程概述:
从docker拉取kali-linux官方提供的映像kalilinux/kali-rolling;
构建一个容器,进入容器的shell,更新软件源,并下载kali linux的工具包;
基于我们作出更改的容器,创建新的映像,我们的映像中将包含更新和工具包;
对Kali内部分数据目录映射到Docker Volumes,每次使用完Kali后,都会自动删除容器,并利用我们镜像和Volumes随时重新创建;
编写启动脚本,并将其设置在环境变量中。
完整过程
拉取Kali Linux 的官方Docker映像
1docker pull kalilinux/kali-rolling
基于该映像构建一个容器,并进入shell
1docker run -ti kalilinux/kali-rolling
这时候我们开启的这个kali仅仅是一个骨架,不包含任何工具,此时我们要使用apt工具, ...
数据库系统概论复习
视频来自https://www.bilibili.com/video/BV1Bq4y1Y7GC
关系理论
函数依赖
函数依赖指的是X可以推导出Y,即Y依赖于X,记作X->Y
非平凡的函数依赖:X→Y,Y⊄X{X}\rightarrow{Y},{Y}\not\subset{X}X→Y,Y⊂X,在大多数情况下没有指明的函数依赖都是非平凡的函数依赖
平凡的函数依赖:X→Y,Y∈X{X}\rightarrow{Y},{Y}\in{X}X→Y,Y∈X,几乎没有什么作用,一般某个集合总能推导出其子集,即平凡的函数依赖
完全函数依赖:X→YX\rightarrow{Y}X→Y,并且对于X的任意真子集X',都有Y不依赖于X',则称之为完全函数依赖;
个人理解就是,当Y依赖于X时,仅有X本身可以推导出Y,X的任意部分都不能单独推导出Y
部分函数依赖:Y不完全函数依赖于X。即作X-P->Y(P在箭头上)。例如A→CA\rightarrow{C}A→C,又有AB→C{AB}\rightarrow{C}AB→C,那么C就是部分依赖于AB。
这种情况会导致数据冗余,因为A本身就可以推导出C, ...
go-zero框架学习笔记(1):环境配置
Goctl安装
goctl是go-zero框架下的代码生成工具。其功能有:
api服务生成
rpc服务生成
model代码生成
模板管理
go get 安装goctl
12345# Go 1.15 及之前版本GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl@latest# Go 1.16 及以后版本GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
通过此方式安装,会自动安装在$GOPATH/bin,如果忘了自己的$GOPATH在什么地方,可以通过
1go env
查找到对应的目录。
添加到环境参数
若原先设定过$GOPATH,应该是不需要这一步。由于我是通过pacman安装的Go,因此没有设定过。
以我本人所用的zsh终端举例,使用任意文本编辑工具(vim、vi)打开~/.zshrc,添加如下一行 ...
golang基础笔记(11):泛型
泛型
在Go 1.18版本中,添加了对泛型的支持。泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型,便利了代码的编写。
泛型的作用
假设我们有一个调换int参数的函数,现在我们需要一个调换float参数的函数,没有泛型时,我们需要将相同的逻辑、不同的类型参数的函数重复多遍。
1234567func excInt(a, b int) (int, int) { return b, a}func excFloat(a, b float32) (float32, float32) { return b, a}
但那是有了泛型,就可以很方便的编写出适用所有元素类型的“普适版”的函数
123func exchange[T any](a, b T) (T, T) { return b, a}
泛型语法
泛型为Go语言添加了三个新的重要特性:
函数和类型的类型参数。
将接口类型定义为类型集,包括没有方法的类型。
类型推断,它允许在调用函数时在许多情况下省略类型参数。
这里我们着重讲 ...
golang基础笔记(10):反射
反射介绍
反射指的是再程序运行期间对程序本身进行访问和修改的能力。
Go程序在运行期间使用reflect包访问程序的反射信息,包括字段名称、类型信息、结构体信息等。
一个具体的例子是,空接口可以存储任意类型的变量,那我们如何知道这个空接口保存的数据是什么呢? 反射就是在运行时动态的获取一个变量的类型信息和值信息。
golang基础笔记(9):Error接口
Error接口
Go语言不支持其他语言使用try/catch方式捕获处理错误,而是将错误作为一种特殊的值来处理。
Go语言使用了一个名为 error 接口来表示错误类型
123type error interface { Error() string}
当一个函数或方法需要返回错误时,我们通常是把错误作为最后一个返回值。例如下面标准库 os 中打开文件的函数
123func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0)}
errors.New
创建错误的最简单的方式就用errors.New()函数来创建一个错误
123456func queryById(id int64) (*Info, error) { if id <= 0 { return nil, errors.New("无效的id") } //...}
它接收一个字符串参数返回包含该字符串的错误。
fmt.Error ...
golang基础笔记(8):接口
接口
在Go语言中接口是一种类型,一种抽象的类型。Go语言的接口有别于具体类型的概念,无论是基础数据类型,还是结构体,它类似于一种协议,而不是具体内容。
我简单的理解概括:
只要A实现了B接口里的所有方法,则代表A就是B接口类型的具体实现(不需要显示表示出A、B关系),继而可以使用多态的方式,通过B接口类型去使用A对应的方法。
接口定义
每个接口类型由一个或者多个方法签名组成
12345type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …}
其中
接口类型名一般以er作结尾,体现出接口的具体含义
方法名首字母一般为大写
参数列表和返回值列表中的参数变量名可以省略
实现接口
前面提到,接口就是一种协议,只要实现了接口中的所有方法就是实现了这个接口。并不需要显式的表明谁实现了谁。举个例子
1234567891011type Sayer interface { Say()}type Cat struct{}//给Cat添加一个Say方法func (c ...
golang基础笔记(7):包
包与依赖管理
Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,例如我们之前频繁使用的fmt包等。
包 package
定义包
一个包可以简单的理解为一个存放.go文件的文件夹,其中该文件夹内所有.go文件都要在非注释的第一行添加声明,声明该文件归属的包
1package 包名
**注意:**一个文件夹内直接包含的文件只能归属于一个包,同一个包的文件不能在多个文件夹之下。
包名为main的包是go语言程序的入口包,编译后会得到一个可执行文件,非包含main包源代码编译则不会的到可执行文件。
包的引入
通过import关键字可以引入另外一个包的内容
1import importname "path/to/package"
其中
importname:命名引入的包在此处的名字,通常都省略。默认值为引入包的包名
path/to/package:引入包的路径名称,必须使用双引号包裹起来
Go语言中禁止循环导入包
...
golang实用技巧(1):option模式封装构造函数
文章思路来源:【优雅封装Go结构体构造函数】 https://www.bilibili.com/video/BV1ky4y1d7eT/?share_source=copy_web&vd_source=09bd1be8229f31f9b1fe4359ac7315ac
问题发掘
由于go语言中的函数是不支持重载的,导致我们不能直接去实现一个不同实现的构造函数。
例如我想去实现多个构造函数以实现我们在构造一个结构体实例时有多参数可选,如下我这样做是不被Go语言允许的:
1234567891011121314151617type User struct { Name string Id int Age int}func NewUser(name string) *User { return &User{Name: name}}func NewUser(name string, id, age int) *User { return &User{ Name: name, Id: id ...