🧩 便捷方法
🧩 功能点 · pkg/cvss
Cvss3x 自带一族小型只读辅助方法:版本探测(Version、Is30、Is31)、分组存在性检查(HasTemporalMetrics、HasEnvironmentalMetrics)、结构比较(Equal、IsComplete)、拷贝(Clone、BaseOnly)以及基于分数的比较(EqualScore、SameSeverity)。它们是其它功能组合的基础积木。
简介
cv, _ := parser.ParseString("CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H")
cv.Is31() // true
cv.IsComplete() // true——8 个基础指标全设置
clone := cv.Clone() // 深拷贝,接收者不变
clone.Equal(cv) // true
base := cv.BaseOnly() // 已剥离 temporal/env工作原理
这些辅助函数分四组:版本探测读 MajorVersion/MinorVersion;存在性检查扫描子结构指针是否有任一非 nil 向量;Equal/Clone/BaseOnly 并行遍历基础/时间/环境组;基于评分的比较委托给 Calculator.GetBaseScore 与 GetSeverity。
接口参考
版本探测
func (x *Cvss3x) Version() string // "3.0" 或 "3.1"
func (x *Cvss3x) Is30() bool // MajorVersion==3 && MinorVersion==0
func (x *Cvss3x) Is31() bool // MajorVersion==3 && MinorVersion==1分组存在性
func (x *Cvss3x) HasTemporalMetrics() bool // E/RL/RC 任一已设置
func (x *Cvss3x) HasEnvironmentalMetrics() bool // CR/IR/AR/M* 任一已设置对应子结构为 nil 或组内无指标已设置时返回 false。GetTemporalVectorString 与计算器据此决定渲染/计算哪些区段。
结构比较与拷贝
func (x *Cvss3x) Equal(other *Cvss3x) bool // 版本 + 所有指标相等
func (x *Cvss3x) Clone() *Cvss3x // 深拷贝
func (x *Cvss3x) BaseOnly() *Cvss3x // 仅保留基础指标的副本
func (x *Cvss3x) IsComplete() bool // 8 个基础指标全设置Equal 比较版本与每个已设置指标(通过 Cvss3xBase/Cvss3xTemporal/Cvss3xEnvironmental 上的 Equal 方法)。Clone 拷贝结构及其子结构;由于 vector.Vector 指针不可变,共享是安全的。BaseOnly 返回仅保留 Cvss3xBase 的副本——便于将基础分与完整分对比。IsComplete 只检查 8 个基础指标,不查版本或可选组。
IsComplete 与 Check 的区别
IsComplete 是对 8 个基础指标的轻量 nil 与存在性检查。计算器使用的 Check() 执行更深层的校验。IsComplete 适合快速判断"能否尝试评分"。
基于分数的比较
func (x *Cvss3x) EqualScore(other *Cvss3x) (bool, error) // 基础分是否相同?
func (x *Cvss3x) SameSeverity(other *Cvss3x) (bool, error) // 基础严重性桶是否相同?二者各用一个新的 Calculator 计算基础分并比较。EqualScore 比较数值;SameSeverity 比较严重性桶(7.1 与 7.8 视为"同严重性"——都是 High)。两侧都为 nil 时返回 (true, nil);一侧为 nil 另一侧不为 nil 时返回 x == other 的结果。
same, err := a.SameSeverity(b) // 若都落入 High 等则 true仅比较基础分
EqualScore 与 SameSeverity 刻意使用 GetBaseScore,而非环境/时间主分数。要比较完整环境分,请自行评分后比较数值。
示例
package main
import (
"fmt"
"github.com/scagogogo/cvss-skills/pkg/parser"
)
func main() {
cv, err := parser.ParseString(
"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:F/RL:U/RC:C")
if err != nil {
panic(err)
}
fmt.Println(cv.Version()) // 3.1
fmt.Println(cv.Is31(), cv.Is30()) // true false
fmt.Println(cv.HasTemporalMetrics()) // true(E/RL/RC 已设置)
fmt.Println(cv.HasEnvironmentalMetrics()) // false
fmt.Println(cv.IsComplete()) // true
// Clone 是深拷贝;Equal 确认值相同。
clone := cv.Clone()
fmt.Println(clone.Equal(cv)) // true
// BaseOnly 剥离 temporal/environmental,便于基础分的对等比较。
base := cv.BaseOnly()
fmt.Println(base.HasTemporalMetrics()) // false
// SameSeverity 比较严重性桶,而非精确分数。
other, _ := parser.ParseString("CVSS:3.1/AV:L/AC:H/PR:H/UI:R/S:U/C:H/I:H/A:H")
same, _ := cv.SameSeverity(other)
fmt.Println(same) // 若两者落入同一桶则 true
}