prompt_issue_summary.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package securityaudit
  2. import (
  3. "crypto/sha256"
  4. "encoding/hex"
  5. )
  6. func BuildIssueSummaries(result NormalizedResult) []IssueSummary {
  7. resultCategories := result.Categories
  8. if len(resultCategories) == 0 {
  9. resultCategories = result.MatchedScanners
  10. }
  11. summaries := make([]IssueSummary, 0, len(resultCategories)+len(result.UnknownCategories))
  12. for _, category := range resultCategories {
  13. definition, ok := ScannerCatalog[category]
  14. if !ok {
  15. continue
  16. }
  17. evidence := RedactPreview(result.ScannerEvidence[category], 160)
  18. if evidence == "" {
  19. evidence = definition.Label
  20. }
  21. digest := sha256.Sum256([]byte(evidence))
  22. summaries = append(summaries, IssueSummary{
  23. Category: category, ScannerID: category, Title: definition.LabelZH,
  24. Description: definition.Description, Severity: string(result.RiskLevel),
  25. SeverityLabel: riskLabelZH(result.RiskLevel), Action: string(result.Action),
  26. ActionLabel: actionLabelZH(result.Action), Code: "prompt_audit_" + category,
  27. Score: result.ScannerScores[category], Evidence: evidence,
  28. EvidenceHash: hex.EncodeToString(digest[:]),
  29. })
  30. }
  31. for _, category := range result.UnknownCategories {
  32. evidence := "unknown_unsafe"
  33. digest := sha256.Sum256([]byte(evidence + ":" + category))
  34. summaries = append(summaries, IssueSummary{
  35. Category: category, ScannerID: "unknown_unsafe", Title: "未知高风险分类",
  36. Description: "审计节点返回了未知但不可忽略的高风险分类", Severity: string(RiskCritical),
  37. SeverityLabel: riskLabelZH(RiskCritical), Action: string(ActionBlock),
  38. ActionLabel: actionLabelZH(ActionBlock), Code: "prompt_audit_unknown_unsafe",
  39. Score: 1, Evidence: evidence, EvidenceHash: hex.EncodeToString(digest[:]),
  40. })
  41. }
  42. return summaries
  43. }
  44. func riskLabelZH(risk RiskLevel) string {
  45. switch risk {
  46. case RiskCritical:
  47. return "严重"
  48. case RiskHigh:
  49. return "高"
  50. case RiskMedium:
  51. return "中"
  52. default:
  53. return "低"
  54. }
  55. }
  56. func actionLabelZH(action Action) string {
  57. switch action {
  58. case ActionBlock:
  59. return "阻止"
  60. case ActionWarn:
  61. return "警告"
  62. default:
  63. return "允许"
  64. }
  65. }