smart-review 1.0.1 → 1.0.2

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-review",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "AI智能代码审查工具,支持静态规则和AI分析",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -16,16 +16,8 @@
16
16
  "debug": "node --inspect ./bin/review.js --files test/src/test-file.js"
17
17
  },
18
18
  "keywords": ["code-review", "ai", "git-hook", "security"],
19
- "author": "vlinr",
19
+ "author": "",
20
20
  "license": "MIT",
21
- "repository": {
22
- "type": "git",
23
- "url": "git+https://github.com/vlinr/smart-review.git"
24
- },
25
- "homepage": "https://github.com/vlinr/smart-review#readme",
26
- "bugs": {
27
- "url": "https://github.com/vlinr/smart-review/issues"
28
- },
29
21
  "dependencies": {
30
22
  "chalk": "^5.3.0",
31
23
  "glob": "^10.3.10",
@@ -0,0 +1,111 @@
1
+ // Best practices rules (en-US)
2
+ export default [
3
+ {
4
+ id: 'BP001',
5
+ name: 'Debug code',
6
+ pattern: 'console\\.log|print\\(|alert\\(',
7
+ risk: 'low',
8
+ message: 'Debug code found; remove before committing',
9
+ suggestion: 'Use a logging system instead of console.log',
10
+ flags: 'gi'
11
+ },
12
+ {
13
+ id: 'BP002',
14
+ name: 'Magic numbers',
15
+ pattern: '\\b(?<!\\.) (?!(?:0|1|10|12|24|30|60|100|200|201|300|400|401|403|404|500|503|1000|3000|5000|8080|9000)\\b) \\d{3,}(?!\\.\\d)\\b'.replace(/\s+/g, ''),
16
+ risk: 'low',
17
+ message: 'Magic numbers detected; define them as constants',
18
+ suggestion: 'Define numbers as meaningful constants',
19
+ flags: 'g'
20
+ },
21
+ {
22
+ id: 'BP003',
23
+ name: 'Empty catch block',
24
+ pattern: 'catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}',
25
+ risk: 'medium',
26
+ message: 'Empty catch may hide errors and cause unpredictable behavior',
27
+ suggestion: 'Log or take remedial actions instead of swallowing exceptions',
28
+ flags: 'gi'
29
+ },
30
+ {
31
+ id: 'BP004',
32
+ name: 'Ignore TypeScript type checking',
33
+ pattern: '\\/\\/\\s*@ts-ignore',
34
+ risk: 'medium',
35
+ message: 'Detected @ts-ignore; may conceal type errors',
36
+ suggestion: 'Fix type issues or use precise type definitions',
37
+ flags: 'gi'
38
+ },
39
+ {
40
+ id: 'BP005',
41
+ name: 'Use of any type',
42
+ pattern: ':\\s*any\\b',
43
+ risk: 'medium',
44
+ message: 'Using any weakens type safety guarantees',
45
+ suggestion: 'Use concrete types or generics to improve safety',
46
+ flags: 'gi'
47
+ },
48
+ {
49
+ id: 'BP006',
50
+ name: 'ESLint rule disabled',
51
+ pattern: '\\/\\/\\s*eslint-disable',
52
+ risk: 'medium',
53
+ message: 'Disabling ESLint may hide code quality issues',
54
+ suggestion: 'Disable locally only when necessary, and explain the reason',
55
+ flags: 'gi'
56
+ },
57
+ {
58
+ id: 'BP007',
59
+ name: 'Debugger statement left',
60
+ pattern: '\\bdebugger\\b',
61
+ risk: 'medium',
62
+ message: 'Debugger statement found; may affect production behavior',
63
+ suggestion: 'Remove debugger before commit; use logs or assertions',
64
+ flags: 'gi'
65
+ },
66
+ {
67
+ id: 'BP008',
68
+ name: 'Overly broad exception catch',
69
+ pattern: 'catch\\s*\\(\\s*(Exception|Throwable|Error|BaseException)\\s+\\w+\\s*\\)\\s*\\{[^}]*(?!.*(?:log|throw|rethrow))[^}]*\\}',
70
+ risk: 'medium',
71
+ message: 'Catching broad exception types without proper handling',
72
+ suggestion: 'Catch specific types and ensure logging or rethrowing as needed',
73
+ flags: 'gi'
74
+ },
75
+ {
76
+ id: 'BP009',
77
+ name: 'Print stack instead of logging',
78
+ pattern: '\\.printStackTrace\\s*\\(',
79
+ risk: 'medium',
80
+ message: 'Direct stack printing may lose context and produce uncontrolled output',
81
+ suggestion: 'Use structured logging with context information',
82
+ flags: 'gi'
83
+ },
84
+ {
85
+ id: 'BP010',
86
+ name: 'Process-level exit call',
87
+ pattern: 'System\\.exit\\s*\\(',
88
+ risk: 'high',
89
+ message: 'System.exit detected; may cause unexpected service termination',
90
+ suggestion: 'Use graceful shutdown, signal handling, and resource cleanup',
91
+ flags: 'gi'
92
+ },
93
+ {
94
+ id: 'BP011',
95
+ name: 'Use root database user',
96
+ pattern: '(user|username)\\s*=\\s*root\\b',
97
+ risk: 'medium',
98
+ message: 'Using root as DB user introduces security and audit risks',
99
+ suggestion: 'Use a least-privileged application account and separate duties',
100
+ flags: 'gi'
101
+ },
102
+ {
103
+ id: 'BP012',
104
+ name: 'Disable CSRF (Spring Security)',
105
+ pattern: 'csrf\\s*\\(\\)\\.disable\\s*\\(\\)',
106
+ risk: 'high',
107
+ message: 'Globally disabling CSRF may cause CSRF vulnerabilities',
108
+ suggestion: 'Use token/same-origin policies where needed; avoid global disable',
109
+ flags: 'gi'
110
+ }
111
+ ];
@@ -0,0 +1,123 @@
1
+ // Performance rules (en-US)
2
+ export default [
3
+ {
4
+ id: 'PERF001',
5
+ name: 'Database queries inside loops',
6
+ pattern: '(for|while)\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(find|query|select|findOne|findMany|findFirst|findUnique|create|update|delete|save)\\s*\\([^}]*\\}',
7
+ risk: 'medium',
8
+ message: 'Executing DB queries in loops may cause N+1 problems',
9
+ suggestion: 'Use batch queries or preload data',
10
+ flags: 'gi'
11
+ },
12
+ {
13
+ id: 'PERF002',
14
+ name: 'Memory leak risk (timers)',
15
+ pattern: 'setInterval\\s*\\([^)]*\\)|setTimeout\\s*\\([^)]*\\)',
16
+ risk: 'medium',
17
+ message: 'Timers without cleanup may cause leaks or lingering tasks',
18
+ suggestion: 'Call clearInterval/clearTimeout at the proper lifecycle point',
19
+ flags: 'gi',
20
+ // To override built-in PERF002, external rule adds cleanup detection; skip if any cleanup exists in file
21
+ requiresAbsent: ['clearInterval\\s*\\(', 'clearTimeout\\s*\\(']
22
+ },
23
+ {
24
+ id: 'PERF003',
25
+ name: 'Synchronous file I/O blocking',
26
+ pattern: 'fs\\.(readFileSync|writeFileSync|appendFileSync|existsSync|statSync|readdirSync)\\s*\\(',
27
+ risk: 'high',
28
+ message: 'Sync file I/O may block the event loop and hurt throughput',
29
+ suggestion: 'Prefer async I/O or queued processing; avoid blocking the main thread',
30
+ flags: 'gi'
31
+ },
32
+ {
33
+ id: 'PERF004',
34
+ name: 'Network requests inside loops',
35
+ pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(fetch|axios\\.(get|post|put|delete)|requests\\.(get|post|put|delete)|http\\.get)\\b[^}]*\\}',
36
+ risk: 'high',
37
+ message: 'Requests inside loops can cause cascading latency and congestion',
38
+ suggestion: 'Merge requests, control concurrency, or batch to reduce round-trips',
39
+ flags: 'gi'
40
+ },
41
+ {
42
+ id: 'PERF005',
43
+ name: 'JSON serialization inside loops',
44
+ pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*JSON\\.stringify[^}]*\\}',
45
+ risk: 'medium',
46
+ message: 'Frequent serialization in loops causes excessive CPU overhead',
47
+ suggestion: 'Move serialization out of the loop or cache/batch it',
48
+ flags: 'gi'
49
+ },
50
+ {
51
+ id: 'PERF006',
52
+ name: 'Regex compilation inside loops',
53
+ pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*new\\s+RegExp\\s*\\([^}]*\\}',
54
+ risk: 'medium',
55
+ message: 'Repeated regex compilation adds unnecessary overhead',
56
+ suggestion: 'Precompile or constantize regexes; avoid creating them in loops',
57
+ flags: 'gi'
58
+ },
59
+ {
60
+ id: 'PERF007',
61
+ name: 'Busy-wait loops',
62
+ pattern: '(while\\s*\\(\\s*true\\s*\\)|for\\s*\\(\\s*;\\s*;\\s*\\))\\s*\\{[^}]*(?!.*(?:sleep|wait|await|setTimeout|setInterval|yield|break|return))[^}]*\\}',
63
+ risk: 'high',
64
+ message: 'Possible busy-wait detected; can spike CPU and waste resources',
65
+ suggestion: 'Use event-driven or blocking waits; avoid empty loops',
66
+ flags: 'gi'
67
+ },
68
+ {
69
+ id: 'PERF008',
70
+ name: 'Layout thrashing in loops',
71
+ pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*(offsetWidth|offsetHeight|getBoundingClientRect)[^}]*\\}',
72
+ risk: 'high',
73
+ message: 'Reading layout in loops triggers frequent reflow/repaint',
74
+ suggestion: 'Batch DOM reads/writes; reduce synchronous layout queries',
75
+ flags: 'gi'
76
+ },
77
+ {
78
+ id: 'PERF009',
79
+ name: 'Blocking sleep',
80
+ pattern: '(Thread\\.sleep\\s*\\(|time\\.sleep\\s*\\()',
81
+ risk: 'medium',
82
+ message: 'Blocking waits reduce throughput and responsiveness',
83
+ suggestion: 'Use async waits or rate-limiting/queues; avoid blocking',
84
+ flags: 'gi'
85
+ },
86
+ {
87
+ id: 'PERF010',
88
+ name: 'Unbounded thread pool',
89
+ pattern: 'Executors\\.newCachedThreadPool\\s*\\(',
90
+ risk: 'high',
91
+ message: 'Unbounded pools can explode thread count and exhaust resources',
92
+ suggestion: 'Use bounded pools with sane maximums and queue lengths',
93
+ flags: 'gi'
94
+ },
95
+ {
96
+ id: 'PERF011',
97
+ name: 'String concatenation inside loops',
98
+ pattern: '(for|while)\\s*\\([^)]*\\)\\s*\\{[^}]*\\b\\w+\\s*\\+=\\s*[\'"`]',
99
+ risk: 'medium',
100
+ message: 'Frequent concatenation in loops consumes CPU and memory',
101
+ suggestion: 'Use StringBuilder/collect in lists then join, or batch strategies',
102
+ flags: 'gi'
103
+ },
104
+ {
105
+ id: 'PERF012',
106
+ name: 'Create DB connections in loops',
107
+ pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(getConnection|openConnection|new\\s+SqlConnection|mysql_connect|pg_connect|MongoClient\\s*\\()\\b',
108
+ risk: 'high',
109
+ message: 'Repeatedly creating DB connections causes severe performance issues',
110
+ suggestion: 'Use connection pools and reuse; acquire connections outside loops',
111
+ flags: 'gi'
112
+ },
113
+ {
114
+ id: 'PERF013',
115
+ name: 'HTTP requests without timeout (Python)',
116
+ pattern: 'requests\\.(get|post|put|delete)\\s*\\(',
117
+ risk: 'medium',
118
+ message: 'Requests without timeout can hang resources and reduce throughput',
119
+ suggestion: 'Set reasonable timeout; control retries and circuit breaking',
120
+ flags: 'gi',
121
+ requiresAbsent: ['timeout\\s*=']
122
+ }
123
+ ];
@@ -0,0 +1,311 @@
1
+ // Security rules (en-US)
2
+ export default [
3
+ {
4
+ id: 'SEC001',
5
+ name: 'Hard-coded password detection',
6
+ pattern: '(password|pwd|pass)\\s*[=:]\\s*[\'\"][^\'\\\"]{6,}[\'\\\"]',
7
+ risk: 'high',
8
+ message: 'Hard-coded password or secret detected',
9
+ suggestion: 'Use environment variables or a secure secret manager',
10
+ flags: 'gi',
11
+ excludePatterns: ['//.*', '/\\*[\\s\\S]*?\\*/', '(example|test|demo|placeholder|xxx|123|abc|password|secret)']
12
+ },
13
+ {
14
+ id: 'SEC002',
15
+ name: 'SQL injection risk',
16
+ pattern: '(execute|query)\\s*\\(\\s*[fF]?[\'\"][^\']*\\+.*[\'\"]',
17
+ risk: 'critical',
18
+ message: 'String-concatenated SQL detected; injection risk',
19
+ suggestion: 'Use parameterized queries or the ORM’s safe APIs',
20
+ flags: 'gi'
21
+ },
22
+ {
23
+ id: 'SEC003',
24
+ name: 'XSS risk',
25
+ pattern: 'innerHTML\\s*=|document\\.write\\s*\\(',
26
+ risk: 'high',
27
+ message: 'Direct HTML manipulation detected; possible XSS',
28
+ suggestion: 'Use textContent or safe DOM APIs',
29
+ flags: 'gi'
30
+ },
31
+ {
32
+ id: 'SEC004',
33
+ name: 'Command injection risk',
34
+ pattern: '(exec|spawn|execSync)\\s*\\([^\\)]*(req\\.|request\\.|params\\.|query\\.|input|user|\\+.*(?:req|input|user|params)|\\$\\{.*(?:req|input|user|params))',
35
+ risk: 'critical',
36
+ message: 'Command execution with possible user input detected',
37
+ suggestion: 'Avoid constructing commands from user input; validate strictly',
38
+ flags: 'gi'
39
+ }
40
+ ,
41
+ {
42
+ id: 'SEC005',
43
+ name: 'Path traversal risk',
44
+ pattern: '(fs\\.(readFile|writeFile|appendFile|mkdir|rmdir|unlink)|open|fopen|FileInputStream|Files\\.newInputStream)\\s*\\([^\\)]*(\\.\\.\/|\\+|\\$\\{)',
45
+ risk: 'high',
46
+ message: 'Potential path traversal or unvalidated file path usage',
47
+ suggestion: 'Normalize and whitelist paths; never concatenate untrusted input',
48
+ flags: 'gi'
49
+ },
50
+ {
51
+ id: 'SEC006',
52
+ name: 'Disable SSL certificate verification',
53
+ pattern: 'requests\\.(get|post|put|delete)\\s*\\([^\\)]*verify\\s*=\\s*False',
54
+ risk: 'high',
55
+ message: 'HTTP request with certificate verification disabled detected',
56
+ suggestion: 'Enable verification and use trusted CAs; avoid MITM attacks',
57
+ flags: 'gi'
58
+ },
59
+ {
60
+ id: 'SEC007',
61
+ name: 'Weak cryptographic algorithm',
62
+ pattern: 'crypto\\.(createHash|createCipheriv)\\s*\\(\\s*[\'\"](md5|sha1)[\'\"\\)]|MessageDigest\\.getInstance\\(\\s*[\'\"](MD5|SHA-1)[\'\"\\)]',
63
+ risk: 'high',
64
+ message: 'Detected use of weak algorithms such as MD5/SHA-1',
65
+ suggestion: 'Use stronger algorithms: SHA-256/512, Argon2, bcrypt, scrypt',
66
+ flags: 'gi'
67
+ },
68
+ {
69
+ id: 'SEC008',
70
+ name: 'Hard-coded secret/Token',
71
+ pattern: '\\b(api[_-]?key|secret|token)\\b\\s*[:=]\\s*[\'\"][A-Za-z0-9_\\-\\/\\+=]{16,}[\'\"]',
72
+ risk: 'high',
73
+ message: 'Hard-coded secret or access token detected',
74
+ suggestion: 'Store secrets in a manager or environment variables',
75
+ flags: 'gi'
76
+ },
77
+ {
78
+ id: 'SEC009',
79
+ name: 'Unsafe deserialization',
80
+ pattern: 'pickle\\.loads\\s*\\(|yaml\\.load\\s*\\(|ObjectInputStream\\.readObject\\s*\\(|unserialize\\s*\\(',
81
+ risk: 'critical',
82
+ message: 'Potentially unsafe deserialization detected',
83
+ suggestion: 'Use safe methods (e.g., yaml.safe_load); never deserialize untrusted data',
84
+ flags: 'gi'
85
+ },
86
+ {
87
+ id: 'SEC010',
88
+ name: 'SSRF risk',
89
+ pattern: '(requests\\.(get|post|put|delete)|http\\.get|fetch|urlopen)\\s*\\([^\\)]*(req\\.|request\\.|params\\.|query\\.|input|user|\\+.*req|\\+.*input|\\$\\{.*req|\\$\\{.*input)',
90
+ risk: 'high',
91
+ message: 'User-controlled URL request detected; SSRF risk',
92
+ suggestion: 'Whitelist external URLs; prohibit access to internal addresses',
93
+ flags: 'gi'
94
+ },
95
+ {
96
+ id: 'SEC011',
97
+ name: 'NoSQL injection risk',
98
+ pattern: '(db|collection)\\.[a-zA-Z]+\\s*\\([^\\)]*\\+[^\\)]*\\)',
99
+ risk: 'high',
100
+ message: 'Possible NoSQL injection (dynamically concatenated conditions)',
101
+ suggestion: 'Use parameterized queries or safe builders; avoid concatenation',
102
+ flags: 'gi'
103
+ },
104
+ {
105
+ id: 'SEC012',
106
+ name: 'Open redirect',
107
+ pattern: '(res\\.redirect|response\\.sendRedirect)\\s*\\([^\\)]*(\\+|\\$\\{)',
108
+ risk: 'high',
109
+ message: 'User-controlled redirection detected; open-redirect risk',
110
+ suggestion: 'Whitelist target URLs or fix them to safe destinations',
111
+ flags: 'gi'
112
+ },
113
+ {
114
+ id: 'SEC013',
115
+ name: 'System command execution (Python)',
116
+ pattern: '(os\\.system|subprocess\\.(Popen|call|run))\\s*\\(',
117
+ risk: 'critical',
118
+ message: 'System command execution detected; injection risk if user input involved',
119
+ suggestion: 'Avoid direct system calls; use safe libraries or strict whitelists',
120
+ flags: 'gi'
121
+ },
122
+ {
123
+ id: 'SEC014',
124
+ name: 'Insecure randomness',
125
+ pattern: '(Math\\.random\\(|random\\.random\\(|new\\s+Random\\s*\\().*(?:token|key|secret|password|salt|nonce|session|auth|uuid)',
126
+ risk: 'medium',
127
+ message: 'Non-cryptographic RNG used in security-sensitive contexts',
128
+ suggestion: 'Use cryptographically secure RNGs (crypto.randomBytes, secrets.SystemRandom)',
129
+ flags: 'gi'
130
+ },
131
+ {
132
+ id: 'SEC015',
133
+ name: 'Dangerous eval/Function usage',
134
+ pattern: '\\beval\\s*\\(|new\\s+Function\\s*\\(',
135
+ risk: 'high',
136
+ message: 'Dynamic execution that may lead to code injection',
137
+ suggestion: 'Avoid eval/Function; use safe parsing/mapping logic',
138
+ flags: 'gi'
139
+ },
140
+ {
141
+ id: 'SEC016',
142
+ name: 'Prototype pollution',
143
+ pattern: '(?:__proto__|constructor|prototype)\\s*[:=]',
144
+ risk: 'high',
145
+ message: 'Direct assignment to object prototypes; may cause pollution',
146
+ suggestion: 'Avoid merging untrusted data into prototypes; use safe merging',
147
+ flags: 'gi'
148
+ },
149
+ {
150
+ id: 'SEC017',
151
+ name: 'Java string-concatenated SQL execution',
152
+ pattern: 'Statement\\s*\\.\\s*(execute|executeQuery|executeUpdate)\\s*\\([^\\)]*(\\+|%s)',
153
+ risk: 'critical',
154
+ message: 'SQL execution built via string concatenation detected',
155
+ suggestion: 'Use PreparedStatement with placeholders',
156
+ flags: 'gi'
157
+ },
158
+ {
159
+ id: 'SEC018',
160
+ name: 'jQuery.html causing XSS risk',
161
+ pattern: '\\$\\([^\\)]*\\)\\.html\\s*\\(',
162
+ risk: 'high',
163
+ message: 'Direct HTML injection detected; possible XSS',
164
+ suggestion: 'Use text() or trusted templating with escaping',
165
+ flags: 'gi'
166
+ },
167
+ {
168
+ id: 'SEC019',
169
+ name: 'Overly permissive file mode (777)',
170
+ pattern: 'chmod\\s*\\([^\\)]*777',
171
+ risk: 'high',
172
+ message: 'Setting wide-open file permissions detected',
173
+ suggestion: 'Apply least privilege; avoid 777 and similar modes',
174
+ flags: 'gi'
175
+ },
176
+ {
177
+ id: 'SEC020',
178
+ name: 'System command execution (multi-language)',
179
+ pattern: '(system\\s*\\(|passthru\\s*\\(|shell_exec\\s*\\(|Process\\.Start\\s*\\()',
180
+ risk: 'critical',
181
+ message: 'System command execution detected; injection risk with user input',
182
+ suggestion: 'Avoid shell commands; use safe libraries and whitelist parameters',
183
+ flags: 'gi'
184
+ },
185
+ {
186
+ id: 'SEC021',
187
+ name: 'Disable TLS verification (Node)',
188
+ pattern: '(rejectUnauthorized\\s*:\\s*false|process\\.env\\.NODE_TLS_REJECT_UNAUTHORIZED\\s*=\\s*[\'\"]0[\'\"])',
189
+ risk: 'high',
190
+ message: 'TLS certificate verification disabled detected',
191
+ suggestion: 'Enable verification and use trusted CA to avoid MITM',
192
+ flags: 'gi'
193
+ },
194
+ {
195
+ id: 'SEC022',
196
+ name: 'CORS allows any origin',
197
+ pattern: '(Access-Control-Allow-Origin\\s*:\\s*\\*|cors\\s*\\(\\s*\\{[^}]*origin\\s*:\\s*[\'\"\\*\'\"])',
198
+ risk: 'medium',
199
+ message: 'CORS allows "*"; may lead to cross-origin data leaks',
200
+ suggestion: 'Only allow trusted origins; use tokens and fine-grained policy',
201
+ flags: 'gi'
202
+ },
203
+ {
204
+ id: 'SEC023',
205
+ name: 'LDAP injection risk',
206
+ pattern: '((DirContext|InitialDirContext|LdapContext)\\.[a-zA-Z]+\\s*\\([^)]*(\\+|\\$\\{))|(ldap3\\.Connection\\.search\\s*\\([^)]*(\\+|\\$\\{))',
207
+ risk: 'high',
208
+ message: 'String-concatenated LDAP filters detected',
209
+ suggestion: 'Build filters safely and bind parameters; avoid concatenation',
210
+ flags: 'gi'
211
+ },
212
+ {
213
+ id: 'SEC024',
214
+ name: 'XXE (XML External Entity) risk',
215
+ pattern: '(xml\\.etree\\.ElementTree\\.(parse|fromstring)|xml\\.dom\\.minidom\\.(parse|parseString)|DocumentBuilderFactory\\.newInstance\\s*\\(|SAXParserFactory\\.newInstance\\s*\\(|simplexml_load_string\\s*\\(|DOMDocument::loadXML\\s*\\()',
216
+ risk: 'high',
217
+ message: 'XML parsing with external entities not disabled',
218
+ suggestion: 'Disable external entities or use safe libraries (e.g., defusedxml)',
219
+ flags: 'gi'
220
+ },
221
+ {
222
+ id: 'SEC025',
223
+ name: 'Java HostnameVerifier always returns true',
224
+ pattern: 'new\\s+HostnameVerifier\\s*\\(\\)\\s*\\{[\\s\\S]*?return\\s+true;[\\s\\S]*?\\}',
225
+ risk: 'high',
226
+ message: 'Hostname verification bypass detected for HTTPS',
227
+ suggestion: 'Implement strict hostname verification to avoid permissive behavior',
228
+ flags: 'gi'
229
+ },
230
+ {
231
+ id: 'SEC026',
232
+ name: 'Node ignore certificate errors',
233
+ pattern: 'process\\.env\\.NODE_TLS_REJECT_UNAUTHORIZED\\s*=\\s*[\'\"]0[\'\"]',
234
+ risk: 'critical',
235
+ message: 'Global env disables certificate errors detected',
236
+ suggestion: 'Remove the setting and use valid certs or isolate in test env',
237
+ flags: 'gi'
238
+ },
239
+ {
240
+ id: 'SEC027',
241
+ name: 'Credentials in connection string',
242
+ pattern: '(mongodb|mysql|postgres|redis)://[^@]+:[^@]+@',
243
+ risk: 'high',
244
+ message: 'Username/password hard-coded in connection string detected',
245
+ suggestion: 'Use env variables or secure credential storage; avoid plaintext in code',
246
+ flags: 'gi'
247
+ },
248
+ {
249
+ id: 'SEC028',
250
+ name: 'Sensitive data in logs',
251
+ pattern: '(logger\\.(info|debug|warn|error)|console\\.log|print\\()\\s*[^\\)]*(\\b(password|secret|token|api[_\\-]?key)\\s*[=:,]|\\$\\{.*\\b(password|secret|token|api[_\\-]?key)\\b)',
252
+ risk: 'medium',
253
+ message: 'Sensitive information logged',
254
+ suggestion: 'Mask sensitive fields or avoid logging them altogether',
255
+ flags: 'gi'
256
+ },
257
+ {
258
+ id: 'SEC029',
259
+ name: 'Mass Assignment (Rails/Laravel)',
260
+ pattern: '(permit!\\s*\\(|update\\s*\\(\\s*params\\[|::create\\s*\\(\\s*\\$request->all\\s*\\)|->fill\\s*\\(\\s*\\$request->all\\s*\\))',
261
+ risk: 'high',
262
+ message: 'Possible mass assignment risk; no whitelist validation',
263
+ suggestion: 'Enable strong parameters/whitelist; only allow safe fields',
264
+ flags: 'gi'
265
+ },
266
+ {
267
+ id: 'SEC030',
268
+ name: 'Disable TLS verification (Go)',
269
+ pattern: 'InsecureSkipVerify\\s*:\\s*true',
270
+ risk: 'high',
271
+ message: 'TLS certificate verification disabled in Go detected',
272
+ suggestion: 'Enable verification and use trusted CA; avoid MITM attacks',
273
+ flags: 'gi'
274
+ },
275
+ {
276
+ id: 'SEC031',
277
+ name: 'Disable certificate validation (C#)',
278
+ pattern: 'ServicePointManager\\.ServerCertificateValidationCallback',
279
+ risk: 'high',
280
+ message: 'Overriding global certificate validation; may accept any certificate',
281
+ suggestion: 'Remove the override and use proper validation mechanisms',
282
+ flags: 'gi'
283
+ },
284
+ {
285
+ id: 'SEC032',
286
+ name: 'EF Core raw SQL concatenation',
287
+ pattern: 'FromSqlRaw\\s*\\([^\\)]*(\\+|\\$\\{)',
288
+ risk: 'critical',
289
+ message: 'Using FromSqlRaw with string concatenation detected',
290
+ suggestion: 'Use FromSqlInterpolated or parameterized queries to avoid injection',
291
+ flags: 'gi'
292
+ },
293
+ {
294
+ id: 'SEC033',
295
+ name: 'Go system command execution',
296
+ pattern: 'exec\\.Command\\s*\\(',
297
+ risk: 'high',
298
+ message: 'System command execution in Go; injection risk if user input involved',
299
+ suggestion: 'Avoid shell -c and concatenation; whitelist parameters and exec paths',
300
+ flags: 'gi'
301
+ },
302
+ {
303
+ id: 'SEC034',
304
+ name: 'Insecure randomness (Go)',
305
+ pattern: 'math\/rand|\\brand\\.(Int|Intn|Float|Read)\\b',
306
+ risk: 'medium',
307
+ message: 'Using math/rand for randomness; not cryptographically secure',
308
+ suggestion: 'Use crypto/rand or secure RNG libraries for tokens and keys',
309
+ flags: 'gi'
310
+ }
311
+ ];
@@ -0,0 +1,111 @@
1
+ // 最佳实践规则
2
+ export default [
3
+ {
4
+ id: 'BP001',
5
+ name: '调试代码',
6
+ pattern: 'console\\.log|print\\(|alert\\(',
7
+ risk: 'low',
8
+ message: '发现调试代码,建议在提交前移除',
9
+ suggestion: '使用日志系统替代console.log',
10
+ flags: 'gi'
11
+ },
12
+ {
13
+ id: 'BP002',
14
+ name: '魔法数字',
15
+ pattern: '\\b(?<!\\.)(?!(?:0|1|10|12|24|30|60|100|200|201|300|400|401|403|404|500|503|1000|3000|5000|8080|9000)\\b)\\d{3,}(?!\\.\\d)\\b',
16
+ risk: 'low',
17
+ message: '检测到魔法数字,建议使用常量定义',
18
+ suggestion: '将数字定义为有意义的常量',
19
+ flags: 'g'
20
+ },
21
+ {
22
+ id: 'BP003',
23
+ name: '空的异常捕获块',
24
+ pattern: 'catch\s*\([^)]*\)\s*\{\s*\}',
25
+ risk: 'medium',
26
+ message: '检测到空的catch块,可能隐藏错误并导致不可预期行为',
27
+ suggestion: '记录日志或采取补救措施,避免吞掉异常',
28
+ flags: 'gi'
29
+ },
30
+ {
31
+ id: 'BP004',
32
+ name: '忽略TypeScript类型检查',
33
+ pattern: '\\/\\/\\s*@ts-ignore',
34
+ risk: 'medium',
35
+ message: '检测到@ts-ignore,可能掩盖类型错误',
36
+ suggestion: '修复类型问题或使用更精确的类型定义',
37
+ flags: 'gi'
38
+ },
39
+ {
40
+ id: 'BP005',
41
+ name: '使用any类型',
42
+ pattern: ':\\s*any\\b',
43
+ risk: 'medium',
44
+ message: '检测到any类型,可能削弱类型系统保护',
45
+ suggestion: '使用具体类型或泛型替代any,提高类型安全',
46
+ flags: 'gi'
47
+ },
48
+ {
49
+ id: 'BP006',
50
+ name: '禁用ESLint规则',
51
+ pattern: '\\/\\/\\s*eslint-disable',
52
+ risk: 'medium',
53
+ message: '检测到禁用ESLint,可能隐藏代码质量问题',
54
+ suggestion: '只在必要范围局部禁用,并给出明确原因',
55
+ flags: 'gi'
56
+ },
57
+ {
58
+ id: 'BP007',
59
+ name: '调试断点未移除',
60
+ pattern: '\\bdebugger\\b',
61
+ risk: 'medium',
62
+ message: '检测到调试断点,可能影响线上行为',
63
+ suggestion: '在提交前移除debugger并使用日志或断言',
64
+ flags: 'gi'
65
+ },
66
+ {
67
+ id: 'BP008',
68
+ name: '过于宽泛的异常捕获',
69
+ pattern: 'catch\\s*\\(\\s*(Exception|Throwable|Error|BaseException)\\s+\\w+\\s*\\)\\s*\\{[^}]*(?!.*(?:log|throw|rethrow))[^}]*\\}',
70
+ risk: 'medium',
71
+ message: '捕获过于宽泛的异常类型且未进行适当处理',
72
+ suggestion: '捕获具体的异常类型,并确保进行适当的日志记录或重新抛出',
73
+ flags: 'gi'
74
+ },
75
+ {
76
+ id: 'BP009',
77
+ name: '打印堆栈而非日志记录',
78
+ pattern: '\\.printStackTrace\\s*\\(',
79
+ risk: 'medium',
80
+ message: '检测到直接打印堆栈跟踪,可能导致信息丢失与不可控输出',
81
+ suggestion: '使用结构化日志记录错误,并附带上下文信息',
82
+ flags: 'gi'
83
+ },
84
+ {
85
+ id: 'BP010',
86
+ name: '进程级退出调用',
87
+ pattern: 'System\\.exit\\s*\\(',
88
+ risk: 'high',
89
+ message: '检测到System.exit,可能导致服务非预期中断',
90
+ suggestion: '使用受控的停止流程(优雅关闭)、信号处理与资源回收',
91
+ flags: 'gi'
92
+ },
93
+ {
94
+ id: 'BP011',
95
+ name: '使用root数据库用户',
96
+ pattern: '(user|username)\\s*=\\s*root\\b',
97
+ risk: 'medium',
98
+ message: '检测到使用root作为数据库用户,存在安全与审计风险',
99
+ suggestion: '使用最小权限的应用专用账户,分离权限与职责',
100
+ flags: 'gi'
101
+ },
102
+ {
103
+ id: 'BP012',
104
+ name: '禁用CSRF(Spring Security)',
105
+ pattern: 'csrf\\s*\\(\\)\\.disable\\s*\\(\\)',
106
+ risk: 'high',
107
+ message: '检测到全局禁用CSRF保护,可能导致跨站请求伪造风险',
108
+ suggestion: '在必要的API上采用令牌/同源策略,避免全局关闭',
109
+ flags: 'gi'
110
+ }
111
+ ];