You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
"""
|
|
漏洞数据模型
|
|
"""
|
|
from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, ForeignKey, Enum, Float
|
|
from sqlalchemy.sql import func
|
|
from sqlalchemy.orm import relationship
|
|
import enum
|
|
from app.database import Base
|
|
|
|
class SeverityLevel(enum.Enum):
|
|
"""严重程度枚举"""
|
|
CRITICAL = "critical"
|
|
HIGH = "high"
|
|
MEDIUM = "medium"
|
|
LOW = "low"
|
|
INFO = "info"
|
|
|
|
class VulnerabilityCategory(enum.Enum):
|
|
"""漏洞分类枚举"""
|
|
SECURITY = "security"
|
|
PERFORMANCE = "performance"
|
|
MAINTAINABILITY = "maintainability"
|
|
RELIABILITY = "reliability"
|
|
USABILITY = "usability"
|
|
|
|
class VulnerabilityStatus(enum.Enum):
|
|
"""漏洞状态枚举"""
|
|
OPEN = "open"
|
|
FIXED = "fixed"
|
|
FALSE_POSITIVE = "false_positive"
|
|
WONT_FIX = "wont_fix"
|
|
|
|
class Vulnerability(Base):
|
|
"""漏洞模型"""
|
|
__tablename__ = "vulnerabilities"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
scan_id = Column(Integer, ForeignKey("scans.id"), nullable=False)
|
|
|
|
# 漏洞基本信息
|
|
rule_id = Column(String(100), nullable=False) # 规则ID
|
|
message = Column(Text, nullable=False) # 漏洞描述
|
|
category = Column(Enum(VulnerabilityCategory), nullable=False)
|
|
severity = Column(Enum(SeverityLevel), nullable=False)
|
|
|
|
# 位置信息
|
|
file_path = Column(String(500), nullable=False)
|
|
line_number = Column(Integer)
|
|
column_number = Column(Integer)
|
|
end_line = Column(Integer)
|
|
end_column = Column(Integer)
|
|
|
|
# 代码上下文
|
|
code_snippet = Column(Text) # 相关代码片段
|
|
context_before = Column(Text) # 前置代码上下文
|
|
context_after = Column(Text) # 后置代码上下文
|
|
|
|
# AI增强信息
|
|
ai_enhanced = Column(Boolean, default=False)
|
|
ai_confidence = Column(Float) # AI置信度 0-1
|
|
ai_suggestion = Column(Text) # AI修复建议
|
|
|
|
# 状态管理
|
|
status = Column(Enum(VulnerabilityStatus), default=VulnerabilityStatus.OPEN)
|
|
assigned_to = Column(String(100)) # 分配给谁
|
|
fix_commit = Column(String(100)) # 修复的提交哈希
|
|
|
|
# 时间戳
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
fixed_at = Column(DateTime(timezone=True))
|
|
|
|
# 关联关系
|
|
scan = relationship("Scan", back_populates="vulnerabilities")
|
|
|
|
def __repr__(self):
|
|
return f"<Vulnerability(id={self.id}, rule_id='{self.rule_id}', severity='{self.severity.value}')>"
|