@comate/zulu 1.2.1-beta.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/comate-engine/assets/skills/auto-commit-comate/SKILL.md +260 -0
  2. package/comate-engine/assets/skills/auto-commit-comate/references/data_structures.md +189 -0
  3. package/comate-engine/assets/skills/auto-commit-comate/references/new_version_instruction.md +209 -0
  4. package/comate-engine/assets/skills/auto-commit-comate/references/old_version_instruction.md +208 -0
  5. package/comate-engine/assets/skills/auto-commit-comate/scripts/git_diff_cli.py +196 -0
  6. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/git_utils.py +20 -10
  7. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/client.py +69 -40
  8. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/farseer.py +8 -9
  9. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/matching.py +65 -9
  10. package/comate-engine/assets/skills/auto-commit-comate/scripts/match_card_cli.py +37 -0
  11. package/comate-engine/assets/skills/cnap-comate/SKILL.md +157 -0
  12. package/comate-engine/assets/skills/cnap-comate/references/cases.md +198 -0
  13. package/comate-engine/assets/skills/cnap-comate/references/deploy-troubleshoot.md +15 -0
  14. package/comate-engine/assets/skills/cnap-comate/references/install.md +43 -0
  15. package/comate-engine/assets/skills/cnap-comate/references/kubectl.md +55 -0
  16. package/comate-engine/assets/skills/cnap-comate/references/login.md +125 -0
  17. package/comate-engine/assets/skills/cnap-comate/references/oncall.md +24 -0
  18. package/comate-engine/assets/skills/cnap-comate/scripts/install_cnap_cli.sh +36 -0
  19. package/comate-engine/assets/skills/code-security/SKILL.md +176 -0
  20. package/comate-engine/assets/skills/code-security/references/credential_hosting.md +102 -0
  21. package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +219 -0
  22. package/comate-engine/assets/skills/code-security/scripts/build_repair_info.py +0 -0
  23. package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +99 -0
  24. package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +350 -0
  25. package/comate-engine/assets/skills/code-security/scripts/http_client.py +173 -0
  26. package/comate-engine/assets/skills/code-security/scripts/parse_scan_result.py +301 -0
  27. package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +261 -0
  28. package/comate-engine/assets/skills/code-security/scripts/report_chat.py +198 -0
  29. package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +316 -0
  30. package/comate-engine/assets/skills/code-security-comate/SKILL.md +219 -0
  31. package/comate-engine/assets/skills/code-security-comate/references/credential_hosting.md +102 -0
  32. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-go_sql_injection.md +399 -0
  33. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-java_sql_injection.md +591 -0
  34. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-php_sql_injection.md +318 -0
  35. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-python_sql_injection.md +198 -0
  36. package/comate-engine/assets/skills/code-security-comate/references/vul_repair_sensitive.md +219 -0
  37. package/comate-engine/assets/skills/code-security-comate/scripts/credential_hosting.py +87 -0
  38. package/comate-engine/assets/skills/code-security-comate/scripts/credential_poll.py +345 -0
  39. package/comate-engine/assets/skills/code-security-comate/scripts/http_client.py +173 -0
  40. package/comate-engine/assets/skills/code-security-comate/scripts/parse_scan_result.py +392 -0
  41. package/comate-engine/assets/skills/code-security-comate/scripts/repair_vulnerability.py +245 -0
  42. package/comate-engine/assets/skills/code-security-comate/scripts/report_chat.py +145 -0
  43. package/comate-engine/assets/skills/code-security-comate/scripts/scan_vulnerability.py +444 -0
  44. package/comate-engine/assets/skills/code-security-comate/scripts/utils.py +153 -0
  45. package/comate-engine/assets/skills/comate-docs-comate/SKILL.md +148 -0
  46. package/comate-engine/assets/skills/comate-docs-comate/references/doc-map-extended.md +78 -0
  47. package/comate-engine/assets/skills/comate-docs-comate/references/models-and-billing.md +51 -0
  48. package/comate-engine/assets/skills/comate-docs-comate/references/product-overview.md +73 -0
  49. package/comate-engine/assets/skills/comate-docs-comate/references/query_content.md +83 -0
  50. package/comate-engine/assets/skills/comate-docs-comate/references/query_repo.md +57 -0
  51. package/comate-engine/assets/skills/comate-docs-comate/scripts/ku_operator.py +1575 -0
  52. package/comate-engine/assets/skills/create-image-comate/SKILL.md +278 -0
  53. package/comate-engine/assets/skills/create-skill-comate/SKILL.md +308 -217
  54. package/comate-engine/assets/skills/create-skill-comate/agents/analyzer.md +274 -0
  55. package/comate-engine/assets/skills/create-skill-comate/agents/comparator.md +202 -0
  56. package/comate-engine/assets/skills/create-skill-comate/agents/grader.md +223 -0
  57. package/comate-engine/assets/skills/create-skill-comate/assets/eval_review.html +146 -0
  58. package/comate-engine/assets/skills/create-skill-comate/eval-viewer/generate_review.py +489 -0
  59. package/comate-engine/assets/skills/create-skill-comate/eval-viewer/viewer.html +1325 -0
  60. package/comate-engine/assets/skills/create-skill-comate/references/schemas.md +430 -0
  61. package/comate-engine/assets/skills/create-skill-comate/scripts/__init__.py +0 -0
  62. package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  63. package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/aggregate_benchmark.cpython-311.pyc +0 -0
  64. package/comate-engine/assets/skills/create-skill-comate/scripts/aggregate_benchmark.py +412 -0
  65. package/comate-engine/assets/skills/create-skill-comate/scripts/generate_report.py +334 -0
  66. package/comate-engine/assets/skills/create-skill-comate/scripts/package_skill.py +140 -0
  67. package/comate-engine/assets/skills/create-skill-comate/scripts/utils.py +53 -0
  68. package/comate-engine/assets/skills/find-skills-comate/SKILL.md +15 -12
  69. package/comate-engine/assets/skills/find-skills-comate/scripts/fetch_skills.py +32 -3
  70. package/comate-engine/assets/skills/get-ugate-token-comate/SKILL.md +159 -0
  71. package/comate-engine/assets/skills/get-ugate-token-comate/getUgateToken.py +150 -0
  72. package/comate-engine/assets/skills/icafe-comate/SKILL.md +240 -0
  73. package/comate-engine/assets/skills/icafe-comate/references/ai-workflows.md +233 -0
  74. package/comate-engine/assets/skills/icafe-comate/references/commands.md +1147 -0
  75. package/comate-engine/assets/skills/icafe-comate/references/error-handling.md +164 -0
  76. package/comate-engine/assets/skills/icafe-comate/references/git-auto-bindcard-workflow.md +201 -0
  77. package/comate-engine/assets/skills/icafe-comate/references/git-bindcard-workflow.md +327 -0
  78. package/comate-engine/assets/skills/icafe-comate/references/iql-syntax.md +327 -0
  79. package/comate-engine/assets/skills/icafe-comate/references/platform-concepts.md +317 -0
  80. package/comate-engine/assets/skills/icafe-comate/references/smart-create-workflow.md +171 -0
  81. package/comate-engine/assets/skills/icafe-comate/references/smart-find-workflow.md +127 -0
  82. package/comate-engine/assets/skills/icafe-comate/references/smart-update-workflow.md +118 -0
  83. package/comate-engine/assets/skills/icode-comate/SKILL.md +366 -0
  84. package/comate-engine/assets/skills/icode-comate/references/api/add_reviewers.md +44 -0
  85. package/comate-engine/assets/skills/icode-comate/references/api/build_fetch_command.md +89 -0
  86. package/comate-engine/assets/skills/icode-comate/references/api/check_repo_permission.md +89 -0
  87. package/comate-engine/assets/skills/icode-comate/references/api/create_branch.md +79 -0
  88. package/comate-engine/assets/skills/icode-comate/references/api/create_draft_comment.md +109 -0
  89. package/comate-engine/assets/skills/icode-comate/references/api/get_ai_cr_result.md +190 -0
  90. package/comate-engine/assets/skills/icode-comate/references/api/get_ai_review.md +97 -0
  91. package/comate-engine/assets/skills/icode-comate/references/api/get_diff_content.md +92 -0
  92. package/comate-engine/assets/skills/icode-comate/references/api/get_diff_file.md +88 -0
  93. package/comate-engine/assets/skills/icode-comate/references/api/get_machine_check.md +73 -0
  94. package/comate-engine/assets/skills/icode-comate/references/api/get_my_reviews.md +115 -0
  95. package/comate-engine/assets/skills/icode-comate/references/api/get_person_commit.md +89 -0
  96. package/comate-engine/assets/skills/icode-comate/references/api/get_person_repo.md +63 -0
  97. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_branch.md +62 -0
  98. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_config.md +91 -0
  99. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_members.md +118 -0
  100. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_reviews.md +91 -0
  101. package/comate-engine/assets/skills/icode-comate/references/api/get_review_comments.md +87 -0
  102. package/comate-engine/assets/skills/icode-comate/references/api/get_review_info.md +81 -0
  103. package/comate-engine/assets/skills/icode-comate/references/api/get_submit_settings.md +105 -0
  104. package/comate-engine/assets/skills/icode-comate/references/api/icode-api.md +86 -0
  105. package/comate-engine/assets/skills/icode-comate/references/api/publish_comments.md +72 -0
  106. package/comate-engine/assets/skills/icode-comate/references/api/set_review_score.md +58 -0
  107. package/comate-engine/assets/skills/icode-comate/references/api/start_ai_review.md +77 -0
  108. package/comate-engine/assets/skills/icode-comate/references/api/submit_review.md +50 -0
  109. package/comate-engine/assets/skills/icode-comate/references/api/trigger_ai_cr.md +63 -0
  110. package/comate-engine/assets/skills/icode-comate/references/feature/add-reviewer.md +92 -0
  111. package/comate-engine/assets/skills/icode-comate/references/feature/fix-machine-check.md +144 -0
  112. package/comate-engine/assets/skills/icode-comate/references/feature/merge-cr.md +100 -0
  113. package/comate-engine/assets/skills/icode-comate/references/feature/ssh-setup.md +106 -0
  114. package/comate-engine/assets/skills/icode-comate/references/feature/submit-acr.md +135 -0
  115. package/comate-engine/assets/skills/icode-comate/references/feature/submit-cr.md +123 -0
  116. package/comate-engine/assets/skills/icode-comate/references/git/clone.md +67 -0
  117. package/comate-engine/assets/skills/icode-comate/references/git/icode-git.md +68 -0
  118. package/comate-engine/assets/skills/icode-comate/references/git/push.md +64 -0
  119. package/comate-engine/assets/skills/icode-comate/references/git/push_cr.md +103 -0
  120. package/comate-engine/assets/skills/icode-comate/references/install.md +144 -0
  121. package/comate-engine/assets/skills/icode-comate/references/login.md +111 -0
  122. package/comate-engine/assets/skills/icode-comate/scripts/add-reviewer.sh +154 -0
  123. package/comate-engine/assets/skills/icode-comate/scripts/common.sh +145 -0
  124. package/comate-engine/assets/skills/icode-comate/scripts/fix-machine-check.sh +131 -0
  125. package/comate-engine/assets/skills/icode-comate/scripts/merge-cr.sh +105 -0
  126. package/comate-engine/assets/skills/icode-comate/scripts/ssh-setup.sh +159 -0
  127. package/comate-engine/assets/skills/icode-comate/scripts/submit-acr.sh +236 -0
  128. package/comate-engine/assets/skills/icode-comate/scripts/submit-cr.sh +104 -0
  129. package/comate-engine/assets/skills/icode-comate/scripts/test-preflight.sh +89 -0
  130. package/comate-engine/assets/skills/ku-operator-comate/SKILL.md +121 -0
  131. package/comate-engine/assets/skills/ku-operator-comate/examples.md +190 -0
  132. package/comate-engine/assets/skills/ku-operator-comate/references/add_member.md +49 -0
  133. package/comate-engine/assets/skills/ku-operator-comate/references/change_scope.md +38 -0
  134. package/comate-engine/assets/skills/ku-operator-comate/references/copy_doc.md +50 -0
  135. package/comate-engine/assets/skills/ku-operator-comate/references/create_doc.md +61 -0
  136. package/comate-engine/assets/skills/ku-operator-comate/references/delete_doc.md +31 -0
  137. package/comate-engine/assets/skills/ku-operator-comate/references/edit_content.md +568 -0
  138. package/comate-engine/assets/skills/ku-operator-comate/references/move_doc.md +45 -0
  139. package/comate-engine/assets/skills/ku-operator-comate/references/query_comment.md +79 -0
  140. package/comate-engine/assets/skills/ku-operator-comate/references/query_content.md +83 -0
  141. package/comate-engine/assets/skills/ku-operator-comate/references/query_flowchart.md +84 -0
  142. package/comate-engine/assets/skills/ku-operator-comate/references/query_permission.md +38 -0
  143. package/comate-engine/assets/skills/ku-operator-comate/references/query_recent_view.md +67 -0
  144. package/comate-engine/assets/skills/ku-operator-comate/references/query_repo.md +57 -0
  145. package/comate-engine/assets/skills/ku-operator-comate/references/query_user_info.md +37 -0
  146. package/comate-engine/assets/skills/ku-operator-comate/references/update_member.md +41 -0
  147. package/comate-engine/assets/skills/ku-operator-comate/references/upload_attachment.md +52 -0
  148. package/comate-engine/assets/skills/ku-operator-comate/scripts/ku_operator.py +1575 -0
  149. package/comate-engine/node_modules/better-sqlite3/node_modules/.bin/prebuild-install +2 -2
  150. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build +2 -2
  151. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional +2 -2
  152. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-test +2 -2
  153. package/comate-engine/package.json +2 -0
  154. package/comate-engine/server.js +170 -46
  155. package/dist/bundle/index.js +8 -8
  156. package/package.json +1 -1
  157. package/comate-engine/assets/skills/figma2code-comate/codeConnect.md +0 -37
  158. package/comate-engine/assets/skills/figma2code-comate/designToken.md +0 -3
  159. package/comate-engine/assets/skills/figma2code-comate/f2cMcp.md +0 -59
  160. package/comate-engine/assets/skills/smart-commit/SKILL.md +0 -646
  161. package/comate-engine/node_modules/@comate/plugin-host/dist/index-AZIho4HV.js +0 -1
  162. package/comate-engine/node_modules/@comate/plugin-host/dist/user-BIpzRUfb.js +0 -44
  163. package/comate-engine/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
  164. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/issue_type_mapping.json +0 -0
  165. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/query_reference.md +0 -0
  166. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/compat.py +0 -0
  167. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/create_card_cli.py +0 -0
  168. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/__init__.py +0 -0
  169. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/logger.py +0 -0
  170. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/recognize_card_cli.py +0 -0
@@ -0,0 +1,399 @@
1
+ go sqli 漏洞修复知识
2
+
3
+ ## Go sqli 漏洞修复最佳实践
4
+ 采用先分析漏洞报告->分析数据传递链路->判断是否存在依赖->分析修复方式(判断是否可以修复、使用哪种修复方式)->修复漏洞->**验证修复代码可编译且逻辑正确**(检查 import、函数重复定义、变量作用域、占位符数量匹配等)(注意:**不要做与漏洞修复无关的代码改动**)。
5
+
6
+ ## 漏洞分析
7
+ ### 不可修复场景
8
+ 1. sql 语句为外部包生成或者传入,不是当前数据流链路的函数或者源码中定义生成,无法确定 sql 语句的信息,该场景需要进行 sql 语法检查,拆解整个 sql 语句,才可能保证安全且不干扰原始业务运行,所以这里作为不可修复场景,不进行漏洞修复。
9
+ 2. 污点数据拼接到 sql 语句时,是作为 sql 语句中 select、update、delete 等子句,且无法确定子句具体信息,也是不可修复场景,不进行漏洞修复。
10
+
11
+ ### 可修复场景
12
+ 1. 漏洞修复必须在 **SQL 执行语句(sink 点)所在的文件和函数内**完成,不要创建新的代码文件。
13
+ 2. 同个文件进行参数过滤时,可以在文件头定义过滤正则,如果定义已经存在,可以直接复用。
14
+ 3. 对于 where 列名(操作符)之后的 value、insert 的values、like 的 value,需要使用**预编译/参数绑定**的方式进行漏洞修复。**注意**:LIKE 子句的值虽然可以预编译,但 `%` 和 `_` 是 SQL 通配符,若用户输入包含这些字符可能导致非预期的模糊匹配。如需精确匹配,应先转义这些字符:
15
+
16
+ ```go
17
+ // LIKE 值转义示例
18
+ import "strings"
19
+
20
+ func escapeLikeValue(s string) string {
21
+ s = strings.ReplaceAll(s, "\\", "\\\\")
22
+ s = strings.ReplaceAll(s, "%", "\\%")
23
+ s = strings.ReplaceAll(s, "_", "\\_")
24
+ return s
25
+ }
26
+ // 使用示例:WHERE name LIKE ?
27
+ db.Query("SELECT * FROM users WHERE name LIKE ?", "%"+escapeLikeValue(keyword)+"%")
28
+ ```
29
+ 4. 表名、列名、视图名称、DataBase 名称等拼接进入SQL 语句时需要进行过滤的方式修复漏洞,过滤使用的正则:`"^[\w\s\[\]"`$.,*]+$"`。
30
+ 5. show、create 、drop、grant 语句场景不支持预编译参数方式修复漏洞,需要使用对污点参数进行过滤的方法进行修复,过滤使用的正则:`"^[\w\s\[\]"`$.,*]+$"`。
31
+ 6. 对于 limit、SortBy、orderBy 等子句无法使用预编译,需要使用 `"^[\w\s\[\]"`$.,*]+$"` 过滤。
32
+ 7. 当前框架支持安全写法时,优先使用框架安全写法,在无法使用安全写法时,才使用过滤等方案进行漏洞修复(注意不可修复场景不需要强行进行过滤修复)。
33
+ 8. 几何函数例如ST_GeometryN,第一个参数为列名,不支持预编译,如果污点数据传入,需要过滤 `"^[\w\s\[\]"`$.,*]+$"`,第二个参数支持预编译,使用预编译方式修复。
34
+ 9. SQL 语句拼接 in 的参数时,需要对其中的每个子项进行过滤或者预编译,如果适合修改成预编译,则进行参数个数的?替换,将参数放入查询参数中,优先进行预编译参数绑定。注意事项:(1) 过滤 IN 子项时,如果所有子项都被过滤,必须有兜底逻辑(如返回空结果或返回错误),不能生成空的 `IN ()`,否则会导致 SQL 语法错误;(2) 动态构建 IN 列表时,建议先收集合法项到新切片,再用 `strings.Join` 拼接,避免基于原始索引判断逗号导致的尾随逗号问题;(3) 某些数据库对单条 SQL 的参数数量有限制(如 SQLite 默认 999 个),大量 IN 参数需分批处理。
35
+
36
+ **IN 子句预编译示例:**
37
+
38
+ ```go
39
+ import (
40
+ "fmt"
41
+ "strings"
42
+ )
43
+
44
+ // 动态生成 IN 子句的占位符
45
+ func buildInClause(ids []int64) (string, []interface{}) {
46
+ if len(ids) == 0 {
47
+ return "", nil
48
+ }
49
+ placeholders := make([]string, len(ids))
50
+ args := make([]interface{}, len(ids))
51
+ for i, id := range ids {
52
+ placeholders[i] = "?"
53
+ args[i] = id
54
+ }
55
+ return strings.Join(placeholders, ","), args
56
+ }
57
+
58
+ // 使用示例
59
+ func queryByIDs(db *sql.DB, ids []int64) ([]User, error) {
60
+ if len(ids) == 0 {
61
+ return []User{}, nil // 兜底:空列表直接返回空结果
62
+ }
63
+ placeholders, args := buildInClause(ids)
64
+ query := fmt.Sprintf("SELECT * FROM users WHERE id IN (%s)", placeholders)
65
+ rows, err := db.Query(query, args...)
66
+ // ...
67
+ }
68
+ ```
69
+ 10. 当污点拼接进入 sql 语句时,在分析确认需要通过预编译修复的时候,需要考虑 sql 语句的所在位置,例如有时 sql 语句为全局变量赋值到局部变量,改成预编译执行时,需要将当前函数变更为预编译方式,且需要变更全局 sql 语句为预编译方式,避免遗漏导致用户执行出错。
70
+ 11. 注意:一定是已经修改 sql 语句为预编译方式时,才对查询代码进行预编译方式修改,否则考虑使用过滤的方式进行漏洞修复。
71
+ 12. 同一个参数进行漏洞修复时,只需要采取一种修复方式即可,不要同时进行预编译、参数绑定和过滤。
72
+ 13. 当污点数据拼接进入到 sql ,需要详细分析当前函数是否还存在其他地方使用了该 sql,避免因为采用预编译修复方案,导致其他使用该 sql 的场景存在异常;如果其他使用的场景在当前文件中,可以统一进行预编译方式修改,不过得考虑使用的函数需要重载,保障其他文件调用正常。
73
+ 14. 修复时尽量保持原有函数调用链路完整。不允许为了简化修复而跳过或删除原有的函数调用,应在原有调用链路的基础上进行安全修复(如对传入参数进行过滤或预编译),而不是用新的内联代码替换整个函数调用。例如原函数 A 调用函数 B 完成操作,修复后必须仍然调用 B,不能将 B 的逻辑内联到 A 中从而丢失 B 的调用。
74
+ 15. 修复时只能使用代码中已存在的函数或标准库/已导入依赖中的函数或修复时新定义的函数。严禁在修复方案中调用不存在且在修复方案中没有定义的函数。**修复前必须检查同包内是否已存在同名函数**。若函数不存在,必须在修复代码中完整定义该函数,不能仅调用而不定义。
75
+ 16. 修复前必须确认框架方法是否支持参数化绑定。GORM 的 `Order()`、`Group()`、`Select()` 等方法不支持参数化绑定(不接受额外的绑定参数),对这些方法中的污点数据只能使用正则过滤方式修复,不能尝试传入额外参数进行绑定。补充说明:(1) GORM `.Where(string)` 单参数形式(无 `?` 占位符)等同于直接拼接,必须改为 `.Where("col = ?", val)` 形式;(2) GORM `.Table(string)` 中的表名不支持参数化,必须使用正则过滤;(3) GORM `.Joins(string)` 中的表名同样不支持参数化,必须使用正则过滤。
76
+ 17. SQL 原文中已存在 `?` 字符时(如 PostgreSQL jsonb 路径表达式 `@?`、`?`),改为预编译方式前必须确认不会与参数占位符冲突。如果原始 SQL 中包含非占位符用途的 `?`(例如 `answer::jsonb @? '$.content[*] ? (@.type == "rich-text")'`),必须对原有 `?` 进行转义或采用其他方式避免占位符位置错乱,否则会导致参数绑定位置偏移、运行时报错。
77
+ 18. 当污点参数作为 SQL 操作符(如 `=`, `LIKE`, `IN`)拼入 SQL 时,不适合使用正则过滤,应使用白名单枚举精确匹配合法操作符值。示例:
78
+
79
+ ```go
80
+ import (
81
+ "fmt"
82
+ "strings"
83
+ )
84
+ var validOperators = map[string]bool{
85
+ "=": true, "!=": true, "<>": true,
86
+ "<": true, ">": true, "<=": true, ">=": true,
87
+ "LIKE": true, "NOT LIKE": true,
88
+ "IN": true, "NOT IN": true,
89
+ }
90
+
91
+ func safeValidateOperator(op string) (string, error) {
92
+ upperOp := strings.ToUpper(strings.TrimSpace(op))
93
+ if !validOperators[upperOp] {
94
+ return "", fmt.Errorf("invalid SQL operator")
95
+ }
96
+ return upperOp, nil
97
+ }
98
+ ```
99
+ 上述白名单为常见操作符示例,应根据实际业务需要扩展(如 `BETWEEN`、`IS NULL`、`ILIKE` 等)。
100
+
101
+ 19. **修复代码必须检查并补充必要的 import 导入**。当修复方案引入新的函数调用时,必须确认对应的包已在文件 import 块中声明,若未声明则必须添加。常见修复场景需要导入的包:
102
+
103
+ * 使用正则过滤 `regexp.MatchString`、`regexp.MustCompile` 时:需导入 `"regexp"`
104
+ * 使用 `fmt.Errorf`、`fmt.Sprintf` 时:需导入 `"fmt"`
105
+ * 使用 `strings.Join`、`strings.TrimSpace`、`strings.ToUpper` 时:需导入 `"strings"`
106
+ * 使用 `strconv.Itoa`、`strconv.Atoi` 时:需导入 `"strconv"`
107
+
108
+ **修复完成后,必须检查文件头部 import 块是否包含所有新引入的依赖包,确保代码能够通过编译(**`go build`**)。**
109
+
110
+ 20. **避免同包内重复定义函数**。在定义 `safeFilterXxx` 等辅助函数前,必须先检查同一 Go 包(同目录下所有 `.go` 文件)中是否已存在同名函数。若已存在,直接复用;若不存在,才在当前文件中定义。
111
+ 21. **注意变量作用域,避免遮蔽问题**。
112
+
113
+ * 不要在 `if`/`for` 等块内使用 `:=` 声明变量后在块外使用,会导致 `undefined` 错误
114
+ * 避免在内层作用域用 `:=` 重新声明与外层同名的变量,导致外层变量被遮蔽、值始终为零值
115
+ * 正确做法:在外层先声明变量(`var safeSortBy string`),内层使用 `=` 赋值而非 `:=`
116
+
117
+ 22. **确保修复代码无编译问题**。
118
+
119
+ * 不要引入声明后未使用的变量(Go 编译器会报错)
120
+ * SQL 语句拼接时注意语法正确性,如 `args := []interface{}{}` 不能写成 `args = []interface{}`
121
+ * 不要将多条语句写在同一行(除非用分号分隔),避免格式错误
122
+
123
+ 23. **大小写比较必须一致**。在白名单校验时,如果对输入做了大小写转换(如 `strings.ToUpper`),白名单常量也必须使用相同大小写,否则永远无法匹配。示例:
124
+
125
+ ```go
126
+ // 错误:转大写后与小写比较,永远为 false
127
+ input = strings.ToUpper(input)
128
+ if input == "asc" || input == "desc" { ... }
129
+
130
+ // 正确:统一使用大写
131
+ input = strings.ToUpper(input)
132
+ if input == "ASC" || input == "DESC" { ... }
133
+ ```
134
+ 24. **xorm/sqlx 的 IN 查询必须正确处理多值参数**。`session.SQL("... IN (?)", args...)` 中单个 `?` 无法自动展开为多值列表。正确做法:
135
+
136
+ * 使用 xorm 的 `.In("column", slice)` 方法
137
+ * 或动态生成与切片长度匹配的占位符 `?,?,?`,然后展开参数 `args...`
138
+
139
+ **xorm IN 查询示例:**
140
+
141
+ ```go
142
+ // 方式1:使用 In 方法(推荐)
143
+ var users []User
144
+ err := engine.Where("status = ?", 1).In("id", ids).Find(&users)
145
+
146
+ // 方式2:动态生成占位符
147
+ placeholders := strings.Repeat("?,", len(ids))
148
+ placeholders = strings.TrimSuffix(placeholders, ",")
149
+ query := fmt.Sprintf("SELECT * FROM users WHERE id IN (%s)", placeholders)
150
+ // 将 []int64 转换为 []interface{}
151
+ args := make([]interface{}, len(ids))
152
+ for i, v := range ids {
153
+ args[i] = v
154
+ }
155
+ err := engine.SQL(query, args...).Find(&users)
156
+ ```
157
+ 25. **过滤函数必须包含实际的过滤逻辑**。新增的安全过滤函数必须真正实现过滤或校验,不能仅复制原有拼接逻辑。过滤函数应包含:正则匹配/白名单校验 + 非法时返回错误或空值。
158
+ 26. **过滤函数的错误返回必须正确**。当参数非法时,必须返回非 nil 的 error,调用方才能通过 `if err != nil` 拦截。禁止在非法分支返回 `("", nil)`,这会导致恶意输入被放行。
159
+ 27. **修复代码插入位置必须正确**。不要将 `return` 语句或其他中断逻辑插入到循环体之前,否则会导致循环被跳过、函数提前返回空结果。修复代码应插入到数据使用点之前、但在必要业务逻辑之后。
160
+ 28. **占位符数量必须与参数数量严格匹配**。修改为参数化查询后,SQL 中 `?` 的数量必须与传入的参数个数完全一致,否则会导致参数错位或运行时报错。特别注意:
161
+
162
+ * `append(args, args...)` 会导致参数翻倍
163
+ * INSERT 语句的 VALUES 中 `?` 数量必须与字段数一致
164
+
165
+ 29. **修复必须覆盖完整数据流路径**。同一文件或函数中如果存在多个使用同一污点参数的 sink 点,必须全部修复,不能只修复扫描工具指出的单个 sink。检查所有 `fmt.Sprintf`、字符串拼接、`db.Where`/`db.Raw` 等调用点。**特别注意**:当污点来源是结构体(如 `filter` 对象)时,必须检查该结构体的所有字段是否都被用于 SQL 拼接,例如同时存在 `filter.Field` 和 `filter.Operator` 两个污点字段时,必须对两者都进行校验,不能只修复其中一个。
166
+ 30. **避免验证前的冗余赋值**。不要在验证通过之前将原始污点值赋给业务变量,否则静态分析工具会沿此赋值路径追踪到 sink,认为污点链未断开。正确做法:先验证/过滤,通过后才将安全值赋给业务变量。**这是导致修复失败的常见原因之一,必须严格遵守**。示例:
167
+
168
+ ```go
169
+ // 错误:先赋值后验证,污点已传播(静态分析工具会追踪第一行的赋值)
170
+ conds.Order = param.OrderBy // 污点已传播到 conds.Order
171
+ if conds.Order != "" {
172
+ safeOrder, err := safeFilter(param.OrderBy)
173
+ if err != nil { return err }
174
+ conds.Order = safeOrder // 覆写,但工具仍追踪到上面的赋值
175
+ }
176
+
177
+ // 正确:先验证,通过后才赋值(污点链被完全阻断)
178
+ if param.OrderBy != "" {
179
+ safeOrder, err := safeFilter(param.OrderBy)
180
+ if err != nil { return err }
181
+ conds.Order = safeOrder // 仅此一次赋值,且是安全值
182
+ } else {
183
+ conds.Order = "default_value"
184
+ }
185
+ ```
186
+ ### 过滤方式规则
187
+ 1.对于需要通过正则过滤进行防护的污点参数,需根据其使用方式区分处理:
188
+
189
+ * 如果污点参数后续是以普通变量直接拼接或传递,可直接对该变量进行正则过滤。
190
+ * 如果污点数据来源于某个对象的成员方法调用(如 `req.GetSortField()`)或可迭代对象的元素,**不能过滤后仍使用原对象的方法调用**,必须用临时变量承接过滤后的结果,后续使用该临时变量进行拼接或传递,以确保数据流检测工具能识别到安全截断。过滤函数命名以 `safeFilter` 或 `safeValidate` 开头,**若当前文件中不存在该函数则必须在当前文件中定义(文件级别,非嵌套在其他函数内部),严禁调用未定义的函数**。示例:
191
+
192
+ 错误写法:过滤后仍使用原对象方法调用,数据流未截断
193
+
194
+ ```go
195
+ if match, _ := regexp.MatchString(`^[\w\s\[\]"` + "`$.,*]+$", req.GetSortField()); !match {
196
+ return fmt.Errorf("invalid sort field")
197
+ }
198
+ tx = tx.Order(req.GetSortField() + " DESC") // 数据流检测无法识别防护
199
+ ```
200
+ 正确写法:在文件级别定义过滤函数(注意先判断是否已经存在同名函数,不能定义在其他函数体内部,Go 不支持具名嵌套函数)
201
+
202
+ ```go
203
+ import (
204
+ "fmt"
205
+ "regexp"
206
+ )
207
+
208
+ func safeFilterField(field string) (string, error) {
209
+ if match, _ := regexp.MatchString(`^[\w\s\[\]"` + "`$.,*]+$", field); !match {
210
+ return "", fmt.Errorf("invalid field value")
211
+ }
212
+ return field, nil
213
+ }
214
+ ```
215
+ 在业务函数中调用,用临时变量承接结果
216
+
217
+ ```go
218
+ safeSortField, err := safeFilterField(req.GetSortField())
219
+ if err != nil { return err }
220
+ tx = tx.Order(safeSortField + " DESC")
221
+ ```
222
+ 2.如果传入下层函数的参数是一个结构体对象,而污点数据仅存在于其某个字段,应通过过滤函数对整个对象进行过滤处理,返回一个安全的新对象,并用临时变量承接,后续使用该临时对象向下层函数传递。过滤函数命名以 `safeFilter` 或 `safeValidate` 开头,**该函数必须在当前文件中以文件级别函数定义(非嵌套在其他函数内部),严禁调用不存在的函数**。示例:
223
+
224
+ 错误写法:仅过滤字段后仍传递原对象,数据流未截断
225
+
226
+ ```go
227
+ if match, _ := regexp.MatchString(`^[\w\s\[\]"` + "`$.,*]+$", params.TableName); !match {
228
+ return fmt.Errorf("invalid table name")
229
+ }
230
+ result, err := queryData(db, params) // 原对象传递,数据流检测无法识别防护
231
+ ```
232
+ 正确写法:在文件级别定义过滤函数(注意先判断是否已经存在同名函数,不能定义在其他函数体内部,Go 不支持具名嵌套函数)
233
+
234
+ ```go
235
+ import (
236
+ "fmt"
237
+ "regexp"
238
+ )
239
+
240
+ func safeFilterQueryParams(p QueryParams) (QueryParams, error) {
241
+ if match, _ := regexp.MatchString(`^[\w\s\[\]"` + "`$.,*]+$", p.TableName); !match {
242
+ return QueryParams{}, fmt.Errorf("invalid table name")
243
+ }
244
+ return p, nil
245
+ }
246
+ ```
247
+ 在业务函数中调用,用临时变量承接结果
248
+
249
+ ```go
250
+ safeParams, err := safeFilterQueryParams(params)
251
+ if err != nil { return err }
252
+ result, err := queryData(db, safeParams)
253
+ ```
254
+ ## 各框架SQL注入风险与防护
255
+ ### 1. 标准库 database/sql
256
+ #### 风险示例
257
+ ```go
258
+ // 危险: 表名列名和参数直接拼接SQL
259
+ query := fmt.Sprintf("SELECT id,%s,book FROM users WHERE username = '%s'", addr, username)
260
+ rows, err := db.Query(query)
261
+ ```
262
+ #### 风险描述
263
+ 直接拼接用户输入到SQL语句中会导致SQL注入漏洞,攻击者可构造恶意输入改变SQL语义。
264
+
265
+ #### 修复方案
266
+ 使用参数化查询(Prepared Statements), 对于表名列名等无法参数化查询的做正则过滤。
267
+
268
+ #### 修复示例
269
+ ```go
270
+ // 安全: 对于危害的表名列名做过滤
271
+ if match, _ := regexp.MatchString("^[\\w\\s\\[\\]\"`$.,*]+$", addr); !match {
272
+ return nil, fmt.Errorf("invalid field name")
273
+ }
274
+ // 安全: 使用参数化查询
275
+ query := fmt.Sprintf("SELECT id,%s,book FROM users WHERE username = ?", addr)
276
+ rows, err := db.Query(query, username)
277
+ ```
278
+ ### 2. GORM
279
+ #### 风险示例
280
+ ```go
281
+ // 危险: 使用Raw方法直接拼接
282
+ db.Raw(fmt.Sprintf("SELECT * FROM %s WHERE username = '%s'", tableName, username)).Scan(&result)
283
+
284
+ // 危险: 使用Where条件拼接
285
+ db.Where("username = '" + username + "'").First(&user)
286
+ ```
287
+ #### 风险描述
288
+ GORM虽然提供了安全的查询构建方法,但如果开发者直接拼接SQL字符串,仍然存在注入风险。
289
+
290
+ #### 修复方案
291
+ 使用GORM的参数绑定功能(预编译)或模型查询,对于表名列名等无法参数化查询的做正则过滤。注意使用支持参数绑定的函数。
292
+
293
+ #### 修复示例
294
+ ```go
295
+ // 安全: 对于表名列名等无法参数化查询的做正则过滤。
296
+ if match, _ := regexp.MatchString("^[\\w\\s\\[\\]\"`$.,*]+$", tableName); !match {
297
+ return nil, fmt.Errorf("invalid table name")
298
+ }
299
+ // 安全: 使用参数绑定
300
+ db.Raw(fmt.Sprintf("SELECT * FROM %s WHERE username = ?", tableName), username).Scan(&result)
301
+
302
+ // 安全: 使用模型查询
303
+ db.Where("username = ?", username).First(&user)
304
+ ```
305
+ ### 3. sqlx
306
+ #### 风险示例
307
+ ```go
308
+ // 危险: 直接拼接SQL
309
+ query := fmt.Sprintf("SELECT * FROM users WHERE username = '%s'", username)
310
+ err := db.Get(&user, query)
311
+ ```
312
+ #### 风险描述
313
+ sqlx是标准库的扩展,同样存在拼接SQL导致注入的风险。
314
+
315
+ #### 修复方案
316
+ 使用命名参数或位置参数。
317
+
318
+ #### 修复示例
319
+ ```go
320
+ // 安全: 对于表名列名等无法参数化查询的做正则过滤。
321
+ if match, _ := regexp.MatchString("^[\\w\\s\\[\\]\"`$.,*]+$", tableName); !match {
322
+ return nil, fmt.Errorf("invalid table name")
323
+ }
324
+ // 安全:使用命名参数
325
+ query := fmt.Sprintf("SELECT * FROM %s WHERE username = :username", tableName)
326
+ nstmt, err := db.PrepareNamed(query)
327
+ if err != nil {
328
+ return nil, err
329
+ }
330
+ err = nstmt.Get(&result, map[string]interface{}{"username": username})
331
+
332
+ // 安全: 对于表名列名等无法参数化查询的做正则过滤。
333
+ if match, _ := regexp.MatchString("^[\\w\\s\\[\\]\"`$.,*]+$", tableName); !match {
334
+ return nil, fmt.Errorf("invalid table name")
335
+ }
336
+ // 安全: 使用位置参数, 预编译
337
+ query := fmt.Sprintf("SELECT * FROM %s WHERE username = ?", tableName)
338
+ err := db.Get(&result, query, username)
339
+ ```
340
+ ### 4. ent
341
+ #### 风险示例
342
+ ```go
343
+ // ent本身设计上更安全,但错误使用仍有风险
344
+ client.User.Query().
345
+ Where(func(s *sql.Selector) {
346
+ s.Where(sql.Expr(fmt.Sprintf("username = '%s'", username)))
347
+ }).All(ctx)
348
+ ```
349
+ #### 风险描述
350
+ ent框架设计上更安全,但直接使用sql.Expr拼接字符串仍有风险。
351
+
352
+ #### 修复方案
353
+ 使用ent提供的类型安全查询方法。
354
+
355
+ #### 修复示例
356
+ ```go
357
+ // 安全: 使用类型安全方法
358
+ user, err := client.User.Query().
359
+ Where(user.Username(username)).
360
+ Only(ctx)
361
+ ```
362
+ ### 5. XORM
363
+ #### 风险示例
364
+ ```go
365
+ // 危险: 直接拼接SQL
366
+ engine.SQL(fmt.Sprintf("SELECT * FROM users WHERE username = '%s'", username)).Get(&user)
367
+ ```
368
+ #### 风险描述
369
+ XORM提供了安全的查询方法,但直接拼接SQL字符串仍会导致注入。
370
+
371
+ #### 修复方案
372
+ 使用参数化查询或XORM的构建器方法。
373
+
374
+ #### 修复示例
375
+ ```go
376
+ // 安全: 使用参数化查询
377
+ engine.SQL("SELECT * FROM users WHERE username = ?", username).Get(&user)
378
+
379
+ // 安全: 使用构建器方法
380
+ engine.Where("username = ?", username).Get(&user)
381
+ ```
382
+ ### 6. Beego ORM
383
+ #### 风险示例
384
+ ```go
385
+ // 危险: 直接拼接SQL
386
+ o.Raw(fmt.Sprintf("SELECT * FROM users WHERE username = '%s'", username)).QueryRow(&user)
387
+ ```
388
+ #### 风险描述
389
+ Beego ORM同样存在直接拼接SQL导致注入的风险。
390
+
391
+ #### 修复方案
392
+ 使用参数化查询。
393
+
394
+ #### 修复示例
395
+ ```go
396
+ // 安全: 使用参数化查询
397
+ o.Raw("SELECT * FROM users WHERE username = ?", username).QueryRow(&user)
398
+ ```
399
+ ##