当前位置: 首页 > news >正文

关于 Web安全:1. Web 安全基础知识

一、HTTP/HTTPS 协议详解

1. HTTP协议基础

什么是 HTTP?

HTTP(HyperText Transfer Protocol)是互联网中浏览器和服务器之间传输数据的协议,基于请求-响应模式。它是一个无状态协议,意思是每次请求都是独立的,服务器不会记住之前的请求状态。

HTTP 工作模式

  • 客户端(浏览器、爬虫等)发起请求

  • 服务器接收请求,处理后返回响应

  • 双方通过TCP连接(通常是80端口)进行通信

2. HTTP 请求结构

HTTP 请求由四部分组成:

请求行(Request Line)
请求头(Request Headers)
空行
请求体(Request Body,可选)

1)请求行

格式:

METHOD URL HTTP/VERSION
  • METHOD:请求方法,如 GETPOSTPUTDELETE

  • URL:请求的资源路径和参数

  • HTTP/VERSION:HTTP版本,如 HTTP/1.1

示例:

GET /index.html HTTP/1.1

2)请求头

键值对格式,告知服务器客户端信息:

  • Host: 必须,目标服务器域名和端口

  • User-Agent: 客户端软件信息

  • Accept: 可接受的数据格式

  • Cookie: 浏览器存储的Cookie信息

  • Content-Type: 请求体类型(POST/PUT)

  • Content-Length: 请求体大小(字节)

示例:

Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: sessionid=abc123

3)空行

请求头和请求体之间必须有一个空行。

4)请求体

  • 只有部分请求方法(如POST、PUT)有请求体

  • 通常携带提交的数据,如表单、JSON、文件等

3. HTTP 响应结构

HTTP 响应由四部分组成:

状态行(Status Line)
响应头(Response Headers)
空行
响应体(Response Body)

1)状态行

格式:

HTTP/VERSION STATUS_CODE REASON_PHRASE
  • STATUS_CODE:三位数字,表示请求状态

  • REASON_PHRASE:简短描述状态码

示例:

HTTP/1.1 200 OK

2)响应头

描述响应的元数据:

  • Content-Type: 响应体格式和编码

  • Content-Length: 响应体大小

  • Set-Cookie: 设置Cookie

  • Cache-Control: 缓存策略

  • Server: 服务器信息

示例:

Content-Type: text/html; charset=UTF-8
Content-Length: 1024
Set-Cookie: sessionid=abc123; HttpOnly
Cache-Control: no-cache

3)空行

响应头和响应体之间必须有空行。

4)响应体

服务器返回的实际数据,比如HTML页面、JSON、图片等。

4. HTTP 状态码详解

状态码反映服务器对请求的处理结果,按首位数字分类:

类别代码范围描述说明
1xx100-199信息性状态码请求已接收,继续处理
2xx200-299成功请求成功完成
3xx300-399重定向需要客户端进一步操作,如跳转
4xx400-499客户端错误请求有错误,如参数不合法、未授权等
5xx500-599服务器错误服务器处理请求时发生错误

常见状态码示例

状态码含义
200OK — 请求成功
201Created — 资源成功创建
301Moved Permanently — 永久重定向
302Found — 临时重定向
304Not Modified — 资源未修改,使用缓存
400Bad Request — 请求格式错误
401Unauthorized — 未认证
403Forbidden — 禁止访问
404Not Found — 资源未找到
500Internal Server Error — 服务器错误
503Service Unavailable — 服务不可用

5. HTTP工作流程

  1. 客户端发起 TCP 连接,通常连接到服务器的 80 端口

  2. 发送 HTTP 请求

  3. 服务器处理请求并返回 HTTP 响应

  4. 客户端解析响应,根据响应状态执行后续操作

  5. 根据 Connection 头是否为 keep-alive 决定是否关闭连接

6. HTTPS协议详解

HTTPS 是什么?

HTTPS 是在 HTTP 之上增加了 SSL/TLS 加密层的安全协议,主要解决 HTTP 明文传输导致的信息泄露和篡改问题。

HTTPS 端口

默认端口是 443。

HTTPS 工作流程(简化版)

  1. 客户端发起 HTTPS 连接请求

  2. 服务器返回数字证书(包含公钥)

  3. 客户端验证证书(是否由可信CA签发、是否过期、域名是否匹配)

  4. 客户端生成对称密钥,用服务器公钥加密后发给服务器

  5. 服务器用私钥解密得到对称密钥

  6. 双方使用对称密钥加密通信数据

HTTPS 特点

  • 加密通信:保护数据不被窃听

  • 身份认证:防止伪造服务器

  • 数据完整性:防止数据被篡改

  • 防止中间人攻击

总结

内容说明
HTTP 请求请求行 + 请求头 + 空行 + 请求体(可选)
HTTP 响应状态行 + 响应头 + 空行 + 响应体
状态码1xx信息,2xx成功,3xx重定向,4xx客户端错,5xx服务器错
HTTPSHTTP + SSL/TLS加密
HTTPS 工作流程证书交换、密钥协商、加密通信

二、Cookie 详解

Cookie 是服务器通过 HTTP 响应头 Set-Cookie 向客户端(浏览器)写入的一段小型数据,浏览器会在下一次请求时自动将它附带在请求头 Cookie 中发送给服务器,用于状态保持。

Cookie 具有以下特性:

  • 每个 Cookie 大小不超过 4KB

  • 同一域名下最多存储 20 个 Cookie(浏览器不同略有差异)

  • 自动附带到相同域名的每次请求中

1. Cookie 的基本结构

Set-Cookie 响应头格式:

Set-Cookie: name=value; Path=/; Expires=Wed, 01 Jan 2025 00:00:00 GMT; HttpOnly; Secure; SameSite=Strict

常见属性详解:

属性说明
name=value键值对数据
Expires过期时间(绝对时间)
Max-Age存活时间(秒,优先于 Expires)
Path限制在哪些路径下 Cookie 会被发送
Domain可跨子域访问的设置,如 .example.com
Secure仅在 HTTPS 连接下才发送
HttpOnlyJS 不能访问,防止 XSS 盗取
SameSite控制跨站请求时是否发送(Strict / Lax / None)

2. Cookie 的作用

状态保持(Session 管理)

  • 登录状态:如 sessionid=abc123

  • 用户偏好:如 lang=zh-CN

  • 购物车:记录加入商品的 ID

追踪用户行为

  • 统计页面访问、点击行为

  • 第三方广告 Cookie(如 Google Analytics)

3. Cookie 生命周期

会话 Cookie(Session Cookie)

  • 不设置 ExpiresMax-Age

  • 浏览器关闭后自动失效

持久 Cookie(Persistent Cookie)

  • 设置了 ExpiresMax-Age

  • 即使关闭浏览器,指定时间内依然有效

4. Cookie 的安全问题

1)XSS 攻击(跨站脚本)盗取 Cookie

攻击者通过注入恶意 JS 代码,调用 document.cookie 读取用户 Cookie 并发送给远程服务器。

防御:

  • 设置 HttpOnly,防止 JS 访问 Cookie

  • 对用户输入进行严格过滤或转义

2)CSRF 攻击(跨站请求伪造)

利用用户浏览器已存的 Cookie 向目标网站发起伪造请求,如提交表单、转账等。

防御:

  • 设置 SameSite=StrictLax

  • 使用 CSRF Token 验证来源合法性

3)Cookie 劫持

如果用户在 HTTP 下传输 Cookie,攻击者可以使用中间人攻击(MITM)截获 Cookie。

防御:

  • 设置 Secure 属性,只允许 HTTPS 传输

  • 使用 HTTPS 加密所有通信

4)Cookie 固定攻击(Session Fixation)

攻击者提前设置用户 Cookie,诱导用户使用该 Cookie 登录,从而复用 Session。

防御:

  • 登录成功后重新生成 Cookie / Session ID

  • 拒绝来源不明的 Session Cookie

5. Cookie 示例(请求 + 响应)

服务端响应设置 Cookie:

HTTP/1.1 200 OK
Set-Cookie: sessionid=abc123; HttpOnly; Secure; SameSite=Strict

浏览器下一次请求自动携带 Cookie:

GET /user/profile HTTP/1.1
Host: example.com
Cookie: sessionid=abc123

6. Cookie 与浏览器 JS 操作

// 读取
console.log(document.cookie); // name=value; another=123// 设置
document.cookie = "token=xyz456; path=/; max-age=3600";// 删除(设置过期)
document.cookie = "token=; expires=Thu, 01 Jan 1970 00:00:00 GMT";

注意:如果设置了 HttpOnly,JavaScript 是无法访问该 Cookie 的。

7. Cookie 与跨域

Cookie 默认 不跨域,但有策略支持:

  • 前提是设置了 Access-Control-Allow-Credentials: true

  • 客户端请求必须使用 withCredentials: true

  • Cookie 的 Domain 设置为顶级域名(如 .example.com

总结

属性用途是否可防攻击
HttpOnly禁止 JS 访问防止 XSS
Secure只在 HTTPS 传输防止 MITM
SameSite跨站请求限制防止 CSRF
Expires控制 Cookie 失效时间控制生命周期
Domain控制子域可访问易被滥用,小心设置

三、Session详解

Session 是服务器端用于 记录客户端状态 的一种机制。它解决了 HTTP 协议无状态的问题(服务器无法记住每个用户是谁)。

客户端登录后,服务器生成一个 Session ID,用于标识当前会话,并将它保存在服务端,同时通过 Cookie 发给客户端。客户端每次请求时携带这个 Session ID,服务器就能识别该用户是谁。

1. Session 的工作流程

[客户端] —— 登录请求 ——> [服务端]<—— Set-Cookie: sessionid=abc123 —— [客户端] —— 后续请求(带 Cookie) ——> [服务端]查找 sessionid=abc123 对应的用户状态

示例流程:

  1. 用户第一次访问网站,服务端创建一个新的 Session,生成一个唯一的 sessionid

  2. 服务器通过 Set-Cookiesessionid 设置到客户端浏览器中

  3. 之后客户端请求中都会自动携带 Cookie: sessionid=xxx

  4. 服务端根据 sessionid 在内存/数据库中查找用户的会话信息(如登录状态、用户名等)

2. Session 与 Cookie 的区别

项目CookieSession
存储位置客户端浏览器服务端内存、数据库、Redis 等
安全性较低,易被盗用较高,不暴露用户数据,仅暴露 ID
容量限制每个 Cookie 最大约 4KB较大,可存储任意复杂结构
生命周期设置 Expires/Max-Age 控制通常存在内存中,浏览器关闭或过期失效
易用性无需服务器端资源需要服务器维护 Session 状态

3. Session 存储机制

Session 本质是一个 Key-Value 结构:

  • Key 是 sessionid(保存在客户端 Cookie 中)

  • Value 是服务端保存的用户状态信息(保存在服务器)

Session 数据的存储方式常见如下:

存储方式特点
内存(默认)简单、速度快,重启丢失,不可扩展
文件存在磁盘,可持久,速度较慢
数据库可持久、易管理,性能中等
Redis高性能分布式,适合高并发场景

4. Session 生命周期

  • 默认有效期:浏览器关闭时失效,或服务端设定超时时间(如 30 分钟)

  • 设置方式(以 PHP 为例)

ini_set('session.gc_maxlifetime', 3600); // 设置有效期 1 小时
session_start();

5. Session 安全问题与攻击方式

1)Session Fixation(固定会话攻击)

攻击者诱导用户使用事先构造的 sessionid,然后服务器将其绑定为合法 Session。

举例:

http://example.com/login?PHPSESSID=abc123

用户点击后登录,攻击者就可以使用相同 Session ID 登录。

防御:

  • 登录成功后强制重新生成 Session ID

  • 拒绝 URL 中传递 Session ID(禁止 SID)

  • 设置 HttpOnly,禁用 JS 操作 Cookie

2)Session Hijacking(劫持)

攻击者通过 XSS、流量嗅探、恶意扩展等手段获取用户的 sessionid,然后伪造请求。

防御:

  • 使用 Secure + HttpOnly 属性保护 Cookie

  • 全站强制 HTTPS,防止中间人窃取

  • Session ID 绑定用户 UA/IP,防止伪造

3)会话过期攻击

用户长时间不操作,Session 被销毁,攻击者在这个时间发起请求。

防御:

  • 设置合理的 Session 过期时间

  • 登录前置验证 + Session 管理机制

6. 常见 Session 实现方式

PHP

session_start(); // 启动 Session
$_SESSION['user'] = 'admin';

Cookie 自动设置:

Set-Cookie: PHPSESSID=abc123; path=/; HttpOnly

Python Flask

from flask import session
session['user'] = 'admin'

默认使用 Cookie 存储(可配置为 Redis 等)

Java Servlet

HttpSession session = request.getSession();
session.setAttribute("user", "admin");

默认使用 JSESSIONID 来标识会话

Set-Cookie: JSESSIONID=abc123; Path=/; HttpOnly

7. Session 的高级安全控制

1)Session ID 强度

  • 应该使用高熵的随机值生成(如 UUID、SHA256 随机串)

  • 不要使用简单自增或可预测字符串

2)Session ID 绑定策略

绑定到以下信息可防止伪造:

  • User-Agent(浏览器指纹)

  • IP 地址(不建议绑定完整 IP,可绑定前几段)

8. Session 与 Token 的区别

项目SessionToken(如 JWT)
存储服务端客户端本地
状态有状态(服务端维护会话)无状态(不需要存储)
性能占用内存,扩展差适合分布式,多终端场景
安全性受控于服务端,泄漏风险低需要加密签名验证,防止伪造

总结

核心要素内容
Session 本质用于服务端保存用户状态,配合 Cookie 识别身份
Cookie 作用存储 sessionid,标识用户是谁
安全关键点HttpOnly、Secure、SameSite、重新生成 ID、防 Fixation
攻击方式Fixation、Hijacking、XSS、CSRF
防御方法绑定信息、使用 HTTPS、短期有效期、验证来源

四、Token详解

Token(令牌)是一种服务端生成的字符串,用于客户端访问受保护资源时 标识身份 的认证机制。

Token 是为了解决传统 Session 需要在服务器维护用户状态的问题(即“有状态认证”),而引入的 无状态认证方式,广泛用于:

  • Web 前后端分离项目

  • 移动端、APP 登录认证

  • 分布式认证(单点登录)

1. Token 的工作流程(认证机制)

[客户端] —— 登录 ——> [服务端]<—— 返回 Token —— [客户端] —— 后续请求(携带 Token) ——> [服务端]验证 Token 合法性,返回数据

常见传输方式:

请求头方式(推荐):

Authorization: Bearer <token>

URL 参数:

GET /api/user?token=abc123

请求体(POST JSON)中提交:

{ "token": "abc123" }

2. Token 的种类

1)自定义 Token(普通随机串)

  • 结构简单:如 abc123xyz456

  • 存在 Redis、数据库中,和 Session 类似

  • 每次请求服务器查一次数据库,验证合法性

2)JWT(JSON Web Token)

  • 无需数据库查找,使用签名校验即可

  • 常用于分布式认证、前后端分离系统

3. JWT 的结构

xxxxx.yyyyy.zzzzz

由三部分组成,每部分使用 Base64 编码:

部分内容示例
Header令牌类型 + 签名算法{ "alg": "HS256", "typ": "JWT" }
Payload载荷(用户信息){ "uid": 1001, "role": "admin" }
Signature签名(防篡改)HMAC_SHA256(header + payload + 密钥)

举例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. // Header
eyJ1aWQiOjEsInJvbGUiOiJhZG1pbiJ9.      // Payload
Abcdefghijklmnopqrstuvwxyz123456      // Signature

4. Token 与 Session 的区别

项目SessionToken(JWT)
存储方式服务器内存、数据库客户端本地(无状态)
标识机制sessionid + 服务端状态记录Token 自带用户信息 + 签名验证
性能服务端需查状态,横向扩展差不依赖服务端状态,易于分布式部署
安全性不泄漏用户信息,服务端控制较强用户信息直接暴露在 Payload 中
可控性服务端可手动销毁、修改一旦发出不可撤销,需设置过期时间

5. Token 的优点与缺点

 优点:

  • 无需服务端保存状态(节省资源)

  • 可跨服务、跨平台共享身份(如 SSO 单点登录)

  • 不依赖 Cookie,可用于移动端、App

缺点:

  • 无法主动失效(Token 发出后无法收回)

  • 信息容易泄漏(Payload 明文,需加密敏感字段)

  • 体积大于 Session ID,占带宽

6. Token 的存储方式

存储方式说明
LocalStorage持久性强,但易被 XSS 攻击
SessionStorage浏览器关闭即清除,安全略高
Cookie可配合 HttpOnly + Secure 提升安全

7. Token 的安全问题与攻击方式

1)Token 泄漏(XSS、日志暴露)

  • Token 通常保存在浏览器中,若存在 XSS 漏洞,攻击者可轻松获取

  • URL 中传递 Token 可能被日志、代理服务器记录

防御:

  • Token 不出现在 URL,推荐放在 Header

  • 存储 Token 时避免使用 localStorage(推荐 HttpOnly Cookie)

  • 前端防 XSS:严格 CSP + DOM 过滤

2)Token 伪造

  • 攻击者尝试伪造 JWT,绕过认证

防御:

  • 使用强加密算法(如 HMAC-SHA256)

  • 严格保管密钥,不应泄漏服务端密钥

3)Token 重放攻击(Replay)

  • 攻击者截获合法请求 Token 后,在有效期内重复使用

防御:

  • Token 设置短有效期(如 5 分钟)

  • 配合 一次性 Token / RefreshToken 机制

8. Token 与 Refresh Token 机制

由于 Token 不可撤销,推荐使用双 Token 机制:

类型用途
Access Token有效期短,用于请求接口
Refresh Token有效期长,用于换取新 Token

流程:

[登录] ——> [发出 access_token + refresh_token][请求资源] ——> 附带 access_token|└──[过期]——> 用 refresh_token 换新的 access_token

9. 实战示例:使用 JWT 验证身份

前端请求:

POST /login
Content-Type: application/json{"username": "admin","password": "123456"
}

服务端返回:

{"token": "eyJhbGciOiJIUzI1NiIsInR5c..."
}

后续请求附带:

GET /user/info
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5c...

服务端用密钥验证 Token 签名,读取其中的 Payload 信息,判断用户身份。

10. Token 示例分析(JWT 解码)

示例 JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1aWQiOjEsInJvbGUiOiJhZG1pbiIsImV4cCI6MTY5ODQzMjAwMH0.
t7I8mVYuqxPhA5KXZMQzN2gUe9eWYmN2coHo5cVdE2g

解码 Payload 得到:

{"uid": 1,"role": "admin","exp": 1698432000
}

说明用户 ID 为 1,角色为 admin,有效期截止时间为某个时间戳(可用 Python/JS 解码)。

总结

要素内容说明
核心机制客户端持有 Token,服务端验证签名,无需状态存储
推荐方案使用 JWT + RefreshToken 实现安全、可扩展的认证机制
安全风险XSS、Token 泄漏、伪造、重放攻击等
防御策略HttpOnly Cookie / Token 加密 / 过期机制 / 加签验证
与 Session 区别Token 是无状态的,适合分布式系统;Session 依赖服务端存储

五、JWT 的机制与攻击方式

JWT 全称 JSON Web Token,是一种 无状态的身份验证机制,主要用于前后端分离项目、移动端接口调用、单点登录(SSO)等。

它本质上是一个自包含的令牌,通过数字签名的方式防止篡改。

1. JWT 的结构(三段式)

格式如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjEsInJvbGUiOiJhZG1pbiJ9.WfJ9oX7O1fFLjlR_pIRpZI...

Header.Payload.Signature 三部分组成,每部分使用 Base64 编码。

名称内容类型作用
Header元数据(算法类型)指定加密算法,如 HS256 / RS256
Payload负载(用户信息)包含用户身份、权限、过期时间等
Signature签名(完整性验证)防止篡改,验证 Token 是否有效

2. JWT 签名机制(核心)

签名生成公式如下(以 HMAC-SHA256 为例):

Signature = HMAC-SHA256(base64url(Header) + "." + base64url(Payload),secret_key
)

这个签名可以保证:

  • 内容被篡改 → 签名校验失败

  • 客户端不能伪造 Token(不知道密钥)

3. JWT 的使用流程

[用户登录] → [生成 JWT] → 返回给前端↓
[客户端] 持有 JWT 调用接口↓
[服务器] 验证 JWT 的签名 → 读取 Payload → 允许访问

4. Payload 示例

{"uid": 123,"username": "admin","role": "super_admin","exp": 1710000000   // 过期时间,Unix 时间戳
}

注意:

  • Payload 不能加密,默认是明文

  • 不应放敏感数据(如密码、银行卡等)

5. JWT 攻击方式(黑客视角)

WT 是无状态的,一旦签发就无法撤销,如果存在配置问题或弱密钥,攻击者可以伪造/篡改 JWT。

常见攻击方式:

1)弱密钥爆破攻击(HS256)

  • 当服务端使用对称加密(如 HS256),如果密钥过于简单,如 123456,攻击者可以使用工具暴力爆破。

工具:

  • jwt-cracker

  • jwt_tool.py

jwt_tool.py <token> -C -d /path/to/weak_passwords.txt

防御:

  • 使用复杂不可预测的密钥(如 UUID + 高位随机)

  • 使用非对称加密(RS256)

2)算法混淆攻击(alg: none)

有些服务端对 JWT 的 alg 字段没有做校验,如果用户将其修改为 "alg": "none",服务端就会跳过签名验证。

攻击方式:

篡改 Header 为:

{ "alg": "none", "typ": "JWT" }

删除签名部分,提交伪造 Token。

防御:

  • 拒绝 "alg": "none",显式验证签名算法

  • 使用经过验证的 JWT 库

3)算法替换攻击(HS256 → RS256)

RS256 是非对称加密(公私钥),攻击者可以利用算法替换绕过验证。

攻击原理:

  • 服务端使用 RS256,但攻击者将 alg 改为 HS256,并用“公钥”代替“密钥”来签名

  • 如果服务端仍用公钥验证,会被成功验证签名

防御:

  • 固定签名算法,不允许前端指定 alg

  • 使用严格的验证库(如 PyJWT, jsonwebtoken

4)Token 重放攻击

即攻击者截获某用户的合法 Token(通过 XSS、中间人攻击、URL 泄漏等方式),然后在有效期内重复使用。

防御:

  • 使用 HTTPS 加密传输

  • 设置短的有效期(exp

  • 引入 Refresh Token + 滑动过期机制

  • 绑定 IP / UA 检查

5)JWT 泄漏攻击

泄漏途径:

  • Token 存在 URL 中,容易被浏览器缓存、中间件记录

  • Token 存储在 localStorage,容易被 XSS 拿到

防御:

  • 推荐使用 Cookie + HttpOnly + Secure 存储 JWT

  • 避免在 URL 中传递 Token

  • 启用 CSP、输入校验防 XSS

6. 渗透测试视角:JWT 检测点

在渗透测试/CTF 中,遇到 JWT 可以重点检查以下点:

检测点说明
alg 是否为 none是否能跳过签名验证
alg 能否替换为 HS256能否使用公钥伪造签名
密钥是否可爆破使用字典工具尝试爆破
payload 是否可控是否能提权(role=admin)
过期时间是否有效是否能修改 exp 绕过校验
是否绑定 IP / UA是否可进行重放攻击

7. JWT 攻击实战:模拟提权攻击

1)抓取一段正常用户的 Token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyIjoiZ3Vlc3QiLCJyb2xlIjoiZ3Vlc3QifQ.
ZV1HG9mU_kPvEZfukOVsfAz1-r4PHiZ93KAjtz07Gb0

2)解码 Payload 并修改角色字段为:

{ "user": "guest", "role": "admin" }

3)使用弱密钥爆破签名或尝试算法替换,重新生成 JWT。

4)用篡改后的 JWT 访问管理员接口,判断是否成功提权。

8. 防御最佳实践

措施描述
固定签名算法不允许前端通过 Header 控制 alg
不使用 none 算法拒绝无签名 JWT
使用非对称加密(RS256)避免密钥泄漏
设置 exp/iatt/nbf 等字段控制有效期、拒绝过期 Token
配置短有效期 + Refresh机制Access Token + Refresh Token 组合使用
使用 HttpOnly Cookie防止 JS 获取 Token(抗 XSS)
输入过滤 + CSP防 XSS 攻击

9. 推荐工具 & 测试框架

工具名用途
jwt.io在线 JWT 解码/编码
jwt_tool.pyJWT 爆破、伪造、测试脚本工具
HackBar / Burp Suite实战中修改 Token 提交重放
Postman模拟 JWT 接口调用

六、同源策略(SOP)

同源策略(Same-Origin Policy) 是浏览器的一种安全机制,用于隔离不同网站之间的资源,防止恶意网站窃取用户敏感数据。

它最初是为了解决:

  • 网页中的 JavaScript 脚本不能访问其他域下的资源(防止 XSS、CSRF)

  • 保护用户的 Cookie、本地存储、DOM 数据不被第三方网站访问

1. 什么叫“同源”?

要完全同源,必须满足三个条件完全相同:

条件说明示例
协议http vs httpshttp://https://
域名www.example.com vs api.example.com子域名也算不同源
端口80 vs 8080http://a.com:80http://a.com:8080

例如:

http://a.com ≠ https://a.com
http://a.com ≠ http://b.com
http://a.com:80 ≠ http://a.com:81

2. SOP 的限制范围(默认禁止访问的内容)

浏览器会对不同源的请求或访问行为进行限制。以下是 SOP 默认禁止的操作

操作是否允许
JS 读取 iframe 中的 DOM(不同源) 不允许
JS 发起跨域 Ajax 请求 不允许
JS 访问其他源的 Cookie / localStorage 不允许
表单(form)提交跨域 允许(但无法读取响应)
图片(img)加载跨域资源 允许(只加载,无法操作)

3. SOP 的核心目标:防止跨站攻击

举例:A 网站打开 B 网站的 iframe,尝试通过 JS 读取用户信息

// 假设在 a.com 的页面中:
let content = document.getElementById('iframe').contentWindow.document;
console.log(content.cookie);  // 报错:同源策略阻止了访问

如果不限制,就会产生极大的安全隐患(如 CSRF、XSS 等)。

4. 开发中遇到的常见问题(实际限制表现)

场景是否被 SOP 限制说明
使用 fetch 发送跨域请求 被限制需要服务端设置 CORS 头
JS 读取 <iframe src="b.com"> 的内容 被限制DOM 无法访问
<img src="https://b.com/1.png"> 加载图片 不限制图片加载不受限制
<script src="https://cdn.com/lib.js"> 不限制可加载第三方脚本(也是 XSS 传播方式之一)

5. SOP 的绕过方法(前端对策)

浏览器的 SOP 限制并不是绝对的,常见的绕过方案包括:

1)CORS(跨域资源共享)

服务端设置响应头:

Access-Control-Allow-Origin: https://a.com

让前端合法地跨域访问后端资源。这是现代前后端分离的标准方案

2)JSONP(只支持 GET 请求)

通过 <script> 标签的漏洞来“绕过”SOP:

<script src="https://api.com/data?callback=cb"></script>
<script>
function cb(data) {console.log(data);
}
</script>

JSONP 是早期跨域的方式,但存在安全风险,不推荐新项目使用。

3)PostMessage(安全通信)

允许父页面与 iframe 跨域通信:

// 子页面(b.com):
window.parent.postMessage("data", "http://a.com");// 父页面(a.com):
window.addEventListener("message", function(e) {if (e.origin === "http://b.com") {console.log(e.data);}
});

这是现代安全通信推荐的方式。

4)document.domain(仅限同一主域)

两个子域如 a.example.comb.example.com,可以设置:

document.domain = "example.com";

使它们视为同源,但只能在主域一致时使用。

6. 渗透测试视角:绕过 SOP 的利用点

攻击点说明
缺少 CORS 检查攻击者可构造恶意站点发起跨域请求
CORS 配置错误(允许 *)Access-Control-Allow-Origin: * 与敏感数据结合极度危险
JSONP 接口未校验 callback可被攻击者构造页面获取用户数据
WebSocket 没有来源校验攻击者可能伪造连接窃取数据

7. 安全建议

措施说明
合理配置 CORS明确允许来源,避免使用 *
所有敏感操作要求认证防止被跨站调用滥用接口
对 JSONP 接口设置签名验证防止 callback 被任意构造
iframe 内部禁止敏感操作设置 X-Frame-Options 避免嵌入
CSP 配置限制 JS 来源,防止恶意加载脚本

8. 浏览器 SOP 的实现方式

  • 对 DOM 对象进行隔离(沙箱)

  • 设置 Origin 请求头和 Referer

  • 跨域访问报 DOMException: Blocked a frame with origin...

浏览器如 Chrome、Firefox 都严格遵守 SOP 规则。

9. 常见工具与调试技巧

工具用途
Chrome DevTools查看请求的 OriginCORS 响应
Burp Suite模拟跨域请求、CORS 配置测试
HackBar构造 JSONP / iframe payload

七、CORS(跨域资源共享)

CORS(Cross-Origin Resource Sharing)是浏览器为了解决跨域访问限制,在服务器端通过设置 HTTP 响应头来告诉浏览器:“哪些源可以访问我”。

它是同源策略(SOP)限制的标准化扩展机制,允许客户端从不同源的服务器请求资源。

1. 什么是跨域?

跨域的本质是源不同(origin)。判断是否跨域,要比较:

协议域名端口
http://a.comvshttps://a.com
http://a.comvshttp://b.com
http://a.com:80vshttp://a.com:81

只要三者有一个不同,就叫做“跨域请求”。

2. CORS 的基本流程(以浏览器为例)

当前端向跨域后端发请求时,浏览器会检查是否允许,如果允许则继续,否则阻止访问。

1)简单请求(simple request)

满足以下条件的请求,称为简单请求:

  • 使用方法:GETHEADPOST

  • Content-Type 限制为:

    • application/x-www-form-urlencoded

    • multipart/form-data

    • text/plain

  • 请求头没有自定义(比如没有带 token)

浏览器直接发请求,后端返回响应:

请求:

GET /api/data HTTP/1.1
Origin: http://a.com

响应:

Access-Control-Allow-Origin: http://a.com

如果这个头部不存在,浏览器就会拦截响应结果(虽然请求成功,但无法访问响应数据)。

2)非简单请求(Preflight 预检请求)

如果使用了:

  • 方法为 PUTDELETEPATCH

  • 请求头带有自定义字段(如 Authorization, X-Custom-Header

  • Content-Type 非简单类型(如 application/json

浏览器会先自动发送一个 预检请求(OPTIONS),确认服务端是否允许跨域。

预检请求(OPTIONS):

OPTIONS /api/update HTTP/1.1
Origin: http://a.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type

响应:

Access-Control-Allow-Origin: http://a.com
Access-Control-Allow-Methods: PUT, POST, GET
Access-Control-Allow-Headers: Content-Type

预检通过后,浏览器才会发起真正的跨域请求。

3. 常见响应头字段详解(由服务器设置)

响应头含义
Access-Control-Allow-Origin指定允许访问资源的域名(如 http://a.com)或 *
Access-Control-Allow-Methods允许的 HTTP 方法(如 GET, POST, PUT
Access-Control-Allow-Headers允许的自定义请求头
Access-Control-Allow-Credentials是否允许携带 Cookie,必须为 true
Access-Control-Expose-Headers允许前端 JS 访问的响应头(默认 JS 只能读部分 header)
Access-Control-Max-Age预检请求的缓存时间,单位秒(减少重复预检)

示例响应头(配置示例):

Access-Control-Allow-Origin: https://a.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 3600

4. CORS 安全风险与攻击利用

虽然 CORS 是为了安全而设计的,但配置不当反而会成为漏洞入口,攻击者可以借此发起攻击:

1)Access-Control-Allow-Origin: *

如果服务端设置了:

Access-Control-Allow-Origin: *

且接口还返回了敏感信息或用户隐私数据(如登录态、订单、银行卡),就允许任意网站跨域读取用户数据,这是严重漏洞!

尤其危险当还设置了 Access-Control-Allow-Credentials: true

2)反射型 Origin 校验绕过

有些服务端写法是:

res.setHeader("Access-Control-Allow-Origin", req.headers.origin);

这会导致任意 Origin 都能被服务端反射,如果没有做白名单校验,非常危险!

3)服务端配置错误导致攻击者网站可以发请求读取数据

攻击者只需伪造页面,在 victim 用户打开后即可读取其在真实网站中的数据:

fetch("https://bank.com/api/user", {credentials: 'include'
})
.then(res => res.json())
.then(data => {// 攻击者读取用户数据sendToMe(data);
});

5. 渗透测试中如何检测 CORS 问题?

常用方法:

  • 用 Burp Suite 修改 Origin 头,测试是否被允许

  • 修改 Access-Control-Allow-Credentials 为 true,观察响应头是否放开

  • 用 curl 或 Postman 构造 OPTIONS 请求,查看服务器是否响应预检

6. 安全配置建议

项目建议配置
Access-Control-Allow-Origin只允许明确的白名单域名
Access-Control-Allow-Credentials仅在确实需要时设置为 true,并不能与 * 同时使用
Access-Control-Allow-Headers控制允许的自定义头,避免过宽
检查 Origin 白名单不要简单反射请求头,要严格校验合法域名

7. 常用调试工具

工具用途
Chrome DevTools - Network查看请求是否被 CORS 拦截
curl构造跨域和预检请求
Postman模拟请求(注意 Postman 不受 SOP 限制)
Burp Suite劫持 Origin 头,测试服务端配置
CORS Everywhere 插件测试跨域调试(仅开发用)

八、URL 编码

URL 编码,又叫 百分号编码(Percent Encoding),是为了将 URL 中不允许出现的特殊字符 转换为合法格式,便于安全传输。

URL 只能使用 ASCII 字符集,不能直接包含:

  • 空格(

  • 中文(如 你好

  • 特殊符号(如 #&?=, / 等)

所以需要将这些字符进行编码,才能正确传递给服务器。

1. URL 编码的原理

格式为:

% + 两位十六进制表示的 ASCII 码

示例:

字符ASCIIURL 编码
空格0x20%20(或 +
+0x2B%2B
/0x2F%2F
?0x3F%3F
=0x3D%3D
&0x26%26
#0x23%23
中文 “你”U+4F60%E4%BD%A0(UTF-8 编码后再转为十六进制)

2. 哪些字符需要被编码?

类型是否需要编码
英文字母 A–Z、a–z 不需要
数字 0–9 不需要
安全字符 - _ . ~ 不需要
空格 需编码为 %20+(在 application/x-www-form-urlencoded 中)
其它字符如 : / ? # & = % 必须编码
非 ASCII 字符(如中文) 必须编码

3. URL 编码的使用位置

1)浏览器地址栏中的参数:

GET /search?q=%E5%BC%A0%E4%B8%89 HTTP/1.1

2)表单提交时:

表单 Content-Type: application/x-www-form-urlencoded 时,表单字段会被 URL 编码

3)AJAX、Fetch 请求中参数拼接

4)编码敏感字符以防止参数污染、解析错误

4. Web 安全中的 URL 编码(绕过技巧)

1)参数混淆绕过防火墙(WAF):

假如 WAF 拦截 ../../etc/passwd,你可能试试:

  • %2e%2e%2f%2e%2e%2fetc%2fpasswd

  • %252e%252e%252f(双重编码绕过)

  • %c0%ae%c0%ae%c0%af

2)XSS 利用中:

<script>alert(1)</script>

编码后变为:

%3Cscript%3Ealert(1)%3C%2Fscript%3E

WAF 可能没能识别所有编码形式,从而实现绕过。

3)SQL 注入混淆:

?id=1%20OR%201=1

编码了空格,防止被拦截。

5. 编码/解码工具

1)Python 代码演示:

from urllib.parse import quote, unquote# 编码中文
s = "你好 world!"
encoded = quote(s)  # %E4%BD%A0%E5%A5%BD%20world%21
print(encoded)# 解码
print(unquote(encoded))  # 你好 world!

2)Burp Suite 解码工具:

在 Repeater/Decoder 标签页可以快速 Base64、URL、HTML、Unicode 编解码

3)Chrome 控制台:

encodeURIComponent("你好&=123")
// 输出:"%E4%BD%A0%E5%A5%BD%26%3D123"

6. 常见编码陷阱与错误

问题说明
重复编码%252e%2e 的再编码(双重编码),服务器可能解码两次
编码位置错误编码值错放在 URL path 或 query 中,可能导致路径解析错误
编码不一致前端用 encodeURIComponent,后端没对应解码,会导致参数丢失
编码绕过防御防御机制只检查原始字符串,未解码处理,易被绕过

7. 与其他编码方式对比

编码方式用途是否安全
URL 编码浏览器传参、Form 表单 是      防止格式错乱,但非加密
Base64 编码数据传输(如图片、JWT) 否      仅编码,非加密
HTML 实体编码防止 XSS 注入 是      如 < 编码为 &lt;
JavaScript 转义防止 XSS,绕过 JS 解析 是  \x3C<

总结

项目说明
编码规则% + 两位十六进制 ASCII
空格%20+(表单)
中文UTF-8 → hex → %XX 格式
安全用途防止参数错乱、WAF 绕过、XSS 混淆
安全风险双重编码绕过、解码不一致问题

九、Base64 编码

Base64 是一种将 任意二进制数据 编码成 可打印 ASCII 字符 的方式,常用于:

  • 数据传输(如 JSON、表单、URL 中)

  • 数据存储(如图片、证书)

  • 避免字符在传输中出错或被解析

重点:Base64 不是加密,也不是压缩,仅是编码!

1. Base64 编码原理详解

原理概括:

将原始数据每 3 字节(3 x 8 = 24 bit) 一组,拆分为 4 个 6 位二进制数(4 x 6 = 24 bit),再映射到一个 Base64 字符表中。

Base64 字符表:

A-Z a-z 0-9 + /
共 64 个字符
编码值字符范围
0-25A-Z
26-51a-z
52-610-9
62+
63/

填充符 =
当原始数据不是 3 字节整数倍时,会用 = 进行补齐,1 个或 2 个 =

示例:

编码原始字符串:abc

1)将每个字符转换为 ASCII(二进制)

a: 01100001
b: 01100010
c: 01100011
→ 拼接:011000010110001001100011

2)按 6 位拆分为:

011000 010110 001001 100011
十进制:24 22 9 35
映射: Y W J j

结果:YWJj

Python 演示:

import base64# 编码
text = "abc"
encoded = base64.b64encode(text.encode())  # b'YWJj'
print(encoded.decode())# 解码
decoded = base64.b64decode(encoded).decode()
print(decoded)

2. Base64 的使用场景

场景示例
JWTheader.payload.signature 中的 header 和 payload 是 base64url 编码
图片<img src="data:image/png;base64,XXX">
文件上传文件内容转为 base64 发送到服务器
HTTP Basic AuthAuthorization: Basic dXNlcjpwYXNz(user:pass 的 base64)
URL 参数数据转为 base64 再放到 URL 中传输

3. Base64 和 Base64URL 的区别

比较项Base64Base64URL(安全版本)
+ 替换为+-
/ 替换为/_
末尾 =可省略
用于常规场景JWT、URL、Web 安全相关传输

示例:

Base64:     abc123! → YWJjMTIzIQ==
Base64URL:            YWJjMTIzIQ      # 去掉了等号

4. Base64 与 Web 安全的关系

应用:

  • 参数传输隐藏
    把 JSON 参数 base64 编码,避免前端直接暴露结构

  • API 加密混淆
    一些接口请求体、请求头中加入 base64 编码数据,提升分析门槛

  • 绕过防火墙/规则匹配
    有些敏感 payload 会先 base64 编码再传输,再由服务器解码(如 WAF 绕过)

  • XSS 编码绕过
    把恶意脚本 base64 编码后,通过 eval(atob(...)) 执行

eval(atob("YWxlcnQoJzEyMycp"))  // alert('123')
  • JS逆向中常见加密流程
    多层 Base64 编码、混淆和加密结合使用。

5. 安全误区与攻击风险

问题说明
不是加密!Base64 编码后看起来像加密,但任何人都能解码
可被爆破/分析许多 JS 文件、JWT payload 都是 base64 编码的,可以还原得到内容
可以隐藏 XSS、命令注入等 payload需要手动解码再检测

6. 实战分析案例

JWT Payload 解码(典型 Base64URL)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE2Nzk2NTg1NTV9
.
<signature>

把中间两段解码即可得到 header 和 payload 信息。

Python 脚本解码 JWT:

import base64
import jsondef decode_jwt_part(part):# Base64 padding 补齐# JWT 使用的是 Base64 URL 安全编码,它会去掉 = 号来减小长度。# 但 Python 解码时需要标准 Base64 格式(必须是 4 的倍数长度),所以要补 =。# -len(part) % 4 的意思是:最少补几个 =,才能使长度变成 4 的倍数part += '=' * (-len(part) % 4)  # paddingreturn json.loads(base64.urlsafe_b64decode(part))print(decode_jwt_part("eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE2Nzk2NTg1NTV9"))

7. 常用工具

工具功能
Python base64 模块编解码
Burp Suite Decoder支持 Base64 多层解码
在线网站如 base64decode.org
Chrome 控制台btoa() 编码、atob() 解码

总结

项目内容
每 3 字节 → 4 字符6bit 对应 1 个 base64 字符
字符集A-Z, a-z, 0-9, +, /(或 URL 中的 -, _)
补齐不足用 = 补齐
安全意义避免传输错误、隐藏参数、混淆传输逻辑
风险点可逆,不等于加密,可作为绕过媒介

十、加密与混淆格式

在 Web 安全中,我们经常会遇到一些传输参数像这样:

X-Qwert: U2FsdGVkX1+K7NvMdq...
data: 5a53486c6358526c5a6a49...
sign: KLi8rYuM+j2kmdFrYzR2aA==

这些数据可能是:

  • 加密过的数据(如 AES/RSA 加密)

  • 混淆处理后的参数(如自定义编码、Base64、多层转换)

  • 加密 + 编码 + 压缩的多层处理

1. 加密 vs 混淆的区别

项目加密混淆
目的保障机密性、避免被破解增加理解、逆向难度
是否可逆加密通常可逆(对称/非对称)混淆通常可逆
是否安全安全性取决于算法和密钥不安全,仅用于隐藏逻辑
使用场景敏感数据传输、身份验证Web 参数、JS 函数混淆

2. 常见加密算法与格式

对称加密

  • 算法:AES、DES、3DES、RC4

  • 特点:加密和解密使用同一个密钥

  • 格式特征:加密后多为 base64 编码字符串或 16 进制

示例:

// AES 加密后的数据
U2FsdGVkX19yJwDkLNEpsjd3S1qzvFq...

关键点:

  • 如果数据以 U2FsdGVkX1 开头,很可能是 CryptoJS 的 AES 加密(OpenSSL 格式)

非对称加密

  • 算法:RSA、ECC

  • 特点:公钥加密、私钥解密

  • 格式特征

    • base64 编码大段数据

    • 开头可能是 "-----BEGIN PUBLIC KEY-----"

常见格式:

MIIBIjANBgkqhkiG9w0BAQEFAA...

哈希算法(不可逆)

  • 算法:MD5、SHA1、SHA256

  • 特点:不可逆,常用于签名、校验

  • 格式特征:固定长度 hex 字符串(32/40/64位)

示例:

签名:ae2b1fca515949e5d54fb22b8ed95575  // MD5

3. 混淆格式举例

1)Base64 混淆

  • 加密后用 Base64 编码,使其变得“可传输”

  • 多层 Base64 编码也很常见

let data = "YWJjZGVmZw==";  // 实际为 'abcdefg'

2)字符编码混淆

  • 原始字符串被转为 Unicode 编码、URL 编码、十六进制等
\u0061\u0062\u0063        // 'abc'
%61%62%63                // 'abc' URL 编码
0x61 0x62 0x63           // 十六进制 ASCII

3)函数名和变量名混淆

var _0x8a21=["\x63\x6F\x6E\x73\x6F\x6C\x65"];
console[_0x8a21[0]]("hello");
  • 这里的 console["log"]("hello") 被混淆了

  • 用于 JS 反调试、反逆向v

4)自定义变形/加密格式

很多 APP 和 JS 代码会自己写一套编码/混淆算法,如:

  • 把字符串每个字符 +3(Caesar)

  • 异或加密(XOR)

  • 字节倒序

  • 定制压缩算法

// 简单的异或加密
function xor(str, key) {return str.split('').map(c => String.fromCharCode(c.charCodeAt(0) ^ key)).join('');
}

4. 攻击角度:如何分析加密和混淆?

1)看数据格式

特征可能是什么
U2FsdGVkX1 开头AES + OpenSSL(CryptoJS)
字符全部为 hexAES/RC4/raw-byte
长度固定Hash,如 MD5/SHA1
多层 base64混淆

2)查代码关键点

  • 搜索:CryptoJS, AES, RSA, encrypt, sign, btoa, atob

  • 查看数据构造、参数生成逻辑

  • 找混淆函数、手动还原(AST 分析、动态调试)

3)动态调试定位加密逻辑

  • 使用浏览器断点调试(XHR、事件触发)

  • Hook JS 函数(如:CryptoJS.encrypt、btoa)

  • Frida 注入 APP 加密函数中间参数

5. Web 安全中加密与混淆的实战应用

场景加密/混淆用法
登录传参密码 AES/RSA 加密,防止被抓包重放
参数校验用 sign/signature 签名参数防篡改
WebSocket 通讯使用 base64 + AES 封装消息
JS 反调试所有关键变量、函数名混淆,配合动态密钥
JS逆向保护自定义的算法混淆函数逻辑,动态解密执行

6. 工具推荐

工具用途
Burp Suite + Decoder拆解多层混淆
JSDetox、AST Explorer还原 JS 混淆代码
CyberChef可视化多层解码
FridaHook APP 加密逻辑
Python + Crypto 库自定义脚本解密

总结

加密方式特征表现常见用途
Base64 多层只要 atob 多次即可还原数据混淆
AES + base64CryptoJS 明文加密后再编码登录、参数
RSA + base64一般只加密部分数据(如密码)登录验证
MD5、SHA 签名固定 32/64 长度,非可逆防篡改
异或、倒序、变形数据无固定长度,无库依赖隐藏算法

相关文章:

关于 Web安全:1. Web 安全基础知识

一、HTTP/HTTPS 协议详解 1. HTTP协议基础 什么是 HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff09;是互联网中浏览器和服务器之间传输数据的协议&#xff0c;基于请求-响应模式。它是一个无状态协议&#xff0c;意思是每次请求都是独立的&#x…...

debugfs:Linux 内核调试的利器

目录 一、什么是 debugfs&#xff1f;二、debugfs 的配置和启用方式2.1 内核配置选项2.2 挂载 debugfs2.3 Android 系统中的 debugfs 三、debugfs 的典型应用场景3.1 调试驱动开发3.2 内核子系统调试3.3 性能分析 四、常见 debugfs 子目录与功能示例4.1 /sys/kernel/debug/trac…...

Spyglass:跨时钟域同步(同步使能)

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 简介 同步使能方案主要用于数据信号跨时钟域同步&#xff0c;该方案将一个控制信号同步至目标时钟域并用其作为数据信号的捕获触发器的使能信号&#xff0c;如图1所示…...

安装Minikube

环境 CentOS7 参考 minikube start | minikube 创建虚拟机,参考 模拟Gitlab安装-CSDN博客 下载二进制包 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 报错不能解析host,配置host 下载成功 安装 sudo install minikube-linux-am…...

图像锐化调整

一、背景介绍 之前找多尺度做对比度增强时候&#xff0c;发现了一些锐化相关算法&#xff0c;正好本来也要整理锐化&#xff0c;这里就直接顺手对之前做过的锐化大概整理了下&#xff0c;方便后续用的时候直接抓了。 这里整理的锐化主要是两块&#xff1a;一个是参考论文&#…...

【CanMV K230】AI_CUBE1.4

《k230-AI 最近小伙伴有做模型的需求。所以我重新捡起来了。正好把之前没测过的测一下。 这次我们用的是全新版本。AICUBE1.4.dotnet环境9.0 注意AICUBE训练模型对硬件有所要求。最好使用独立显卡。 有小伙伴说集显也可以。emmmm可以试试哈 集显显存2G很勉强了。 我们依然用…...

STM32外设AD-定时器触发 + DMA读取模板

STM32外设AD-定时器触发 DMA读取模板 一&#xff0c;方法思路二&#xff0c;定时器基础与配置1&#xff0c;定时器时钟源 (Clock Source)2&#xff0c;预分频器 (Prescaler - PSC)3&#xff0c;自动重装载寄存器 (Auto-Reload Register - ARR) / 周期 (Period)4&#xff0c;触…...

数据库故障排查指南:从入门到精通

1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…...

【AT32】 AT32 移植 Freemodbus 主站

基于野火开发板 at32f437zgt6芯片 和at32 官方开发工具 移植了网上一套开源的freemodbus 主站 这里对modbus 协议不做过多的讲解 主要已实现代码为主 AT32 Work Bench 参考之前我之前的配置 与stm32cubemx软件差不多 注意485芯片的收发脚配置即可 AT32 IDE 说实话这软件太垃…...

内网环境下如何使用ntpdate实时同步时间

背景介绍 NTP&#xff08;Network Time Protocol&#xff09;是一种网络协议&#xff0c;用于同步计算机系统的时间。ntpdate是一个用于手动同步时间的命令行工具&#xff0c;它可以从指定的NTP服务器获取当前时间并更新本地系统时间。 ntpdate 服务介绍 功能&#xff1a;ntp…...

python版本管理工具-pyenv轻松切换多个Python版本

在使用python环境开发时&#xff0c;相信肯定被使用版本所烦恼&#xff0c;在用第三方库时依赖兼容的python版本不一样&#xff0c;有没有一个能同时安装多个python并能自由切换的工具呢&#xff0c;那就是pyenv&#xff0c;让你可以轻松切换多个Python 版本。 pyenv是什么 p…...

工商总局可视化模版 – 基于ECharts的大数据可视化HTML源码

概述 在大数据时代&#xff0c;数据可视化已成为各行各业进行数据分析和决策的重要工具。幽络源今天为大家带来一款基于ECharts的工商总局数据可视化HTML模版&#xff0c;帮助开发者快速搭建专业级工商广告数据展示平台。这款模版设计规范&#xff0c;功能完善&#xff0c;适合…...

计算机网络 : 网络基础

计算机网络 &#xff1a; 网络基础 目录 计算机网络 &#xff1a; 网络基础引言1. 网络发展背景2. 初始协议2.1 初始协议2.2 协议分层2.2.1 软件分层的好处2.2.2 OSI七层模型2.2.3 TCP/IP五层&#xff08;四层&#xff09;模型 2.3 TCP/IP协议2.3.1TCP/IP协议与操作系统的关系&…...

eSwitch manager 简介

eSwitch manager 的定义和作用 eSwitch manager 通常指的是能够配置和管理 eSwitch&#xff08;嵌入式交换机&#xff09;的实体或接口。在 NVIDIA/Mellanox 的网络架构中&#xff0c;Physical Function&#xff08;PF&#xff09;在 switchdev 模式下充当 eSwitch manager&am…...

物联网技术在银行安全用电系统中的应用与实践研究

摘要 随着金融科技的快速发展&#xff0c;银行业电子设备数量激增&#xff0c;用电安全管理问题日益突出。本文基于2019年农业银行与2020年中国邮政储蓄银行发布的安全用电相关政策&#xff0c;分析了银行场景下存在的五大用电安全隐患&#xff0c;提出以物联网技术为核心的安…...

589. N叉树的前序遍历迭代法:null指针与栈的巧妙配合

一、题目描述 给定一个N叉树的根节点&#xff0c;返回其节点值的前序遍历结果。前序遍历的定义是&#xff1a;先访问根节点&#xff0c;再依次遍历每个子节点&#xff08;从左到右&#xff09;。例如&#xff0c;对于如下N叉树&#xff1a; 1/ | \3 2 4 / \ 5 6前序遍历结果…...

【洗车店专用软件】佳易王洗车店多项目会员管理系统:一卡多用扣次软件系统实操教程 #扣次洗车管理软件

一、软件试用版资源文件下载说明 &#xff08;一&#xff09;若您想体验软件功能&#xff0c;可通过以下方式获取软件试用版资源文件&#xff1a; 访问头像主页&#xff1a;进入作者头像主页&#xff0c;找到第一篇文章&#xff0c;点击文章最后的卡片按钮&#xff0c;即可了解…...

小红书笔记详情接口如何调用?实操讲解。

调用小红书笔记详情接口通常需要经过申请权限、构建请求、发送请求并处理响应等步骤&#xff0c;以下是详细的实操讲解&#xff1a; 一、申请接口权限 注册小红书开放平台账号 访问小红书开放平台官网/第三方开放平台&#xff0c;按照提示完成注册流程&#xff0c;提供必要的…...

leetcode 57. Insert Interval

题目描述 代码&#xff1a;由于intervals已经按照左端点排序&#xff0c;并且intervals中的区间全部不重叠&#xff0c;那么可以断定intervals中所有区间的右端点也已经是有序的。先二分查找intervals中第一个其右端点>newInterval左端点的区间。然后按照类似于56. Merge In…...

杰理ac696配置mic

省电容mic有概率不出声解决办法如下...

COMSOL随机参数化表面流体流动模拟

基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害&#xff08;如滑坡&#xff09;等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌&#xff0c;并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…...

Linux远程连接服务

远程连接服务器简介 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机以取得可操作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在系统前面一样。 远程连接服务器的功能 分享主机的运算能力 远…...

用Python绘制梦幻星空

用Python绘制梦幻星空 在这篇教程中&#xff0c;我们将学习如何使用Python创建一个美丽的星空场景。我们将使用Python的图形库Pygame和随机库来创建闪烁的星星、流星和月亮&#xff0c;打造一个动态的夜空效果。 项目概述 我们将实现以下功能&#xff1a; 创建深蓝色的夜…...

EWOMAIL

1、错误 Problem: problem with installed package selinux-policy-targeted-3.14.3-41.el8.noarch package fail2ban-server-1.0.2-3.el8.noarch requires (fail2ban-selinux if selinux-policy-targeted), but none of the providers can be installed - package fail2ban-…...

网安面试经(1)

1.说说IPsec VPN 答&#xff1a;IPsec VPN是利用IPsec协议构建的安全虚拟网络。它通过加密技术&#xff0c;在公共网络中创建加密隧道&#xff0c;确保数据传输的保密性、完整性和真实性。常用于企业分支互联和远程办公&#xff0c;能有效防范数据泄露与篡改&#xff0c;但部署…...

【每天一个知识点】意图传播(Intent Propagation)

在人工智能(AI)快速发展的背景下,自然语言处理(NLP)已成为推动智能系统理解与生成自然语言的核心技术。其中,“意图识别”作为人机交互的关键步骤,已被广泛应用于智能客服、对话系统、语音助手等场景。而“意图传播”(Intent Propagation)作为更深层的机制,逐渐成为当…...

【串流VR手势】Pico 4 Ultra Enterprise 在 SteamVR 企业串流中无法识别手势的问题排查与解决过程(Pico4UE串流手势问题)

写在前面的话 此前&#xff08;用Pico 4U&#xff09;接入了MRTK3&#xff0c;现项目落地需要部署&#xff0c;发现串流场景中&#xff0c;Pico4UE的企业串流无法正常识别手势。&#xff08;一体机方式部署使用无问题&#xff09; 花了半小时解决&#xff0c;怕忘&#xff0c;…...

工具:shell命令提示符自定义之显示GIT当前分支

1 背景 在命令行操作&#xff0c;每次想查看当前分支都要手动执行命令&#xff08;git branch&#xff09;太麻烦了&#xff0c;想着在命令提示符上面显示当前分支&#xff0c;很直观也很方便 2 实现 编辑 vim ~/.bashrc 文件&#xff0c;添加如下内容 function update_prom…...

现代计算机图形学Games101入门笔记(十四)

Irradiance 微小的能量/微小的面积 用Irradiance解释能量大小解释冬夏 Intensity没变&#xff0c;但是Irradiance是衰减的&#xff0c;外圈面积变大&#xff0c;单位面积上接受的能量就变小了。 入射进来 离开 这里就是从某个方向来了一个能量&#xff0c;经过反射&#xff0c…...

前端开发笔记与实践

一、Vue 开发规范与响应式机制 1. 组件命名规范 自定义组件使用大驼峰命名法&#xff08;如 MyComponent&#xff09;&#xff0c;符合 Vue 官方推荐&#xff0c;便于与原生 HTML 元素区分。 2. Proxy vs defineProperty 特性Proxy&#xff08;Vue3&#xff09;Object.defi…...

机器学习知识自然语言处理入门

一、引言&#xff1a;当文字遇上数学 —— 自然语言的数字化革命 在自然语言处理&#xff08;NLP&#xff09;的世界里&#xff0c;计算机要理解人类语言&#xff0c;首先需要将文字转化为数学向量。早期的 One-Hot 编码如同给每个词语分配一个唯一的 “房间号”&#xff0c;例…...

泰迪杯特等奖案例深度解析:基于多级二值化与CNN回归的车牌识别系统设计

(第八届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 行业痛点与场景需求 在智慧交通与无感支付场景中,车牌识别是核心环节。传统车牌识别系统在复杂光照、污损车牌、多角度倾斜等场景下存在显著缺陷。根据某智慧油站2024年运营数据显示,高峰期…...

ai agent(智能体)开发 python高级应用5:crawl4ai 如何建立一个全面的知识库 第一步找分类

让我们充分利用爬虫功能建立自己丰富的知识库&#xff0c; 第一步找分类 以下是一个层次分明、覆盖全面的知识库分类体系&#xff0c;分为9大主类、43个子类&#xff0c;并融入交叉学科和新兴领域设计&#xff1a; 一、经济与商业 宏观经济&#xff08;全球经济/国家政策&a…...

Solon Ai Flow 编排开发框架发布预告(效果预览)

Solon Ai 在推出 Solon Ai Mcp 后&#xff0c;又将推出 Solon Ai Flow。 1、Solon Ai Flow 是个啥&#xff1f; Solon Ai Flow 是一个智能体编排开发框架。它是框架&#xff01;不是工具&#xff0c;不是产品&#xff08;这与市面上流行的工具和产品&#xff0c;有较大差别&a…...

【言语】刷题5(填空)

front&#xff1a;刷题5 第一个词排除人迹罕至 人迹罕至&#xff1a;很少有人去的地方。指偏僻荒涼的地方。&#xff08;荒郊野岭既视感的一个词&#xff09; 第二个空锁定B&#xff0c;太贴合语义了 第三个空排除一文不值&#xff0c;百无一用&#xff0c;现在这题已经可以过了…...

技术解码 | 腾讯云SRT弱网优化

随着互联网基础设施和硬件设备的不断发展。广大直播观众对于直播观看的清晰度&#xff0c;延时等方面的体验要求越来越高&#xff0c;直播也随之进入了低延迟高码率的时代&#xff0c;直播传输技术也面临着越来越高的要求和挑战。 腾讯视频云为此在全链路上针对流媒体传输不断深…...

“分布形态“

一、分布形态的基础分类 1、正态分布(对称分布) (1)特征:钟型曲线,均值=中位数=众数;约68%数据在μσ范围内,95%在μ2σ内。 (2)应用:身高、体重、测量误差等自然现象。 (3)重要性:多数统计方法(如T检验、方差分析)假设数据正态性。 2、偏态分布 (1)左偏(负…...

Android minSdk从21升级24后SO库异常

问题 minSdk从21调整到24后&#xff1a; java.nio.file.NoSuchFileException: /data/app/~~Z9s2NfuDdclOUwUBLKnk0A/com.rs.unity- Bg31QvFwF4qsCwv2XCqT-w/split_config.arm64_v8a.apkjava.nio.file.NoSuchFileException: /data/app/~~Z9s2NfuDdclOUwUBLKnk0A/com.rs.unity-…...

C#进阶(2)stack(栈)

前言 我们前面介绍了ArrayList,今天就介绍另一种数据结构——栈。 这是栈的基本形式,博主简单画了一下,你看个意思就行,很明显,这种数据有一种特征:先进后出。因为先进来的数据会在下面,下面是密闭的,所以只能取后面进来的。 C#为我们封好了这种数据结构,我们不用担…...

Linux du 命令终极指南:从基础到精通

文章目录 Linux du 命令终极指南&#xff1a;从基础到精通du 命令简介常用参数详解常见用法示例查看当前目录总大小查看当前目录及其子目录占用空间只显示当前目录总占用空间查看目录下每个文件和子目录的大小查看某目录深度为 1 的大小分布查看某目录并排除日志文件查看多个目…...

【Linux网络】数据链路层

数据链路层 用于两个设备&#xff08;同一种数据链路节点&#xff09;之间进行传递。 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。例如&#xff1a;规定了网络拓扑结…...

水库雨水情测报与安全监测系统解决方案

一、方案概述 本水库雨水情测报与安全监测解决方案的核心目标在于利用尖端的技术手段&#xff0c;确保对水库雨水情势以及大坝安全状况的持续监控和及时预警&#xff0c;从而为水库的稳定运行提供坚实的支持和保障。该方案严格遵循“统筹协调、因库制宜、实用有效、信息共享”的…...

Shotcut:免费开源的视频编辑利器

Shotcut是一款功能强大且完全免费的开源视频编辑软件&#xff0c;专为需要高效、灵活视频编辑的用户设计。它支持多种常见视频格式&#xff0c;如MP4、AVI、MOV等&#xff0c;并提供了丰富的视频编辑功能&#xff0c;满足用户在不同场景下的需求。无论是初学者还是专业人士&…...

学习海康VisionMaster之直方图工具

一&#xff1a;进一步学习了 今天学习下VisionMaster中的直方图工具&#xff1a;就是统计在ROI范围内进行灰度级分布的统计 二&#xff1a;开始学习 1&#xff1a;什么是直方图工具&#xff1f; 直方图工具针对输入灰度图像的指定ROI区域&#xff0c;输出该区域的图像灰度直方…...

AI 笔记 -基于retinaface的FPN上采样替换为CARAFE

上采样替换为CARAFE 引言内容感知特征重组&#xff08;CARAFE&#xff09;公式化核预测模块 引言 简介&#xff1a;CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;&#xff0c;是用于增强卷积神经网络特征图的上采样方法&#xff0c;论文被 ICCV 2019 接…...

Visual Studio 2022 中添加“高级保存选项”及解决编码问题

文章目录 一、背景二、方法方法一&#xff1a;通过菜单栏手动添加&#xff08;推荐&#xff09;方法二&#xff1a;通过拖拽快速添加&#xff08;替代方案&#xff09; 三、验证与使用四、补充说明五、所能解决的问题 一、背景 VS 在开发cmake项目的过程中&#xff0c;可能会遇…...

SQLMesh 增量模型从入门到精通:5步实现高效数据处理

本文深入解析 SQLMesh 中的增量时间范围模型&#xff0c;介绍其核心原理、配置方法及高级特性。通过实际案例说明如何利用该模型提升数据加载效率&#xff0c;降低计算资源消耗&#xff0c;并提供配置示例与最佳实践建议&#xff0c;帮助读者在实际项目中有效应用这一强大功能。…...

嵌入式开发书籍推荐

嵌入式开发是将计算机技术、微电子技术与各行业应用相结合的综合技术&#xff0c;学习过程中需要多方面知识储备。以下精选书籍&#xff0c;从基础到进阶&#xff0c;助你系统掌握嵌入式开发知识。 基础理论类 《计算机组成原理》&#xff08;唐朔飞版&#xff09;&#xff1…...

实变函数 第二章 点集

2 点集 2.1 欧式空间 2.1.1 度量空间、欧式空间 Definition \textbf{Definition} Definition 度量空间 (距离空间) 若 ∀ x , y ∈ X : ∃ d : ( x , y ) → R \forall x,y\in X:\exists d:(x,y)\to\mathbb{R} ∀x,y∈X:∃d:(x,y)→R&#xff0c;满足&#xff1a; d ( x , y…...

国芯思辰| 轮速传感器AH741对标TLE7471应用于汽车车轮速度感应

在汽车应用中&#xff0c;轮速传感器可用于车轮速度感应&#xff0c;为 ABS、ESC 等安全系统提供精确的轮速信息&#xff0c;帮助这些系统更好地发挥作用&#xff0c;在紧急制动或车辆出现不稳定状态时&#xff0c;及时调整车轮的制动力或动力分配。 国芯思辰两线制差分式轮速…...