Compare commits

...

6 Commits

Author SHA1 Message Date
yyhuni
fb0111adf2 Merge branch 'dev' 2026-01-06 17:27:35 +08:00
yyhuni
161ee9a2b1 Merge branch 'dev' 2026-01-06 17:27:16 +08:00
yyhuni
0cf75585d5 docs: 添加黑名单过滤功能说明到 README 2026-01-06 17:25:31 +08:00
yyhuni
1d8d5f51d9 feat(blacklist): add mock data and service integration for blacklist management
- Create new blacklist mock data module with global and target-specific patterns
- Add mock functions for getting and updating global blacklist rules
- Add mock functions for getting and updating target-specific blacklist rules
- Integrate mock blacklist endpoints into global-blacklist.service.ts
- Integrate mock blacklist endpoints into target.service.ts
- Export blacklist mock functions from main mock index
- Enable testing of blacklist management UI without backend API
2026-01-06 17:08:51 +08:00
github-actions[bot]
3f8de07c8c chore: bump version to v1.4.0-dev 2026-01-06 09:02:31 +00:00
yyhuni
6ff86e14ec Update README.md 2026-01-06 09:59:55 +08:00
6 changed files with 103 additions and 2 deletions

View File

@@ -69,6 +69,12 @@
- **自定义流程** - YAML 配置扫描流程,灵活编排
- **定时扫描** - Cron 表达式配置,自动化周期扫描
### 🚫 黑名单过滤
- **两层黑名单** - 全局黑名单 + Target 级黑名单,灵活控制扫描范围
- **智能规则识别** - 自动识别域名通配符(`*.gov`、IP、CIDR 网段
- **敏感目标保护** - 过滤政府、军事、教育等敏感域名,防止误扫
- **内网过滤** - 支持 `10.0.0.0/8``172.16.0.0/12``192.168.0.0/16` 等私有网段
### 🔖 指纹识别
- **多源指纹库** - 内置 EHole、Goby、Wappalyzer、Fingers、FingerPrintHub、ARL 等 2.7W+ 指纹规则
- **自动识别** - 扫描流程自动执行,识别 Web 应用技术栈

View File

@@ -1 +1 @@
v1.3.16-dev
v1.4.0-dev

View File

@@ -0,0 +1,69 @@
/**
* Blacklist Mock Data
*
* 黑名单规则 mock 数据
* - 全局黑名单:适用于所有 Target
* - Target 黑名单:仅适用于特定 Target
*/
export interface BlacklistResponse {
patterns: string[]
}
export interface UpdateBlacklistRequest {
patterns: string[]
}
// 全局黑名单 mock 数据
let mockGlobalBlacklistPatterns: string[] = [
'*.gov',
'*.edu',
'*.mil',
'10.0.0.0/8',
'172.16.0.0/12',
'192.168.0.0/16',
]
// Target 黑名单 mock 数据(按 targetId 存储)
const mockTargetBlacklistPatterns: Record<number, string[]> = {
1: ['*.internal.example.com', '192.168.1.0/24'],
2: ['cdn.example.com', '*.cdn.*'],
}
/**
* 获取全局黑名单
*/
export function getMockGlobalBlacklist(): BlacklistResponse {
return {
patterns: [...mockGlobalBlacklistPatterns],
}
}
/**
* 更新全局黑名单(全量替换)
*/
export function updateMockGlobalBlacklist(data: UpdateBlacklistRequest): BlacklistResponse {
mockGlobalBlacklistPatterns = [...data.patterns]
return {
patterns: mockGlobalBlacklistPatterns,
}
}
/**
* 获取 Target 黑名单
*/
export function getMockTargetBlacklist(targetId: number): BlacklistResponse {
return {
patterns: mockTargetBlacklistPatterns[targetId] ? [...mockTargetBlacklistPatterns[targetId]] : [],
}
}
/**
* 更新 Target 黑名单(全量替换)
*/
export function updateMockTargetBlacklist(targetId: number, data: UpdateBlacklistRequest): BlacklistResponse {
mockTargetBlacklistPatterns[targetId] = [...data.patterns]
return {
patterns: mockTargetBlacklistPatterns[targetId],
}
}

View File

@@ -182,3 +182,11 @@ export {
getMockNotificationSettings,
updateMockNotificationSettings,
} from './data/notification-settings'
// Blacklist
export {
getMockGlobalBlacklist,
updateMockGlobalBlacklist,
getMockTargetBlacklist,
updateMockTargetBlacklist,
} from './data/blacklist'

View File

@@ -1,4 +1,5 @@
import { api } from '@/lib/api-client'
import { USE_MOCK, mockDelay, getMockGlobalBlacklist, updateMockGlobalBlacklist } from '@/mock'
export interface GlobalBlacklistResponse {
patterns: string[]
@@ -12,6 +13,10 @@ export interface UpdateGlobalBlacklistRequest {
* Get global blacklist rules
*/
export async function getGlobalBlacklist(): Promise<GlobalBlacklistResponse> {
if (USE_MOCK) {
await mockDelay()
return getMockGlobalBlacklist()
}
const res = await api.get<GlobalBlacklistResponse>('/blacklist/rules/')
return res.data
}
@@ -20,6 +25,10 @@ export async function getGlobalBlacklist(): Promise<GlobalBlacklistResponse> {
* Update global blacklist rules (full replace)
*/
export async function updateGlobalBlacklist(data: UpdateGlobalBlacklistRequest): Promise<GlobalBlacklistResponse> {
if (USE_MOCK) {
await mockDelay()
return updateMockGlobalBlacklist(data)
}
const res = await api.put<GlobalBlacklistResponse>('/blacklist/rules/', data)
return res.data
}

View File

@@ -12,7 +12,7 @@ import type {
BatchCreateTargetsRequest,
BatchCreateTargetsResponse,
} from '@/types/target.types'
import { USE_MOCK, mockDelay, getMockTargets, getMockTargetById } from '@/mock'
import { USE_MOCK, mockDelay, getMockTargets, getMockTargetById, getMockTargetBlacklist, updateMockTargetBlacklist } from '@/mock'
/**
* Get all targets list (paginated)
@@ -163,6 +163,10 @@ export async function getTargetEndpoints(
* Get target's blacklist rules
*/
export async function getTargetBlacklist(id: number): Promise<{ patterns: string[] }> {
if (USE_MOCK) {
await mockDelay()
return getMockTargetBlacklist(id)
}
const response = await api.get<{ patterns: string[] }>(`/targets/${id}/blacklist/`)
return response.data
}
@@ -174,6 +178,11 @@ export async function updateTargetBlacklist(
id: number,
patterns: string[]
): Promise<{ count: number }> {
if (USE_MOCK) {
await mockDelay()
const result = updateMockTargetBlacklist(id, { patterns })
return { count: result.patterns.length }
}
const response = await api.put<{ count: number }>(`/targets/${id}/blacklist/`, { patterns })
return response.data
}