cs_notes

ASU CSE365 - Fall 2022

https://www.youtube.com/playlist?list=PL-ymxv0nOtqqW1sDfN6UGUfJTcYqYH9CM

1. CSE 365 - Connor - Live Session - 2022.08.23

1.1 回顾上次课内容

上次课主要介绍了微服务的概念以及相关技术。

微服务架构是一种分布式系统架构,将单一应用程序划分成一组小型服务,从各种角度独立部署和维护。每个服务运行在自己的进程中,服务之间通过轻量级机制进行通信,通常是通过HTTP资源API。

与传统单体应用相比,微服务架构的优点包括:

常用的微服务技术包括Docker容器、Kubernetes集群管理、服务发现与负载均衡、API Gateway、分布式追踪等。

1.2 Spring Cloud与Spring Boot

Spring Cloud是在Spring Boot基础上构建的微服务开发平台,它为开发者提供了在分布式环境中开发应用的工具,例如配置管理、服务发现、断路器、路由等常用模块化功能。这些功能以 SpringBoot的开发风格整合在一起,开发者可以充分利用这些功能来开发分布式系统。

Spring Boot是一个快速开发框架,目的是简化Spring应用的开发,内置Tomcat、Jetty等web容器,使用一些依赖和配置就可以快速构建一个独立运行的基于Spring的应用程序。所以开发微服务时采用Spring Boot可以快速构建出功能完整的微服务应用。

Spring Cloud提供的功能主要包括:

Spring Cloud通过这些功能,有效地实现服务治理、负载均衡、熔断保护等,大大简化了微服务应用开发的复杂度。

2. CSE 365 - Connor - Live Session - 2022.08.24

2.1 Docker

Docker是一个开源的应用容器引擎,能够很好地用于部署和调试应用程序。它提供了一个额外的抽象层,在操作系统的基础上运行容器化的应用程序。

Docker利用Linux的cgroup和namespace等技术,将软件运行在隔离的容器里,实现应用与环境的集装箱化。特点如下:

常用Docker命令包括:docker build、docker run、docker stop、docker rm、docker ps等。Docker主要用于开发、测试与运维中部署微服务应用。

2.2 Kubernetes

Kubernetes(k8s)是Google开源的容器集群管理系统。它可以自动处理容器调度、规划、部署、维护等任务。常用于生产环境中运行Docker容器并保证容器高可用。

Kubernetes有以下主要组成:

它相比Docker新增以下主要功能:

Kubernetes被广泛应用于微服务生产环境的集群化部署和管理。

3. Program Misuse - Connor - Live Session - 2022.08.29

3.1 软件的误用

软件的误用可能导致安全问题和法律后果。包括:

应慎用软件,确保符合其使用目的和法律规定。

3.2 个人信息与隐私

在使用软件时应注意个人信息安全和隐私保护:

如无必要不要过多地分享个人信息,采取积极的安全态度保护自己的隐私。

3.3 版权与知识产权

在使用软件过程中应遵守相关知识产权法律:

尊重自由软件运动思想,使用软件应保护作者的合法权益。

4. Program Misuse - Connor - Live Session - 2022.08.30

4.1 使用软件注意事项

在使用软件时应关注:

正确使用可以提升安全性和用户体验。

4.2 网络法律常识

在网络空间进行各种活动时,也需要遵守一些法律规范,主要包括:

不理解法律规定会面临行政罚款或刑事处罚,在网络上也要守法。

5. Talking HTTP - Connor - Live Session - 2022.09.01

5.1 HTTP简介

HTTP(Hypertext Transfer Protocol)是万维网上应用最广泛的一种网络传输协议,基于请求-响应模型的状态less协议。

HTTP的主要特点和组成:

HTTP为万维网数据传输提供了统一的接口,广泛应用于网页、API接口通信等场景。

5.2 HTTP状态码

HTTP状态码指示请求处理结果,主要分类:

2xx:请求成功,如200 OK

3xx:重定向,如301 Moved Permanently

4xx:客户端错误,如404 Not Found

5xx:服务器错误,如500 Internal Server Error

状态码紧贴响应消息头部,能清晰反馈请求结果。开发人员通过状态码可以判断是否发生错误需要追根究底。

常见状态码的细分和含义也很重要,方便了解请求的具体情况。状态码体现了HTTP协议的响应标准。

6. Talking HTTP - Connor - Live Session - 2022.09.12

6.1 HTTP报文格式

HTTP报文由开始行、消息头和消息体三部分组成:

一条HTTP请求示例:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html

## 消息体为空

6.2 HTTP请求方法

主要请求方法包括:

不同方法对应不同语义,如表单提交一般用POST而非GET。

6.3 HTTP响应状态码

常见响应状态码分类:

2xx:成功,如200 OK 3xx:重定向,如301 Moved Permanently 4xx:客户端错误,如404 Not Found 5xx:服务器错误,如500 Internal Server Error 1xx:信息性状态码

状态码明确告诉客户端请求结果,开发者可以通过判断状态码来进行后续处理。

7. Assembly Crash Course - Connor - Live Session - 2022.09.19

7.1 汇编语言简介

汇编语言是一种低级编程语言,比机器语言更紧密地映射到特定处理器的指令集结构。

与高级编程语言相比,汇编语言具有更快的执行速度和更小的代码体积,但可读性更差。

汇编使用备用操作码名称和寻址模式表示机器指令,支持变量和符号,但无数据类型和高级结构概念。

常见汇编语言包括:x86汇编、ARM汇编、MIPS汇编等架构专用语言。

7.2 汇编指令

汇编指令通常包括:

指令操作数可以是寄存器、内存地址或常数。不同架构指令格式也有差异。

7.3 汇编程序示例

一个简单的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。

8. Assembly Crash Course - Connor - Live Session - 2022.09.21

8.1 汇编数据类型

汇编语言的数据类型包括:

以上数据类型可以作为操作数传递给指令。

8.2 寻址模式

寻址模式决定操作数的有效地址,常见模式包括:

不同模式会影响指令效率。模式选择取决于代码性能需求。

8.3 汇编程序结构

常见汇编程序结构:

结合数据类型和寻址模式进行组合开发程序。

9. Assembly Crash Course - Connor - Live Session - 2022.09.26

9.1 汇编程序调试

汇编程序调试需要的工具包括:

常见调试操作包括:

使用调试器可以观察程序运行状态、定位Bug问题。

9.2 汇编函数

汇编函数调用方式与 asm语言其他程序结构相同,主要特征:

举例一个简单参数求和函数的实现。

函数编程是汇编的重要应用,可以封装公用功能供主程序调用。

10. Assembly Crash Course - Connor - Live Session - 2022.09.28

10.1 汇编与C交互

汇编与C语言可以通过以下方式进行交互:

两者通过这种集成可以相互呼应,完成功能模块定制。

10.2 NASM语法

NASM是常见的X86汇编器之一,它支持Intel和AT&T风格语法。

NASM语法包含:

NASM可以用于Linux、DOS和Windows平台。语法简洁灵活使其成为流行汇编器。

通过NASM汇编程序后可以得到目标文件,进一步链接成可执行文件。

11. Building a Web Server - Connor - Live Session - 2022.10.05

11.1 基于TCP的网络编程

网络编程常用的传输层协议有TCP和UDP。

基于TCP协议开发网络应用常见步骤:

  1. 创建套接字Socket
  2. 绑定IP和端口Bind
  3. 监听等待连接Listen
  4. 接受客户端连接Accept
  5. 读写数据Read/Write
  6. 关闭连接Close

11.2 简单web服务器

一个基本的HTTP文件服务器可以实现以下功能:

以C语言实现一套 TCP网络库,基于此开发一个简易静态文件HTTP服务器。

该程序将成为网络应用的基础,了解TCP编程机制。

12. Building a Web Server - Connor - Live Session - 2022.10.06

12.1 HTTP响应报文格式

HTTP响应报文包括三个必要部分:

  1. 状态行

格式:HTTP版本 状态码 状态消息 例如:HTTP/1.1 200 OK

  1. 响应头

通过键值对形势携带元数据,常见字段: Content-Type: text/html Content-Length: 123

  1. 消息体

包含请求资源的具体内容,如HTML文档内容

状态码决定了请求是否成功,内容类型决定了资源格式。

头部和状态提供了关键的请求语义信息。

12.2 文件服务器实现

具体实现步骤:

  1. 接受客户端连接

  2. 解析请求行获取请求方法和目标文件路径

  3. 拼接文件路径并打开文件

  4. 设置200状态行和Content-Type头

  5. 读取文件内容构建消息体

  6. 构建完整的HTTP响应报文

  7. 响应报文发送给客户端

  8. 关闭文件并socket

  9. 循环监听下个请求

能够解析HTTP报文并提供简单的文件服务功能。

13. Building a Web Server - Connor - Live Session - 2022.10.12

13.1 文件服务器优化

为提高文件服务器效率,需要考虑以下优化方案:

  1. 支持Keep-Alive连接

定长的HTTP/1.1连接可以处理多个请求。

  1. 并发处理

利用多进程或线程同时处理多个客户端连接请求。

  1. 缓冲 I/O

读写文件使用缓冲区可以提高效率。

  1. 支持静态资源类型

为js、css和图片等设置正确的Content-Type。

  1. 错误处理

处理文件未找到等常见错误,给出标准格式报文返回。

  1. 参数验证

过滤特殊字符避免路径注入等安全隐患。

  1. 日志记录

访问日志分析可以了解服务器状态和热点资源。

采用这些技术可以让小型文件服务器也能满足基本需求。

13.2 CGI与动态资源

利用Common Gateway Interface(CGI)接口,可以提供动态生成的页面内容:

  1. CGI程序运行在单独的进程中。

  2. 服务器接收并解析POST或GET请求。

  3. 以环境变量的形式传递请求信息给CGI程序。

  4. CGI程序处理逻辑并输出HTTP响应。

  5. 服务器返回CGI输出内容给客户端。

例如用CGI编写简单搜索页,实现服务器内可配置的动态功能。

14. Building a Web Server - Connor - Live Session - 2022.10.13

14.1 HTTP/1.1特性

相对于HTTP/1.0,HTTP/1.1协议定义了以下重要改进:

实施HTTP/1.1可以支持更多类型的请求和响应语义。

14.2 静态内容压缩

为减小响应体积,可以对静态资源采取以下压缩措施:

合理利用上述静态资源优化技术,可以有效提升页面加载速度和用户体验。

15. Intercepting Communication - Connor - Live Session - 2022.10.17

15.1 网络流量监测

监测网络请求可以采用以下方法:

以上方法都需要 Root权限或程序调整支持。目的在于观察网络行为和程序调用过程。

15.2 HTTPS流量解密

由于HTTPS采用TLS加密传输,单纯监听网络无法解密内容。可以采取以下措施:

但这些方法都可能被现代浏览器识别出安全问题拒绝连接。

16. Intercepting Communication - Connor - Live Session - 2022.10.18

16.1 拦截网络报文

在Linux系统中,可以使用tcpdump命令实时捕获网络报文:

tcpdump通过抓包核心可以实时的分析所有网络流量,不需要程序支持。

16.2 进程跟踪

跟踪单个进程的系统调用可以使用strace工具:

strace是调试和分析程序行为的有效方式之一。

17. Intercepting Communication - Connor - Live Session - 2022.10.24

17.1 Library Hooking

使用库钩子技术可以在程序调用标准库函数时插入自定义代码:

这种方式无需程序支持,但会降低性能。

17.2 劫持系统调用

可以通过ptrace系统调用完成进程跟踪并劫持其系统调用:

这种方式可以针对关键系统调用进行 mehr深入监控和修改。

18. Intercepting Communication - Connor - Live Session - 2022.10.26

18.1 Hook动态链接库函数

使用LD_PRELOAD技术Hook共享库函数的具体步骤:

  1. 定义钩子函数,函数签名与原函数相同

  2. 使用LD_PRELOAD环境变量 指定注入的共享库

  3. 在钩子函数中打印调用信息或修改逻辑

  4. 重新编译生成共享库,.so文件设置rpath

  5. 运行目标程序,原函数调用将进入钩子

这种方法无须程序源代码,适用于黑箱测试。

18.2 注入动态链接

也可以使用ptrace系统调用注入打桩代码实现Hook:

  1. 得到目标进程PID并attach

  2. 解析动态 linking信息获取函数地址

  3. 修改text区代入打桩指令

  4. 设置断点恢复执行单步跟踪

  5. 到达打桩处获取调用信息

  6. 继续执行或中断追踪进程

这种注入方式更低级且需要调试目标进程。

两种方式都可以实现函数Hook动态捕获程序行为。

19. Intercepting Communication - Connor - Live Session - 2022.10.31

19.1 IDA反汇编

IDA是广泛使用的反汇编器,主要功能:

IDA能深入解析程序内部机制,是后端安全工作的重要工具。

19.2 GDB调试

GDB是GNU项目开发的通用调试器,支持C/C++程序调试:

GDB能够低层级调试程序运行情况和异常。

20. Cryptography - Connor - Live Session - 2022.11.08

20.1 对称加密

对称加密使用同一个密钥进行加密和解密,常见算法有:

对称加密适用于关键数据保密传输,需要彼此信任的情况下共享密钥。

20.2 非对称加密

非对称加密使用不同密钥进行加密和解密,常见算法有:

非对称加密解决了密钥分发问题,适用于 open 环境的数字签名和密钥交换。

区分了公钥和私钥,公钥用于加密私钥用于解密。

21. CSE365 - Connor - Live Session - 2022.11.16

21.1 数字签名

数字签名用于验证信息的完整性和发起者身份。

常用数字签名算法包括:

数字签名解决了非对称加密中身份识别的问题。

21.2 数字证书

数字证书由证书颁发机构(CA)签发,用于在openssl环境下验证用户身份。

数字证书验证HTTPS网站的身份,构建头尾一致的认证链机制。

22. Web Security - Connor- Live Session - 2022.11.21

22.1 跨站脚本攻击(XSS)

22.2 注入攻击(SQL、命令)

正确处理用户输入,避免泄露系统访问能力,是防御注入的关键。

23. Web Security - Connor - Live Session - 2022.11.28

23.1 反盗链

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]

23.2 CSRF保护

正确处理状态改变请求和使用CSRF Token是重要的防御措施。

24. Web Security - Connor - Live Session - 2022.11.30

24.1 会话管理

良好的会话管理设计能有效防御会话劫持攻击。

24.2 输入验证

严格的输入标准化过滤可以杜绝大部分注入风险。