mirror of
https://github.com/yyhuni/xingrin.git
synced 2026-01-31 19:53:11 +08:00
Compare commits
6 Commits
v1.4.0-dev
...
v1.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb0111adf2 | ||
|
|
161ee9a2b1 | ||
|
|
0cf75585d5 | ||
|
|
1d8d5f51d9 | ||
|
|
3f8de07c8c | ||
|
|
6ff86e14ec |
@@ -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 应用技术栈
|
||||
|
||||
69
frontend/mock/data/blacklist.ts
Normal file
69
frontend/mock/data/blacklist.ts
Normal 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],
|
||||
}
|
||||
}
|
||||
@@ -182,3 +182,11 @@ export {
|
||||
getMockNotificationSettings,
|
||||
updateMockNotificationSettings,
|
||||
} from './data/notification-settings'
|
||||
|
||||
// Blacklist
|
||||
export {
|
||||
getMockGlobalBlacklist,
|
||||
updateMockGlobalBlacklist,
|
||||
getMockTargetBlacklist,
|
||||
updateMockTargetBlacklist,
|
||||
} from './data/blacklist'
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user