smart-review 1.0.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.
@@ -0,0 +1,311 @@
1
+ // 安全规则
2
+ export default [
3
+ {
4
+ id: 'SEC001',
5
+ name: '硬编码密码检测',
6
+ pattern: '(password|pwd|pass)\\s*[=:]\\s*[\'"][^\'\"]{6,}[\'"]',
7
+ risk: 'high',
8
+ message: '发现硬编码的密码或密钥',
9
+ suggestion: '使用环境变量或安全的密钥管理服务',
10
+ flags: 'gi',
11
+ excludePatterns: ['//.*', '/\\*[\\s\\S]*?\\*/', '(example|test|demo|placeholder|xxx|123|abc|password|secret)']
12
+ },
13
+ {
14
+ id: 'SEC002',
15
+ name: 'SQL注入风险',
16
+ pattern: '(execute|query)\\s*\\(\\s*[fF]?[\'"][^\']*\\+.*[\'"]',
17
+ risk: 'critical',
18
+ message: '发现字符串拼接SQL查询,存在SQL注入风险',
19
+ suggestion: '使用参数化查询或ORM的安全方法',
20
+ flags: 'gi'
21
+ },
22
+ {
23
+ id: 'SEC003',
24
+ name: 'XSS风险',
25
+ pattern: 'innerHTML\\s*=|document\\.write\\s*\\(',
26
+ risk: 'high',
27
+ message: '发现直接操作HTML内容,可能存在XSS风险',
28
+ suggestion: '使用textContent或安全的DOM操作方法',
29
+ flags: 'gi'
30
+ },
31
+ {
32
+ id: 'SEC004',
33
+ name: '命令注入风险',
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: '发现命令执行函数调用,且可能包含用户输入',
37
+ suggestion: '避免使用用户输入构造命令,或进行严格的输入验证',
38
+ flags: 'gi'
39
+ }
40
+ ,
41
+ {
42
+ id: 'SEC005',
43
+ name: '路径遍历风险',
44
+ pattern: '(fs\\.(readFile|writeFile|appendFile|mkdir|rmdir|unlink)|open|fopen|FileInputStream|Files\\.newInputStream)\\s*\\([^\\)]*(\\.\\.\/|\\+|\\$\\{)',
45
+ risk: 'high',
46
+ message: '可能存在路径遍历或未校验的文件路径使用',
47
+ suggestion: '对路径进行规范化、白名单校验,并避免直接拼接用户输入',
48
+ flags: 'gi'
49
+ },
50
+ {
51
+ id: 'SEC006',
52
+ name: '禁用SSL证书校验',
53
+ pattern: 'requests\\.(get|post|put|delete)\\s*\\([^\\)]*verify\\s*=\\s*False',
54
+ risk: 'high',
55
+ message: '发现禁用SSL证书校验的HTTP请求',
56
+ suggestion: '启用证书校验或使用可信证书,避免中间人攻击',
57
+ flags: 'gi'
58
+ },
59
+ {
60
+ id: 'SEC007',
61
+ name: '弱加密算法使用',
62
+ pattern: 'crypto\\.(createHash|createCipheriv)\\s*\\(\\s*[\'\"](md5|sha1)[\'\"\\)]|MessageDigest\\.getInstance\\(\\s*[\'\"](MD5|SHA-1)[\'\"\\)]',
63
+ risk: 'high',
64
+ message: '检测到MD5/SHA1等弱加密算法的使用',
65
+ suggestion: '使用更安全的算法,如SHA-256/512、Argon2、bcrypt、scrypt',
66
+ flags: 'gi'
67
+ },
68
+ {
69
+ id: 'SEC008',
70
+ name: '硬编码密钥/Token',
71
+ pattern: '\\b(api[_-]?key|secret|token)\\b\\s*[:=]\\s*[\'\"][A-Za-z0-9_\\-\\/\\+=]{16,}[\'\"]',
72
+ risk: 'high',
73
+ message: '检测到硬编码的密钥或访问令牌',
74
+ suggestion: '将敏感信息存放在安全的密钥管理或环境变量中',
75
+ flags: 'gi'
76
+ },
77
+ {
78
+ id: 'SEC009',
79
+ name: '不安全反序列化',
80
+ pattern: 'pickle\\.loads\\s*\\(|yaml\\.load\\s*\\(|ObjectInputStream\\.readObject\\s*\\(|unserialize\\s*\\(',
81
+ risk: 'critical',
82
+ message: '检测到潜在的不安全反序列化操作',
83
+ suggestion: '使用安全的反序列化方式,例如 yaml.safe_load,避免反序列化不可信数据',
84
+ flags: 'gi'
85
+ },
86
+ {
87
+ id: 'SEC010',
88
+ name: 'SSRF风险',
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: '检测到可能由用户输入构成的URL请求,存在SSRF风险',
92
+ suggestion: '对外部URL进行白名单限制并校验,禁止访问内部地址',
93
+ flags: 'gi'
94
+ },
95
+ {
96
+ id: 'SEC011',
97
+ name: 'NoSQL注入风险',
98
+ pattern: '(db|collection)\\.[a-zA-Z]+\\s*\\([^\\)]*\\+[^\\)]*\\)',
99
+ risk: 'high',
100
+ message: '检测到可能的NoSQL注入(动态拼接查询条件)',
101
+ suggestion: '使用参数化查询或安全的查询构建器,避免直接拼接',
102
+ flags: 'gi'
103
+ },
104
+ {
105
+ id: 'SEC012',
106
+ name: '开放重定向',
107
+ pattern: '(res\\.redirect|response\\.sendRedirect)\\s*\\([^\\)]*(\\+|\\$\\{)',
108
+ risk: 'high',
109
+ message: '检测到基于用户输入的重定向,可能导致开放重定向',
110
+ suggestion: '对目标URL进行白名单校验或固定化处理',
111
+ flags: 'gi'
112
+ },
113
+ {
114
+ id: 'SEC013',
115
+ name: '系统命令执行(Python)',
116
+ pattern: '(os\\.system|subprocess\\.(Popen|call|run))\\s*\\(',
117
+ risk: 'critical',
118
+ message: '检测到系统命令执行调用,若包含用户输入可能导致命令注入',
119
+ suggestion: '避免直接调用系统命令,改用安全库或严格白名单参数',
120
+ flags: 'gi'
121
+ },
122
+ {
123
+ id: 'SEC014',
124
+ name: '不安全随机数',
125
+ pattern: '(Math\\.random\\(|random\\.random\\(|new\\s+Random\\s*\\().*(?:token|key|secret|password|salt|nonce|session|auth|uuid)',
126
+ risk: 'medium',
127
+ message: '检测到在安全相关场景中使用非加密安全的随机数生成方法',
128
+ suggestion: '使用加密安全的随机数生成器,如 crypto.randomBytes、secrets.SystemRandom',
129
+ flags: 'gi'
130
+ },
131
+ {
132
+ id: 'SEC015',
133
+ name: '危险的eval/Function使用',
134
+ pattern: '\\beval\\s*\\(|new\\s+Function\\s*\\(',
135
+ risk: 'high',
136
+ message: '检测到可能导致代码注入的动态执行',
137
+ suggestion: '避免使用eval/Function,改用安全的解析与映射逻辑',
138
+ flags: 'gi'
139
+ },
140
+ {
141
+ id: 'SEC016',
142
+ name: '原型污染',
143
+ pattern: '(?:__proto__|constructor|prototype)\\s*[:=]',
144
+ risk: 'high',
145
+ message: '检测到对对象原型的直接赋值,可能导致原型污染',
146
+ suggestion: '避免从不可信数据合并到对象原型,使用安全的合并策略',
147
+ flags: 'gi'
148
+ },
149
+ {
150
+ id: 'SEC017',
151
+ name: 'Java字符串拼接SQL执行',
152
+ pattern: 'Statement\\s*\\.\\s*(execute|executeQuery|executeUpdate)\\s*\\([^\\)]*(\\+|%s)',
153
+ risk: 'critical',
154
+ message: '检测到通过字符串拼接构造SQL语句的执行',
155
+ suggestion: '使用PreparedStatement与占位符进行参数化查询',
156
+ flags: 'gi'
157
+ },
158
+ {
159
+ id: 'SEC018',
160
+ name: 'jQuery.html导致XSS风险',
161
+ pattern: '\\$\\([^\\)]*\\)\\.html\\s*\\(',
162
+ risk: 'high',
163
+ message: '检测到直接注入HTML内容,可能导致XSS',
164
+ suggestion: '使用text()或可信模板引擎进行转义输出',
165
+ flags: 'gi'
166
+ },
167
+ {
168
+ id: 'SEC019',
169
+ name: '过大文件权限(777)',
170
+ pattern: 'chmod\\s*\\([^\\)]*777',
171
+ risk: 'high',
172
+ message: '检测到设置过大的文件权限,存在安全风险',
173
+ suggestion: '使用最小权限原则,避免设置777等过宽权限',
174
+ flags: 'gi'
175
+ },
176
+ {
177
+ id: 'SEC020',
178
+ name: '系统命令执行(多语言)',
179
+ pattern: '(system\\s*\\(|passthru\\s*\\(|shell_exec\\s*\\(|Process\\.Start\\s*\\()',
180
+ risk: 'critical',
181
+ message: '检测到系统命令执行调用,若包含用户输入可能导致命令注入',
182
+ suggestion: '避免直接调用系统命令,改用安全库或严格白名单参数',
183
+ flags: 'gi'
184
+ },
185
+ {
186
+ id: 'SEC021',
187
+ name: '禁用TLS校验(Node)',
188
+ pattern: '(rejectUnauthorized\s*:\s*false|process\.env\.NODE_TLS_REJECT_UNAUTHORIZED\s*=\s*[\'\"]0[\'\"])',
189
+ risk: 'high',
190
+ message: '检测到禁用TLS证书校验的配置',
191
+ suggestion: '启用证书校验并使用可信CA,避免中间人攻击',
192
+ flags: 'gi'
193
+ },
194
+ {
195
+ id: 'SEC022',
196
+ name: 'CORS任意来源',
197
+ pattern: '(Access-Control-Allow-Origin\\s*:\\s*\\*|cors\\s*\\(\\s*\\{[^}]*origin\\s*:\\s*[\'\"\\*\'\"])',
198
+ risk: 'medium',
199
+ message: '检测到CORS允许任意来源,可能导致跨域数据泄露',
200
+ suggestion: '仅对可信来源开放,或使用令牌校验与细粒度策略',
201
+ flags: 'gi'
202
+ },
203
+ {
204
+ id: 'SEC023',
205
+ name: 'LDAP注入风险',
206
+ pattern: '((DirContext|InitialDirContext|LdapContext)\\.[a-zA-Z]+\\s*\\([^)]*(\\+|\\$\\{))|(ldap3\\.Connection\\.search\\s*\\([^)]*(\\+|\\$\\{))',
207
+ risk: 'high',
208
+ message: '检测到基于字符串拼接的LDAP查询过滤器',
209
+ suggestion: '使用安全的过滤器构造与参数绑定,避免直接拼接',
210
+ flags: 'gi'
211
+ },
212
+ {
213
+ id: 'SEC024',
214
+ name: 'XXE(XML外部实体)风险',
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解析,未禁用外部实体可能导致XXE',
218
+ suggestion: '禁用外部实体解析,或使用安全解析库(如defusedxml)',
219
+ flags: 'gi'
220
+ },
221
+ {
222
+ id: 'SEC025',
223
+ name: 'Java HostnameVerifier始终返回true',
224
+ pattern: 'new\s+HostnameVerifier\s*\(\)\s*\{[\s\S]*?return\s+true;[\s\S]*?\}',
225
+ risk: 'high',
226
+ message: '检测到跳过主机名校验的HTTPS验证',
227
+ suggestion: '实现严格的主机名校验逻辑,避免任意通过',
228
+ flags: 'gi'
229
+ },
230
+ {
231
+ id: 'SEC026',
232
+ name: 'Node禁用证书错误忽略',
233
+ pattern: 'process\.env\.NODE_TLS_REJECT_UNAUTHORIZED\s*=\s*[\'\"]0[\'\"]',
234
+ risk: 'critical',
235
+ message: '检测到全局禁用证书错误的环境变量设置',
236
+ suggestion: '移除该设置并使用合法证书,或在测试环境隔离',
237
+ flags: 'gi'
238
+ },
239
+ {
240
+ id: 'SEC027',
241
+ name: '连接字符串包含凭据',
242
+ pattern: '(mongodb|mysql|postgres|redis)://[^@]+:[^@]+@',
243
+ risk: 'high',
244
+ message: '检测到在连接字符串中硬编码了账号密码',
245
+ suggestion: '使用环境变量或安全凭据存储,避免明文出现在代码中',
246
+ flags: 'gi'
247
+ },
248
+ {
249
+ id: 'SEC028',
250
+ name: '日志输出敏感信息',
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: '检测到将敏感信息输出到日志',
254
+ suggestion: '对敏感字段进行脱敏或完全避免记录',
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: '检测到可能的批量赋值风险,未进行字段白名单校验',
263
+ suggestion: '启用强参数/属性白名单,仅允许安全字段写入',
264
+ flags: 'gi'
265
+ },
266
+ {
267
+ id: 'SEC030',
268
+ name: '禁用TLS校验(Go)',
269
+ pattern: 'InsecureSkipVerify\s*:\s*true',
270
+ risk: 'high',
271
+ message: '检测到在Go中禁用了TLS证书校验',
272
+ suggestion: '启用证书校验并使用可信CA,避免中间人攻击',
273
+ flags: 'gi'
274
+ },
275
+ {
276
+ id: 'SEC031',
277
+ name: '禁用证书校验(C#)',
278
+ pattern: 'ServicePointManager\.ServerCertificateValidationCallback',
279
+ risk: 'high',
280
+ message: '检测到覆盖全局证书校验回调,可能接受任意证书',
281
+ suggestion: '移除该回调并使用正确的证书验证机制',
282
+ flags: 'gi'
283
+ },
284
+ {
285
+ id: 'SEC032',
286
+ name: 'Entity Framework原生SQL拼接',
287
+ pattern: 'FromSqlRaw\\s*\\([^\\)]*(\\+|\\$\\{)',
288
+ risk: 'critical',
289
+ message: '检测到EF Core使用FromSqlRaw并进行字符串拼接',
290
+ suggestion: '使用FromSqlInterpolated或参数化查询,避免注入风险',
291
+ flags: 'gi'
292
+ },
293
+ {
294
+ id: 'SEC033',
295
+ name: 'Go系统命令执行',
296
+ pattern: 'exec\\.Command\\s*\\(',
297
+ risk: 'high',
298
+ message: '检测到Go中执行系统命令,若包含用户输入可能导致命令注入',
299
+ suggestion: '避免使用shell -c与拼接命令,采用白名单参数与直接可执行路径',
300
+ flags: 'gi'
301
+ },
302
+ {
303
+ id: 'SEC034',
304
+ name: '不安全随机数(Go)',
305
+ pattern: 'math\/rand|\brand\.(Int|Intn|Float|Read)\b',
306
+ risk: 'medium',
307
+ message: '检测到使用math/rand生成随机数,非加密安全',
308
+ suggestion: '使用crypto/rand或安全随机数库生成敏感令牌与密钥',
309
+ flags: 'gi'
310
+ }
311
+ ];
@@ -0,0 +1,80 @@
1
+ {
2
+ "ai": {
3
+ "enabled": false,
4
+ "model": "gpt-4o-mini",
5
+ "apiKey": "your-openai-api-key",
6
+ "baseURL": "",
7
+ "temperature": 0.1,
8
+ "maxResponseTokens": 4096,
9
+ "maxFileSizeKB": 100,
10
+ "enabledFor": [".js", ".ts", ".jsx", ".tsx", ".vue", ".py", ".java", ".cpp", ".c", ".cs", ".php", ".rb", ".go", ".rs", ".swift", ".kt"],
11
+ "useStaticHints": true,
12
+ "maxRequestTokens": 8000,
13
+ "minFilesPerBatch": 1,
14
+ "maxFilesPerBatch": 10,
15
+ "tokenRatio": 4,
16
+ "chunkOverlapLines": 5,
17
+ "includeStaticHints": true,
18
+ "concurrency": 3,
19
+ "reviewOnlyChanges": true,
20
+ "contextMergeLines": 10
21
+ },
22
+ "riskLevels": {
23
+ "critical": { "block": true },
24
+ "high": { "block": true },
25
+ "medium": { "block": true },
26
+ "low": { "block": false },
27
+ "suggestion": { "block": false }
28
+ },
29
+
30
+ "suppressLowLevelOutput": false,
31
+ "useExternalRulesOnly": false,
32
+ "fileExtensions": [".js", ".jsx", ".ts", ".tsx", ".vue", ".svelte", ".py", ".java", ".go", ".rs", ".cpp", ".c", ".h", ".php", ".rb", ".html", ".css", ".scss", ".less"],
33
+ "ignoreFiles": [
34
+ "**/node_modules/**",
35
+ "**/vendor/**",
36
+ "**/.pnpm/**",
37
+ "**/bower_components/**",
38
+ "**/coverage/**",
39
+ "**/test-results/**",
40
+ "**/reports/**",
41
+ "**/*.min.js",
42
+ "**/*.min.css",
43
+ "**/*.bundle.js",
44
+ "**/*.chunk.js",
45
+ "**/*.umd.js",
46
+ "**/*.generated.*",
47
+ "**/*.auto.*",
48
+ "**/generated/**",
49
+ "**/.git/**",
50
+ "**/.svn/**",
51
+ "**/.hg/**",
52
+ "**/tmp/**",
53
+ "**/temp/**",
54
+ "**/*.tmp",
55
+ "**/*.temp",
56
+ "**/*.swp",
57
+ "**/*.swo",
58
+ "**/*~",
59
+ "**/.vscode/**",
60
+ "**/.idea/**",
61
+ "**/*.iml",
62
+ "**/.project",
63
+ "**/.classpath",
64
+ "**/.settings/**",
65
+ "**/*.log",
66
+ "**/logs/**",
67
+ "**/.cache/**",
68
+ "**/.next/**",
69
+ "**/.nuxt/**",
70
+ "**/.vuepress/**",
71
+ "**/package-lock.json",
72
+ "**/yarn.lock",
73
+ "**/pnpm-lock.yaml",
74
+ "**/composer.lock",
75
+ "**/Pipfile.lock",
76
+ "**/.env",
77
+ "**/.env.*",
78
+ "**/config/secrets.*"
79
+ ]
80
+ }