smart-review 1.0.1 → 1.0.3
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/README.en-US.md +580 -0
- package/README.md +93 -54
- package/bin/install.js +419 -280
- package/bin/review.js +42 -47
- package/index.js +0 -1
- package/lib/ai-client-pool.js +63 -25
- package/lib/ai-client.js +262 -415
- package/lib/config-loader.js +35 -7
- package/lib/default-config.js +42 -32
- package/lib/reviewer.js +289 -97
- package/lib/segmented-analyzer.js +102 -126
- package/lib/utils/git-diff-parser.js +9 -8
- package/lib/utils/i18n.js +980 -0
- package/package.json +2 -10
- package/templates/rules/en-US/best-practices.js +123 -0
- package/templates/rules/en-US/performance.js +136 -0
- package/templates/rules/en-US/security.js +345 -0
- package/templates/rules/zh-CN/best-practices.js +123 -0
- package/templates/rules/zh-CN/performance.js +136 -0
- package/templates/rules/zh-CN/security.js +345 -0
- package/templates/smart-review.json +5 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "smart-review",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
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": "
|
|
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,123 @@
|
|
|
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
|
+
extensions: ['.js', '.ts', '.py', '.php', '.rb']
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: 'BP002',
|
|
15
|
+
name: 'Magic numbers',
|
|
16
|
+
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, ''),
|
|
17
|
+
risk: 'low',
|
|
18
|
+
message: 'Magic numbers detected; define them as constants',
|
|
19
|
+
suggestion: 'Define numbers as meaningful constants',
|
|
20
|
+
flags: 'g',
|
|
21
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.php', '.py', '.rb', '.go']
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 'BP003',
|
|
25
|
+
name: 'Empty catch block',
|
|
26
|
+
pattern: 'catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}',
|
|
27
|
+
risk: 'medium',
|
|
28
|
+
message: 'Empty catch may hide errors and cause unpredictable behavior',
|
|
29
|
+
suggestion: 'Log or take remedial actions instead of swallowing exceptions',
|
|
30
|
+
flags: 'gi',
|
|
31
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.php']
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'BP004',
|
|
35
|
+
name: 'Ignore TypeScript type checking',
|
|
36
|
+
pattern: '\\/\\/\\s*@ts-ignore',
|
|
37
|
+
risk: 'medium',
|
|
38
|
+
message: 'Detected @ts-ignore; may conceal type errors',
|
|
39
|
+
suggestion: 'Fix type issues or use precise type definitions',
|
|
40
|
+
flags: 'gi',
|
|
41
|
+
extensions: ['.ts']
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'BP005',
|
|
45
|
+
name: 'Use of any type',
|
|
46
|
+
pattern: ':\\s*any\\b',
|
|
47
|
+
risk: 'medium',
|
|
48
|
+
message: 'Using any weakens type safety guarantees',
|
|
49
|
+
suggestion: 'Use concrete types or generics to improve safety',
|
|
50
|
+
flags: 'gi',
|
|
51
|
+
extensions: ['.ts']
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'BP006',
|
|
55
|
+
name: 'ESLint rule disabled',
|
|
56
|
+
pattern: '\\/\\/\\s*eslint-disable',
|
|
57
|
+
risk: 'medium',
|
|
58
|
+
message: 'Disabling ESLint may hide code quality issues',
|
|
59
|
+
suggestion: 'Disable locally only when necessary, and explain the reason',
|
|
60
|
+
flags: 'gi',
|
|
61
|
+
extensions: ['.js', '.ts']
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'BP007',
|
|
65
|
+
name: 'Debugger statement left',
|
|
66
|
+
pattern: '\\bdebugger\\b',
|
|
67
|
+
risk: 'medium',
|
|
68
|
+
message: 'Debugger statement found; may affect production behavior',
|
|
69
|
+
suggestion: 'Remove debugger before commit; use logs or assertions',
|
|
70
|
+
flags: 'gi',
|
|
71
|
+
extensions: ['.js', '.ts']
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'BP008',
|
|
75
|
+
name: 'Overly broad exception catch',
|
|
76
|
+
pattern: 'catch\\s*\\(\\s*(Exception|Throwable|Error|BaseException)\\s+\\w+\\s*\\)\\s*\\{[^}]*(?!.*(?:log|throw|rethrow))[^}]*\\}',
|
|
77
|
+
risk: 'medium',
|
|
78
|
+
message: 'Catching broad exception types without proper handling',
|
|
79
|
+
suggestion: 'Catch specific types and ensure logging or rethrowing as needed',
|
|
80
|
+
flags: 'gi',
|
|
81
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.php']
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: 'BP009',
|
|
85
|
+
name: 'Print stack instead of logging',
|
|
86
|
+
pattern: '\\.printStackTrace\\s*\\(',
|
|
87
|
+
risk: 'medium',
|
|
88
|
+
message: 'Direct stack printing may lose context and produce uncontrolled output',
|
|
89
|
+
suggestion: 'Use structured logging with context information',
|
|
90
|
+
flags: 'gi',
|
|
91
|
+
extensions: ['.java']
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: 'BP010',
|
|
95
|
+
name: 'Process-level exit call',
|
|
96
|
+
pattern: 'System\\.exit\\s*\\(',
|
|
97
|
+
risk: 'high',
|
|
98
|
+
message: 'System.exit detected; may cause unexpected service termination',
|
|
99
|
+
suggestion: 'Use graceful shutdown, signal handling, and resource cleanup',
|
|
100
|
+
flags: 'gi',
|
|
101
|
+
extensions: ['.java']
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'BP011',
|
|
105
|
+
name: 'Use root database user',
|
|
106
|
+
pattern: '(user|username)\\s*=\\s*root\\b',
|
|
107
|
+
risk: 'medium',
|
|
108
|
+
message: 'Using root as DB user introduces security and audit risks',
|
|
109
|
+
suggestion: 'Use a least-privileged application account and separate duties',
|
|
110
|
+
flags: 'gi',
|
|
111
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.php', '.py', '.rb', '.go']
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: 'BP012',
|
|
115
|
+
name: 'Disable CSRF (Spring Security)',
|
|
116
|
+
pattern: 'csrf\\s*\\(\\)\\.disable\\s*\\(\\)',
|
|
117
|
+
risk: 'high',
|
|
118
|
+
message: 'Globally disabling CSRF may cause CSRF vulnerabilities',
|
|
119
|
+
suggestion: 'Use token/same-origin policies where needed; avoid global disable',
|
|
120
|
+
flags: 'gi',
|
|
121
|
+
extensions: ['.java']
|
|
122
|
+
}
|
|
123
|
+
];
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
extensions: ['.js', '.ts', '.java', '.py', '.php', '.rb', '.cs', '.go']
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: 'PERF002',
|
|
15
|
+
name: 'Memory leak risk (timers)',
|
|
16
|
+
pattern: 'setInterval\\s*\\([^)]*\\)|setTimeout\\s*\\([^)]*\\)',
|
|
17
|
+
risk: 'medium',
|
|
18
|
+
message: 'Timers without cleanup may cause leaks or lingering tasks',
|
|
19
|
+
suggestion: 'Call clearInterval/clearTimeout at the proper lifecycle point',
|
|
20
|
+
flags: 'gi',
|
|
21
|
+
extensions: ['.js', '.ts'],
|
|
22
|
+
// To override built-in PERF002, external rule adds cleanup detection; skip if any cleanup exists in file
|
|
23
|
+
requiresAbsent: ['clearInterval\\s*\\(', 'clearTimeout\\s*\\(']
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'PERF003',
|
|
27
|
+
name: 'Synchronous file I/O blocking',
|
|
28
|
+
pattern: 'fs\\.(readFileSync|writeFileSync|appendFileSync|existsSync|statSync|readdirSync)\\s*\\(',
|
|
29
|
+
risk: 'high',
|
|
30
|
+
message: 'Sync file I/O may block the event loop and hurt throughput',
|
|
31
|
+
suggestion: 'Prefer async I/O or queued processing; avoid blocking the main thread',
|
|
32
|
+
flags: 'gi',
|
|
33
|
+
extensions: ['.js', '.ts']
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'PERF004',
|
|
37
|
+
name: 'Network requests inside loops',
|
|
38
|
+
pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(fetch|axios\\.(get|post|put|delete)|requests\\.(get|post|put|delete)|http\\.get)\\b[^}]*\\}',
|
|
39
|
+
risk: 'high',
|
|
40
|
+
message: 'Requests inside loops can cause cascading latency and congestion',
|
|
41
|
+
suggestion: 'Merge requests, control concurrency, or batch to reduce round-trips',
|
|
42
|
+
flags: 'gi',
|
|
43
|
+
extensions: ['.js', '.ts', '.py']
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'PERF005',
|
|
47
|
+
name: 'JSON serialization inside loops',
|
|
48
|
+
pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*JSON\\.stringify[^}]*\\}',
|
|
49
|
+
risk: 'medium',
|
|
50
|
+
message: 'Frequent serialization in loops causes excessive CPU overhead',
|
|
51
|
+
suggestion: 'Move serialization out of the loop or cache/batch it',
|
|
52
|
+
flags: 'gi',
|
|
53
|
+
extensions: ['.js', '.ts']
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'PERF006',
|
|
57
|
+
name: 'Regex compilation inside loops',
|
|
58
|
+
pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*new\\s+RegExp\\s*\\([^}]*\\}',
|
|
59
|
+
risk: 'medium',
|
|
60
|
+
message: 'Repeated regex compilation adds unnecessary overhead',
|
|
61
|
+
suggestion: 'Precompile or constantize regexes; avoid creating them in loops',
|
|
62
|
+
flags: 'gi',
|
|
63
|
+
extensions: ['.js', '.ts']
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'PERF007',
|
|
67
|
+
name: 'Busy-wait loops',
|
|
68
|
+
pattern: '(while\\s*\\(\\s*true\\s*\\)|for\\s*\\(\\s*;\\s*;\\s*\\))\\s*\\{[^}]*(?!.*(?:sleep|wait|await|setTimeout|setInterval|yield|break|return))[^}]*\\}',
|
|
69
|
+
risk: 'high',
|
|
70
|
+
message: 'Possible busy-wait detected; can spike CPU and waste resources',
|
|
71
|
+
suggestion: 'Use event-driven or blocking waits; avoid empty loops',
|
|
72
|
+
flags: 'gi',
|
|
73
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.php', '.rb']
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'PERF008',
|
|
77
|
+
name: 'Layout thrashing in loops',
|
|
78
|
+
pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*(offsetWidth|offsetHeight|getBoundingClientRect)[^}]*\\}',
|
|
79
|
+
risk: 'high',
|
|
80
|
+
message: 'Reading layout in loops triggers frequent reflow/repaint',
|
|
81
|
+
suggestion: 'Batch DOM reads/writes; reduce synchronous layout queries',
|
|
82
|
+
flags: 'gi',
|
|
83
|
+
extensions: ['.js', '.ts']
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'PERF009',
|
|
87
|
+
name: 'Blocking sleep',
|
|
88
|
+
pattern: '(Thread\\.sleep\\s*\\(|time\\.sleep\\s*\\()',
|
|
89
|
+
risk: 'medium',
|
|
90
|
+
message: 'Blocking waits reduce throughput and responsiveness',
|
|
91
|
+
suggestion: 'Use async waits or rate-limiting/queues; avoid blocking',
|
|
92
|
+
flags: 'gi',
|
|
93
|
+
extensions: ['.java', '.py']
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'PERF010',
|
|
97
|
+
name: 'Unbounded thread pool',
|
|
98
|
+
pattern: 'Executors\\.newCachedThreadPool\\s*\\(',
|
|
99
|
+
risk: 'high',
|
|
100
|
+
message: 'Unbounded pools can explode thread count and exhaust resources',
|
|
101
|
+
suggestion: 'Use bounded pools with sane maximums and queue lengths',
|
|
102
|
+
flags: 'gi',
|
|
103
|
+
extensions: ['.java']
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: 'PERF011',
|
|
107
|
+
name: 'String concatenation inside loops',
|
|
108
|
+
pattern: '(for|while)\\s*\\([^)]*\\)\\s*\\{[^}]*\\b\\w+\\s*\\+=\\s*[\'"`]',
|
|
109
|
+
risk: 'medium',
|
|
110
|
+
message: 'Frequent concatenation in loops consumes CPU and memory',
|
|
111
|
+
suggestion: 'Use StringBuilder/collect in lists then join, or batch strategies',
|
|
112
|
+
flags: 'gi',
|
|
113
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.py', '.rb']
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'PERF012',
|
|
117
|
+
name: 'Create DB connections in loops',
|
|
118
|
+
pattern: 'for\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(getConnection|openConnection|new\\s+SqlConnection|mysql_connect|pg_connect|MongoClient\\s*\\()\\b',
|
|
119
|
+
risk: 'high',
|
|
120
|
+
message: 'Repeatedly creating DB connections causes severe performance issues',
|
|
121
|
+
suggestion: 'Use connection pools and reuse; acquire connections outside loops',
|
|
122
|
+
flags: 'gi',
|
|
123
|
+
extensions: ['.js', '.ts', '.java', '.cs', '.php']
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: 'PERF013',
|
|
127
|
+
name: 'HTTP requests without timeout (Python)',
|
|
128
|
+
pattern: 'requests\\.(get|post|put|delete)\\s*\\(',
|
|
129
|
+
risk: 'medium',
|
|
130
|
+
message: 'Requests without timeout can hang resources and reduce throughput',
|
|
131
|
+
suggestion: 'Set reasonable timeout; control retries and circuit breaking',
|
|
132
|
+
flags: 'gi',
|
|
133
|
+
extensions: ['.py'],
|
|
134
|
+
requiresAbsent: ['timeout\\s*=']
|
|
135
|
+
}
|
|
136
|
+
];
|
|
@@ -0,0 +1,345 @@
|
|
|
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
|
+
extensions: ['.js', '.ts', '.py', '.java', '.php', '.rb', '.cs'],
|
|
12
|
+
excludePatterns: ['//.*', '/\\*[\\s\\S]*?\\*/', '(example|test|demo|placeholder|xxx|123|abc|password|secret)']
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 'SEC002',
|
|
16
|
+
name: 'SQL injection risk',
|
|
17
|
+
pattern: '(execute|query)\\s*\\(\\s*[fF]?[\'\"][^\']*\\+.*[\'\"]',
|
|
18
|
+
risk: 'critical',
|
|
19
|
+
message: 'String-concatenated SQL detected; injection risk',
|
|
20
|
+
suggestion: 'Use parameterized queries or the ORM’s safe APIs',
|
|
21
|
+
flags: 'gi',
|
|
22
|
+
extensions: ['.js', '.ts', '.py', '.java', '.php', '.rb', '.cs']
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'SEC003',
|
|
26
|
+
name: 'XSS risk',
|
|
27
|
+
pattern: 'innerHTML\\s*=|document\\.write\\s*\\(',
|
|
28
|
+
risk: 'high',
|
|
29
|
+
message: 'Direct HTML manipulation detected; possible XSS',
|
|
30
|
+
suggestion: 'Use textContent or safe DOM APIs',
|
|
31
|
+
flags: 'gi',
|
|
32
|
+
extensions: ['.js', '.ts']
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'SEC004',
|
|
36
|
+
name: 'Command injection risk',
|
|
37
|
+
pattern: '(exec|spawn|execSync)\\s*\\([^\\)]*(req\\.|request\\.|params\\.|query\\.|input|user|\\+.*(?:req|input|user|params)|\\$\\{.*(?:req|input|user|params))',
|
|
38
|
+
risk: 'critical',
|
|
39
|
+
message: 'Command execution with possible user input detected',
|
|
40
|
+
suggestion: 'Avoid constructing commands from user input; validate strictly',
|
|
41
|
+
flags: 'gi',
|
|
42
|
+
extensions: ['.js', '.ts']
|
|
43
|
+
}
|
|
44
|
+
,
|
|
45
|
+
{
|
|
46
|
+
id: 'SEC005',
|
|
47
|
+
name: 'Path traversal risk',
|
|
48
|
+
pattern: '(fs\\.(readFile|writeFile|appendFile|mkdir|rmdir|unlink)|open|fopen|FileInputStream|Files\\.newInputStream)\\s*\\([^\\)]*(\\.\\.\/|\\+|\\$\\{)',
|
|
49
|
+
risk: 'high',
|
|
50
|
+
message: 'Potential path traversal or unvalidated file path usage',
|
|
51
|
+
suggestion: 'Normalize and whitelist paths; never concatenate untrusted input',
|
|
52
|
+
flags: 'gi',
|
|
53
|
+
extensions: ['.js', '.ts', '.java', '.php', '.py']
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'SEC006',
|
|
57
|
+
name: 'Disable SSL certificate verification',
|
|
58
|
+
pattern: 'requests\\.(get|post|put|delete)\\s*\\([^\\)]*verify\\s*=\\s*False',
|
|
59
|
+
risk: 'high',
|
|
60
|
+
message: 'HTTP request with certificate verification disabled detected',
|
|
61
|
+
suggestion: 'Enable verification and use trusted CAs; avoid MITM attacks',
|
|
62
|
+
flags: 'gi',
|
|
63
|
+
extensions: ['.py']
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'SEC007',
|
|
67
|
+
name: 'Weak cryptographic algorithm',
|
|
68
|
+
pattern: 'crypto\\.(createHash|createCipheriv)\\s*\\(\\s*[\'\"](md5|sha1)[\'\"\\)]|MessageDigest\\.getInstance\\(\\s*[\'\"](MD5|SHA-1)[\'\"\\)]',
|
|
69
|
+
risk: 'high',
|
|
70
|
+
message: 'Detected use of weak algorithms such as MD5/SHA-1',
|
|
71
|
+
suggestion: 'Use stronger algorithms: SHA-256/512, Argon2, bcrypt, scrypt',
|
|
72
|
+
flags: 'gi',
|
|
73
|
+
extensions: ['.js', '.ts', '.java']
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'SEC008',
|
|
77
|
+
name: 'Hard-coded secret/Token',
|
|
78
|
+
pattern: '\\b(api[_-]?key|secret|token)\\b\\s*[:=]\\s*[\'\"][A-Za-z0-9_\\-\\/\\+=]{16,}[\'\"]',
|
|
79
|
+
risk: 'high',
|
|
80
|
+
message: 'Hard-coded secret or access token detected',
|
|
81
|
+
suggestion: 'Store secrets in a manager or environment variables',
|
|
82
|
+
flags: 'gi',
|
|
83
|
+
extensions: ['.js', '.ts', '.py', '.java', '.php', '.rb', '.cs']
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'SEC009',
|
|
87
|
+
name: 'Unsafe deserialization',
|
|
88
|
+
pattern: 'pickle\\.loads\\s*\\(|yaml\\.load\\s*\\(|ObjectInputStream\\.readObject\\s*\\(|unserialize\\s*\\(',
|
|
89
|
+
risk: 'critical',
|
|
90
|
+
message: 'Potentially unsafe deserialization detected',
|
|
91
|
+
suggestion: 'Use safe methods (e.g., yaml.safe_load); never deserialize untrusted data',
|
|
92
|
+
flags: 'gi',
|
|
93
|
+
extensions: ['.py', '.java', '.php']
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'SEC010',
|
|
97
|
+
name: 'SSRF risk',
|
|
98
|
+
pattern: '(requests\\.(get|post|put|delete)|http\\.get|fetch|urlopen)\\s*\\([^\\)]*(req\\.|request\\.|params\\.|query\\.|input|user|\\+.*req|\\+.*input|\\$\\{.*req|\\$\\{.*input)',
|
|
99
|
+
risk: 'high',
|
|
100
|
+
message: 'User-controlled URL request detected; SSRF risk',
|
|
101
|
+
suggestion: 'Whitelist external URLs; prohibit access to internal addresses',
|
|
102
|
+
flags: 'gi',
|
|
103
|
+
extensions: ['.js', '.ts', '.py']
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: 'SEC011',
|
|
107
|
+
name: 'NoSQL injection risk',
|
|
108
|
+
pattern: '(db|collection)\\.[a-zA-Z]+\\s*\\([^\\)]*\\+[^\\)]*\\)',
|
|
109
|
+
risk: 'high',
|
|
110
|
+
message: 'Possible NoSQL injection (dynamically concatenated conditions)',
|
|
111
|
+
suggestion: 'Use parameterized queries or safe builders; avoid concatenation',
|
|
112
|
+
flags: 'gi',
|
|
113
|
+
extensions: ['.js', '.ts', '.py', '.rb', '.php']
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'SEC012',
|
|
117
|
+
name: 'Open redirect',
|
|
118
|
+
pattern: '(res\\.redirect|response\\.sendRedirect)\\s*\\([^\\)]*(\\+|\\$\\{)',
|
|
119
|
+
risk: 'high',
|
|
120
|
+
message: 'User-controlled redirection detected; open-redirect risk',
|
|
121
|
+
suggestion: 'Whitelist target URLs or fix them to safe destinations',
|
|
122
|
+
flags: 'gi',
|
|
123
|
+
extensions: ['.js', '.ts', '.java']
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: 'SEC013',
|
|
127
|
+
name: 'System command execution (Python)',
|
|
128
|
+
pattern: '(os\\.system|subprocess\\.(Popen|call|run))\\s*\\(',
|
|
129
|
+
risk: 'critical',
|
|
130
|
+
message: 'System command execution detected; injection risk if user input involved',
|
|
131
|
+
suggestion: 'Avoid direct system calls; use safe libraries or strict whitelists',
|
|
132
|
+
flags: 'gi',
|
|
133
|
+
extensions: ['.py']
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'SEC014',
|
|
137
|
+
name: 'Insecure randomness',
|
|
138
|
+
pattern: '(Math\\.random\\(|random\\.random\\(|new\\s+Random\\s*\\().*(?:token|key|secret|password|salt|nonce|session|auth|uuid)',
|
|
139
|
+
risk: 'medium',
|
|
140
|
+
message: 'Non-cryptographic RNG used in security-sensitive contexts',
|
|
141
|
+
suggestion: 'Use cryptographically secure RNGs (crypto.randomBytes, secrets.SystemRandom)',
|
|
142
|
+
flags: 'gi',
|
|
143
|
+
extensions: ['.js', '.ts', '.py', '.java']
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: 'SEC015',
|
|
147
|
+
name: 'Dangerous eval/Function usage',
|
|
148
|
+
pattern: '\\beval\\s*\\(|new\\s+Function\\s*\\(',
|
|
149
|
+
risk: 'high',
|
|
150
|
+
message: 'Dynamic execution that may lead to code injection',
|
|
151
|
+
suggestion: 'Avoid eval/Function; use safe parsing/mapping logic',
|
|
152
|
+
flags: 'gi',
|
|
153
|
+
extensions: ['.js', '.ts']
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 'SEC016',
|
|
157
|
+
name: 'Prototype pollution',
|
|
158
|
+
pattern: '(?:__proto__|constructor|prototype)\\s*[:=]',
|
|
159
|
+
risk: 'high',
|
|
160
|
+
message: 'Direct assignment to object prototypes; may cause pollution',
|
|
161
|
+
suggestion: 'Avoid merging untrusted data into prototypes; use safe merging',
|
|
162
|
+
flags: 'gi',
|
|
163
|
+
extensions: ['.js', '.ts']
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: 'SEC017',
|
|
167
|
+
name: 'Java string-concatenated SQL execution',
|
|
168
|
+
pattern: 'Statement\\s*\\.\\s*(execute|executeQuery|executeUpdate)\\s*\\([^\\)]*(\\+|%s)',
|
|
169
|
+
risk: 'critical',
|
|
170
|
+
message: 'SQL execution built via string concatenation detected',
|
|
171
|
+
suggestion: 'Use PreparedStatement with placeholders',
|
|
172
|
+
flags: 'gi',
|
|
173
|
+
extensions: ['.java']
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: 'SEC018',
|
|
177
|
+
name: 'jQuery.html causing XSS risk',
|
|
178
|
+
pattern: '\\$\\([^\\)]*\\)\\.html\\s*\\(',
|
|
179
|
+
risk: 'high',
|
|
180
|
+
message: 'Direct HTML injection detected; possible XSS',
|
|
181
|
+
suggestion: 'Use text() or trusted templating with escaping',
|
|
182
|
+
flags: 'gi',
|
|
183
|
+
extensions: ['.js']
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: 'SEC019',
|
|
187
|
+
name: 'Overly permissive file mode (777)',
|
|
188
|
+
pattern: 'chmod\\s*\\([^\\)]*777',
|
|
189
|
+
risk: 'high',
|
|
190
|
+
message: 'Setting wide-open file permissions detected',
|
|
191
|
+
suggestion: 'Apply least privilege; avoid 777 and similar modes',
|
|
192
|
+
flags: 'gi',
|
|
193
|
+
extensions: ['.php']
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: 'SEC020',
|
|
197
|
+
name: 'System command execution (multi-language)',
|
|
198
|
+
pattern: '(system\\s*\\(|passthru\\s*\\(|shell_exec\\s*\\(|Process\\.Start\\s*\\()',
|
|
199
|
+
risk: 'critical',
|
|
200
|
+
message: 'System command execution detected; injection risk with user input',
|
|
201
|
+
suggestion: 'Avoid shell commands; use safe libraries and whitelist parameters',
|
|
202
|
+
flags: 'gi',
|
|
203
|
+
extensions: ['.php', '.cs']
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'SEC021',
|
|
207
|
+
name: 'Disable TLS verification (Node)',
|
|
208
|
+
pattern: '(rejectUnauthorized\\s*:\\s*false|process\\.env\\.NODE_TLS_REJECT_UNAUTHORIZED\\s*=\\s*[\'\"]0[\'\"])',
|
|
209
|
+
risk: 'high',
|
|
210
|
+
message: 'TLS certificate verification disabled detected',
|
|
211
|
+
suggestion: 'Enable verification and use trusted CA to avoid MITM',
|
|
212
|
+
flags: 'gi',
|
|
213
|
+
extensions: ['.js', '.ts']
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: 'SEC022',
|
|
217
|
+
name: 'CORS allows any origin',
|
|
218
|
+
pattern: '(Access-Control-Allow-Origin\\s*:\\s*\\*|cors\\s*\\(\\s*\\{[^}]*origin\\s*:\\s*[\'\"\\*\'\"])',
|
|
219
|
+
risk: 'medium',
|
|
220
|
+
message: 'CORS allows "*"; may lead to cross-origin data leaks',
|
|
221
|
+
suggestion: 'Only allow trusted origins; use tokens and fine-grained policy',
|
|
222
|
+
flags: 'gi',
|
|
223
|
+
extensions: ['.js', '.ts']
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: 'SEC023',
|
|
227
|
+
name: 'LDAP injection risk',
|
|
228
|
+
pattern: '((DirContext|InitialDirContext|LdapContext)\\.[a-zA-Z]+\\s*\\([^)]*(\\+|\\$\\{))|(ldap3\\.Connection\\.search\\s*\\([^)]*(\\+|\\$\\{))',
|
|
229
|
+
risk: 'high',
|
|
230
|
+
message: 'String-concatenated LDAP filters detected',
|
|
231
|
+
suggestion: 'Build filters safely and bind parameters; avoid concatenation',
|
|
232
|
+
flags: 'gi',
|
|
233
|
+
extensions: ['.java', '.py']
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: 'SEC024',
|
|
237
|
+
name: 'XXE (XML External Entity) risk',
|
|
238
|
+
pattern: '(xml\\.etree\\.ElementTree\\.(parse|fromstring)|xml\\.dom\\.minidom\\.(parse|parseString)|DocumentBuilderFactory\\.newInstance\\s*\\(|SAXParserFactory\\.newInstance\\s*\\(|simplexml_load_string\\s*\\(|DOMDocument::loadXML\\s*\\()',
|
|
239
|
+
risk: 'high',
|
|
240
|
+
message: 'XML parsing with external entities not disabled',
|
|
241
|
+
suggestion: 'Disable external entities or use safe libraries (e.g., defusedxml)',
|
|
242
|
+
flags: 'gi',
|
|
243
|
+
extensions: ['.py', '.java', '.php']
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: 'SEC025',
|
|
247
|
+
name: 'Java HostnameVerifier always returns true',
|
|
248
|
+
pattern: 'new\\s+HostnameVerifier\\s*\\(\\)\\s*\\{[\\s\\S]*?return\\s+true;[\\s\\S]*?\\}',
|
|
249
|
+
risk: 'high',
|
|
250
|
+
message: 'Hostname verification bypass detected for HTTPS',
|
|
251
|
+
suggestion: 'Implement strict hostname verification to avoid permissive behavior',
|
|
252
|
+
flags: 'gi',
|
|
253
|
+
extensions: ['.java']
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
id: 'SEC026',
|
|
257
|
+
name: 'Node ignore certificate errors',
|
|
258
|
+
pattern: 'process\\.env\\.NODE_TLS_REJECT_UNAUTHORIZED\\s*=\\s*[\'\"]0[\'\"]',
|
|
259
|
+
risk: 'critical',
|
|
260
|
+
message: 'Global env disables certificate errors detected',
|
|
261
|
+
suggestion: 'Remove the setting and use valid certs or isolate in test env',
|
|
262
|
+
flags: 'gi',
|
|
263
|
+
extensions: ['.js', '.ts']
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
id: 'SEC027',
|
|
267
|
+
name: 'Credentials in connection string',
|
|
268
|
+
pattern: '(mongodb|mysql|postgres|redis)://[^@]+:[^@]+@',
|
|
269
|
+
risk: 'high',
|
|
270
|
+
message: 'Username/password hard-coded in connection string detected',
|
|
271
|
+
suggestion: 'Use env variables or secure credential storage; avoid plaintext in code',
|
|
272
|
+
flags: 'gi',
|
|
273
|
+
extensions: ['.js', '.ts', '.py', '.java', '.php', '.rb', '.cs']
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: 'SEC028',
|
|
277
|
+
name: 'Sensitive data in logs',
|
|
278
|
+
pattern: '(logger\\.(info|debug|warn|error)|console\\.log|print\\()\\s*[^\\)]*(\\b(password|secret|token|api[_\\-]?key)\\s*[=:,]|\\$\\{.*\\b(password|secret|token|api[_\\-]?key)\\b)',
|
|
279
|
+
risk: 'medium',
|
|
280
|
+
message: 'Sensitive information logged',
|
|
281
|
+
suggestion: 'Mask sensitive fields or avoid logging them altogether',
|
|
282
|
+
flags: 'gi',
|
|
283
|
+
extensions: ['.js', '.ts', '.py', '.java', '.php', '.rb']
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
id: 'SEC029',
|
|
287
|
+
name: 'Mass Assignment (Rails/Laravel)',
|
|
288
|
+
pattern: '(permit!\\s*\\(|update\\s*\\(\\s*params\\[|::create\\s*\\(\\s*\\$request->all\\s*\\)|->fill\\s*\\(\\s*\\$request->all\\s*\\))',
|
|
289
|
+
risk: 'high',
|
|
290
|
+
message: 'Possible mass assignment risk; no whitelist validation',
|
|
291
|
+
suggestion: 'Enable strong parameters/whitelist; only allow safe fields',
|
|
292
|
+
flags: 'gi',
|
|
293
|
+
extensions: ['.rb', '.php']
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
id: 'SEC030',
|
|
297
|
+
name: 'Disable TLS verification (Go)',
|
|
298
|
+
pattern: 'InsecureSkipVerify\\s*:\\s*true',
|
|
299
|
+
risk: 'high',
|
|
300
|
+
message: 'TLS certificate verification disabled in Go detected',
|
|
301
|
+
suggestion: 'Enable verification and use trusted CA; avoid MITM attacks',
|
|
302
|
+
flags: 'gi',
|
|
303
|
+
extensions: ['.go']
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
id: 'SEC031',
|
|
307
|
+
name: 'Disable certificate validation (C#)',
|
|
308
|
+
pattern: 'ServicePointManager\\.ServerCertificateValidationCallback',
|
|
309
|
+
risk: 'high',
|
|
310
|
+
message: 'Overriding global certificate validation; may accept any certificate',
|
|
311
|
+
suggestion: 'Remove the override and use proper validation mechanisms',
|
|
312
|
+
flags: 'gi',
|
|
313
|
+
extensions: ['.cs']
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
id: 'SEC032',
|
|
317
|
+
name: 'EF Core raw SQL concatenation',
|
|
318
|
+
pattern: 'FromSqlRaw\\s*\\([^\\)]*(\\+|\\$\\{)',
|
|
319
|
+
risk: 'critical',
|
|
320
|
+
message: 'Using FromSqlRaw with string concatenation detected',
|
|
321
|
+
suggestion: 'Use FromSqlInterpolated or parameterized queries to avoid injection',
|
|
322
|
+
flags: 'gi',
|
|
323
|
+
extensions: ['.cs']
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
id: 'SEC033',
|
|
327
|
+
name: 'Go system command execution',
|
|
328
|
+
pattern: 'exec\\.Command\\s*\\(',
|
|
329
|
+
risk: 'high',
|
|
330
|
+
message: 'System command execution in Go; injection risk if user input involved',
|
|
331
|
+
suggestion: 'Avoid shell -c and concatenation; whitelist parameters and exec paths',
|
|
332
|
+
flags: 'gi',
|
|
333
|
+
extensions: ['.go']
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
id: 'SEC034',
|
|
337
|
+
name: 'Insecure randomness (Go)',
|
|
338
|
+
pattern: 'math\/rand|\\brand\\.(Int|Intn|Float|Read)\\b',
|
|
339
|
+
risk: 'medium',
|
|
340
|
+
message: 'Using math/rand for randomness; not cryptographically secure',
|
|
341
|
+
suggestion: 'Use crypto/rand or secure RNG libraries for tokens and keys',
|
|
342
|
+
flags: 'gi',
|
|
343
|
+
extensions: ['.go']
|
|
344
|
+
}
|
|
345
|
+
];
|