https://www.youtube.com/playlist?list=PL-ymxv0nOtqqW1sDfN6UGUfJTcYqYH9CM
上次课主要介绍了微服务的概念以及相关技术。
微服务架构是一种分布式系统架构,将单一应用程序划分成一组小型服务,从各种角度独立部署和维护。每个服务运行在自己的进程中,服务之间通过轻量级机制进行通信,通常是通过HTTP资源API。
与传统单体应用相比,微服务架构的优点包括:
每个服务关注单一责任,独立开发和维护,能够快速交付和迭代;
根据服务前后依赖关系进行独立升级和扩缩容;
增强服务内聚性,降低耦合性;
不同服务可以使用不同的语言和开发框架;
每个服务都有自己的数据库,消除数据障碍。
常用的微服务技术包括Docker容器、Kubernetes集群管理、服务发现与负载均衡、API Gateway、分布式追踪等。
Spring Cloud是在Spring Boot基础上构建的微服务开发平台,它为开发者提供了在分布式环境中开发应用的工具,例如配置管理、服务发现、断路器、路由等常用模块化功能。这些功能以 SpringBoot的开发风格整合在一起,开发者可以充分利用这些功能来开发分布式系统。
Spring Boot是一个快速开发框架,目的是简化Spring应用的开发,内置Tomcat、Jetty等web容器,使用一些依赖和配置就可以快速构建一个独立运行的基于Spring的应用程序。所以开发微服务时采用Spring Boot可以快速构建出功能完整的微服务应用。
Spring Cloud提供的功能主要包括:
Spring Cloud通过这些功能,有效地实现服务治理、负载均衡、熔断保护等,大大简化了微服务应用开发的复杂度。
Docker是一个开源的应用容器引擎,能够很好地用于部署和调试应用程序。它提供了一个额外的抽象层,在操作系统的基础上运行容器化的应用程序。
Docker利用Linux的cgroup和namespace等技术,将软件运行在隔离的容器里,实现应用与环境的集装箱化。特点如下:
隔离:容器之间相互隔离,每个容器都有一套自己的内核空间,系统资源和进程
资源限制:容器可指定资源限额,防止一个容器影响其他容器
依赖管理:将应用及其所有依赖打包在一个容器中,实现移植性较强的应用交付和部署
快速启动与停止:容器的启动和停止速度比完整操作系统快很多
文件系统层面独立:容器之间文件系统独立,不会影响其他容器和宿主机
高可移植性:基于标准化操作接口,支持主流操作系统
常用Docker命令包括:docker build、docker run、docker stop、docker rm、docker ps等。Docker主要用于开发、测试与运维中部署微服务应用。
Kubernetes(k8s)是Google开源的容器集群管理系统。它可以自动处理容器调度、规划、部署、维护等任务。常用于生产环境中运行Docker容器并保证容器高可用。
Kubernetes有以下主要组成:
它相比Docker新增以下主要功能:
Kubernetes被广泛应用于微服务生产环境的集群化部署和管理。
软件的误用可能导致安全问题和法律后果。包括:
应慎用软件,确保符合其使用目的和法律规定。
在使用软件时应注意个人信息安全和隐私保护:
如无必要不要过多地分享个人信息,采取积极的安全态度保护自己的隐私。
在使用软件过程中应遵守相关知识产权法律:
尊重自由软件运动思想,使用软件应保护作者的合法权益。
在使用软件时应关注:
遵循软件使用许可协议,不得进行任何非法或未授权的使用方式
确保软件版本更新完整,及时安装补丁以提升安全性
不点击未知来源链接或下载可疑程序,防止系统被破解和入侵
使用防火墙和安全软件,定期进行系统扫描以清除潜在风险
创建强密码保护账号,不将隐私信息泄露给未知来源
不在公共场合使用个人硬件和账户登录软件
不随意打开附件或点击链接,防止恶意程序自动运行
理解并审慎同意软件要求的各种权限,减少信息泄露风险
正确使用可以提升安全性和用户体验。
在网络空间进行各种活动时,也需要遵守一些法律规范,主要包括:
网络安全法:保护网络空间和重要信息基础设施安全运行
网络个人信息保护法:规范网络个人信息收集与处理标准
反单位违法危害计算机信息系统行为法:禁止进行网络攻击等活动
反恐法:禁止传播极端思想和组织恐怖活动
知识产权法:规范版权、商标、专利等知识产权范围
反垄断法:禁止网络平台滥用市场支配地位
不理解法律规定会面临行政罚款或刑事处罚,在网络上也要守法。
HTTP(Hypertext Transfer Protocol)是万维网上应用最广泛的一种网络传输协议,基于请求-响应模型的状态less协议。
HTTP的主要特点和组成:
基于TCP/IP通信,Port 8080通常用于HTTP通信
无状态协议,每次请求独立,服务器不能保存客户端会话信息
使用URL定位网络资源,URI作为唯一标识
使用请求方法表明请求动作,比如GET、POST、PUT、DELETE
请求消息包含请求行、请求头部和请求正文三部分
响应消息包含状态行、响应头部和响应正文三部分
GET请求只获取资源,POST请求传输实体主体,PUT修改资源
HTTP为万维网数据传输提供了统一的接口,广泛应用于网页、API接口通信等场景。
HTTP状态码指示请求处理结果,主要分类:
2xx:请求成功,如200 OK
3xx:重定向,如301 Moved Permanently
4xx:客户端错误,如404 Not Found
5xx:服务器错误,如500 Internal Server Error
状态码紧贴响应消息头部,能清晰反馈请求结果。开发人员通过状态码可以判断是否发生错误需要追根究底。
常见状态码的细分和含义也很重要,方便了解请求的具体情况。状态码体现了HTTP协议的响应标准。
HTTP报文由开始行、消息头和消息体三部分组成:
开始行包含请求方法、请求资源URL和HTTP版本,格式为“请求方法 请求URL HTTP/1.1”
消息头使用键值对的形式记录各种信息,如Host、Content-Type等
消息体是请求的实体主体,在GET请求中为空,在POST请求中作为正文内容
一条HTTP请求示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
## 消息体为空
主要请求方法包括:
不同方法对应不同语义,如表单提交一般用POST而非GET。
常见响应状态码分类:
2xx:成功,如200 OK 3xx:重定向,如301 Moved Permanently 4xx:客户端错误,如404 Not Found 5xx:服务器错误,如500 Internal Server Error 1xx:信息性状态码
状态码明确告诉客户端请求结果,开发者可以通过判断状态码来进行后续处理。
汇编语言是一种低级编程语言,比机器语言更紧密地映射到特定处理器的指令集结构。
与高级编程语言相比,汇编语言具有更快的执行速度和更小的代码体积,但可读性更差。
汇编使用备用操作码名称和寻址模式表示机器指令,支持变量和符号,但无数据类型和高级结构概念。
常见汇编语言包括:x86汇编、ARM汇编、MIPS汇编等架构专用语言。
汇编指令通常包括:
指令操作数可以是寄存器、内存地址或常数。不同架构指令格式也有差异。
一个简单的Hello World程序汇编代码:
.data msg: .ascii “Hello World\n”
.text mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 0x80
mov eax, 0 int 0x80
len: .long 0x0b
含义为输出字符串到标准输出并返回0。
汇编语言的数据类型包括:
以上数据类型可以作为操作数传递给指令。
寻址模式决定操作数的有效地址,常见模式包括:
不同模式会影响指令效率。模式选择取决于代码性能需求。
常见汇编程序结构:
结合数据类型和寻址模式进行组合开发程序。
汇编程序调试需要的工具包括:
常见调试操作包括:
使用调试器可以观察程序运行状态、定位Bug问题。
汇编函数调用方式与 asm语言其他程序结构相同,主要特征:
举例一个简单参数求和函数的实现。
函数编程是汇编的重要应用,可以封装公用功能供主程序调用。
汇编与C语言可以通过以下方式进行交互:
两者通过这种集成可以相互呼应,完成功能模块定制。
NASM是常见的X86汇编器之一,它支持Intel和AT&T风格语法。
NASM语法包含:
NASM可以用于Linux、DOS和Windows平台。语法简洁灵活使其成为流行汇编器。
通过NASM汇编程序后可以得到目标文件,进一步链接成可执行文件。
网络编程常用的传输层协议有TCP和UDP。
基于TCP协议开发网络应用常见步骤:
一个基本的HTTP文件服务器可以实现以下功能:
以C语言实现一套 TCP网络库,基于此开发一个简易静态文件HTTP服务器。
该程序将成为网络应用的基础,了解TCP编程机制。
HTTP响应报文包括三个必要部分:
格式:HTTP版本 状态码 状态消息 例如:HTTP/1.1 200 OK
通过键值对形势携带元数据,常见字段: Content-Type: text/html Content-Length: 123
包含请求资源的具体内容,如HTML文档内容
状态码决定了请求是否成功,内容类型决定了资源格式。
头部和状态提供了关键的请求语义信息。
具体实现步骤:
接受客户端连接
解析请求行获取请求方法和目标文件路径
拼接文件路径并打开文件
设置200状态行和Content-Type头
读取文件内容构建消息体
构建完整的HTTP响应报文
响应报文发送给客户端
关闭文件并socket
循环监听下个请求
能够解析HTTP报文并提供简单的文件服务功能。
为提高文件服务器效率,需要考虑以下优化方案:
定长的HTTP/1.1连接可以处理多个请求。
利用多进程或线程同时处理多个客户端连接请求。
读写文件使用缓冲区可以提高效率。
为js、css和图片等设置正确的Content-Type。
处理文件未找到等常见错误,给出标准格式报文返回。
过滤特殊字符避免路径注入等安全隐患。
访问日志分析可以了解服务器状态和热点资源。
采用这些技术可以让小型文件服务器也能满足基本需求。
利用Common Gateway Interface(CGI)接口,可以提供动态生成的页面内容:
CGI程序运行在单独的进程中。
服务器接收并解析POST或GET请求。
以环境变量的形式传递请求信息给CGI程序。
CGI程序处理逻辑并输出HTTP响应。
服务器返回CGI输出内容给客户端。
例如用CGI编写简单搜索页,实现服务器内可配置的动态功能。
相对于HTTP/1.0,HTTP/1.1协议定义了以下重要改进:
支持通过Connection头确定持久连接,默认Keep-Alive
GET和POST请求可以包含消息体
支持Http状态码100表示继续处理请求
定义了更丰富的状态码如307暂时重定向
支持内容协商机制根据客户端请求选择响应版本
引入了包含表情和条件请求能力
扩展了缓存验证机制提升效率
实施HTTP/1.1可以支持更多类型的请求和响应语义。
为减小响应体积,可以对静态资源采取以下压缩措施:
GZIP压缩:服务器使用gzip对html/css/js等进行压缩传输
Brotli压缩:新一代更高效的网页压缩算法
图片优化:采用无损JPG或WebP格式,减小尺寸压缩图片
批处理CSS和JS:合并多个小文件,减少HTTP请求次数
CDN加速内容分发:通过CDN边缘节点提供近距离访问
合理利用上述静态资源优化技术,可以有效提升页面加载速度和用户体验。
监测网络请求可以采用以下方法:
代理服务器:配置系统代理,全部流量通过代理服务器转发。
监视套接字:使用抓包工具监听套接字,获取往来报文内容。
拦截连接:通过HOOK相关系统调用截取建立连接的流量。
运行时注入:在程序运行时使用LD_PRELOADHOOK相关函数。
驱动程序截获:开发网卡驱动程序捕获网卡数据包。
以上方法都需要 Root权限或程序调整支持。目的在于观察网络行为和程序调用过程。
由于HTTPS采用TLS加密传输,单纯监听网络无法解密内容。可以采取以下措施:
抓包代理:设置系统代理,抓包软件作为中间人解密截取流量。
证书干预:使用自签名根证书替换系统证书,中间人攻击解密HTTPS。
CRL项改写:篡改CRL执行中间人攻击以解密HTTPS请求响应。
lib抓包:HOOK libcurl等函数劫持SSL连接进行解密和重写。
但这些方法都可能被现代浏览器识别出安全问题拒绝连接。
在Linux系统中,可以使用tcpdump命令实时捕获网络报文:
tcpdump是一个命令行工具,直接运行即可实时打印出所有的报文
支持抓取特定接口的报文,如tcpdump eth0
可以通过过滤表达式过滤出指定协议或地址的报文
抓包结果可以导出为pcap文件格式,使用Wireshark进行分析
抓包需要ROOT或CAP_NET_RAW权限支持
tcpdump通过抓包核心可以实时的分析所有网络流量,不需要程序支持。
跟踪单个进程的系统调用可以使用strace工具:
以追踪模式运行目标程序,如strace ./a.out
打印出目标进程所有的系统调用记录
可过滤指定系统调用 verbose 选项
调试程序找出非常见的系统调用
分析程序的IO、网络和文件访问行为
需要DEBUG_SYSCALL or CAP_SYS_PTRACE权限
strace是调试和分析程序行为的有效方式之一。
使用库钩子技术可以在程序调用标准库函数时插入自定义代码:
LD_PRELOAD将动态链接器置为可控路径
写钩子函数实现相同接口签名如open()
基础库函数在内部进行函数劫持调用钩子函数
钩子函数可以打印参数、修改返回值等
需要重新编译静态链接即可注入任意程序
这种方式无需程序支持,但会降低性能。
可以通过ptrace系统调用完成进程跟踪并劫持其系统调用:
PTRACE_ATTACH附着被调试进程PT_CONT继续执行
使用PT_GETREGS收集当前上下文寄存器状态
PTRACE_POKETEXT修改SYSCALL指令劫持特定调用
PTRACE_SYSCALL单步跟踪到期待系统调用后截获
分析系统调用参数并选择继续或中断执行
这种方式可以针对关键系统调用进行 mehr深入监控和修改。
使用LD_PRELOAD技术Hook共享库函数的具体步骤:
定义钩子函数,函数签名与原函数相同
使用LD_PRELOAD环境变量 指定注入的共享库
在钩子函数中打印调用信息或修改逻辑
重新编译生成共享库,.so文件设置rpath
运行目标程序,原函数调用将进入钩子
这种方法无须程序源代码,适用于黑箱测试。
也可以使用ptrace系统调用注入打桩代码实现Hook:
得到目标进程PID并attach
解析动态 linking信息获取函数地址
修改text区代入打桩指令
设置断点恢复执行单步跟踪
到达打桩处获取调用信息
继续执行或中断追踪进程
这种注入方式更低级且需要调试目标进程。
两种方式都可以实现函数Hook动态捕获程序行为。
IDA是广泛使用的反汇编器,主要功能:
支持多种平台可执行文件类型分析
反汇编机器码还原汇编指令
动态分析反脱壳隐藏代码区域
自动识别常用代码结构如函数、跳转等
交互式反汇编界面修改程序流程图
提供汇编语法高亮和调试支持
脚本化API可以自动化反汇编任务
IDA能深入解析程序内部机制,是后端安全工作的重要工具。
GDB是GNU项目开发的通用调试器,支持C/C++程序调试:
附着目标进程对其进行调试分析
设置/清除断点控制执行流程
查看程序底层信息如寄存器、内存等
单步/续行执行程序追踪代码流
查看源代码打印变量信息
插件机制扩展新功能如隐藏断点
交互与 скрипτ化界面丰富使用场景
GDB能够低层级调试程序运行情况和异常。
对称加密使用同一个密钥进行加密和解密,常见算法有:
DES:早期标准算法,密钥长度56位,不再安全
AES:当前国际标准算法,密钥长度可以是128/192/256位
3DES:DES的加强版,使用168位密钥
Blowfish:块密码,速度快但不再活跃
对称加密适用于关键数据保密传输,需要彼此信任的情况下共享密钥。
非对称加密使用不同密钥进行加密和解密,常见算法有:
RSA:目前使用最广泛的算法,基于大数分解问题
DSA:数字签名算法所使用的算法
ElGamal:和RSA类似但是基于离散对数问题
非对称加密解决了密钥分发问题,适用于 open 环境的数字签名和密钥交换。
区分了公钥和私钥,公钥用于加密私钥用于解密。
数字签名用于验证信息的完整性和发起者身份。
使用发送方的私钥进行数字签名
接收方使用公钥验证签名是否正确
只有发送方持有私钥才能生成此签名
常用数字签名算法包括:
DSA:数字签名标准,基于离散对数问题
ECDSA:椭圆曲线数字签名算法,相对DSA更短更高效
RSA:基于RSA算法的数字签名实现
数字签名解决了非对称加密中身份识别的问题。
数字证书由证书颁发机构(CA)签发,用于在openssl环境下验证用户身份。
证书包含主体公钥和其他识别信息的数字签名
Web服务器申请自签名证书或由第三方CA签发证书
客户端使用CA公钥验证证书签名的正确性
验证通过则信任该证书持有者的身份
数字证书验证HTTPS网站的身份,构建头尾一致的认证链机制。
XSS攻击利用Web页面动态更新机制注入 malicious代码
攻击者令受害者点击poisoned页面或链接嵌入XSS payload
受害者浏览器执行攻击代码,可窃取sessionid或其他敏感数据
防范措施:
过滤或编码用户输入内容降低攻击机会
CSP内容安全策略限制脚本来源避免被利用
定期维护补丁避免被已知漏洞利用
注入攻击利用不当输入验证漏洞执行技术命令
SQL注入通过修改SQL语句导致非法访问数据库
命令注入利用网站对技术命令的解释执行系统命令
防范措施:
对所有输入进行严格过滤验证合法性
使用prepared语句或 ORM框架参数化查询
限制程序对命令执行的访问权限
正确处理用户输入,避免泄露系统访问能力,是防御注入的关键。
反盗链解决他人未授权使用自己网站资源的问题。
Nginx使用Referer拦截非法请求:
if ($http_referer !~ ^(https?://)?(.+\.)?mydomain\.com(/.*)?$) {
return 403;
}
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpe?g|gif|bmp|png|ico|wav|mov|mp3)$ - [F]
CSRF利用用户登录状态在第三方网站自动发起请求
表单加入CSRF Token难以伪造,每个请求必须提供正确Token
Token存储在Session中或HTTP Only Cookie防篡改
GET请求不修改状态不受影响,POST需要判断Token合法性
一些API如漏洞扫描平台提供无损接口避免干扰
正确处理状态改变请求和使用CSRF Token是重要的防御措施。
会话识别sessionId存储在Cookie中或URL参数传输
Id必须难以预测以防止被窃取
Id存储在HTTP Only Cookie不可访问墻JS降低风险
Id有效期设定较短如半小时避免长期攻击
使用橡胶唧唧误实现会话同源策略限制请求源
定期增强Id反转义机制增加攻击难度
良好的会话管理设计能有效防御会话劫持攻击。
对所有输入类型如files dns执行格式和内容检查
过滤特殊字符如注释符空格报警而非直截除去
长度限制和数据类型检查预防溢出攻击
动态正则校验输入结构合法性
NoSQL注入需考虑特别字符如$。与括号
严格的输入标准化过滤可以杜绝大部分注入风险。