增加威胁域名审计

This commit is contained in:
Alex Yang
2026-04-03 10:04:07 +08:00
parent 170cdb3537
commit f8e222aaf6
41 changed files with 81016 additions and 4672993 deletions
+27 -20
View File
@@ -89,6 +89,11 @@ func createTables(db *sql.DB) error {
CREATE INDEX IF NOT EXISTS idx_client_ip ON query_logs(client_ip);
CREATE INDEX IF NOT EXISTS idx_result ON query_logs(result);
CREATE INDEX IF NOT EXISTS idx_query_type ON query_logs(query_type);
CREATE INDEX IF NOT EXISTS idx_result_timestamp ON query_logs(result, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_query_type_timestamp ON query_logs(query_type, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_domain_timestamp ON query_logs(domain, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_client_ip_timestamp ON query_logs(client_ip, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_result_query_type ON query_logs(result, query_type);
`
_, err := db.Exec(schema)
@@ -204,8 +209,6 @@ func (s *SQLiteStore) Log(log QueryLog) error {
// QueryLogs 查询日志
func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog, int64, error) {
fmt.Printf("SQLiteStore.QueryLogs called: filter=%+v, page=%+v\n", filter, page)
// 构建查询条件
whereClause := "1=1"
args := []interface{}{}
@@ -235,18 +238,6 @@ func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog,
searchTerm := "%" + filter.SearchTerm + "%"
args = append(args, searchTerm, searchTerm)
}
fmt.Printf("SQLite WHERE clause: %s, args: %v\n", whereClause, args)
// 获取总数
countQuery := fmt.Sprintf("SELECT COUNT(*) FROM query_logs WHERE %s", whereClause)
var total int64
err := s.db.QueryRow(countQuery, args...).Scan(&total)
if err != nil {
return nil, 0, fmt.Errorf("查询总数失败:%w", err)
}
fmt.Printf("SQLite total count: %d\n", total)
// 构建排序
sortField := page.SortField
@@ -258,28 +249,37 @@ func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog,
sortDirection = "DESC"
}
// 查询日志
// 使用子查询一次性获取总数和数据,提高查询效率
query := fmt.Sprintf(`
SELECT id, timestamp, client_ip, domain, query_type, response_time,
result, block_rule, block_type, from_cache, dnssec, edns,
dns_server, dnssec_server, answers, response_code
SELECT
id, timestamp, client_ip, domain, query_type, response_time,
result, block_rule, block_type, from_cache, dnssec, edns,
dns_server, dnssec_server, answers, response_code,
COUNT(*) OVER() as total_count
FROM query_logs
WHERE %s
ORDER BY %s %s
LIMIT ? OFFSET ?
`, whereClause, sortField, sortDirection)
args = append(args, page.Limit, page.Offset)
queryArgs := make([]interface{}, len(args)+2)
copy(queryArgs, args)
queryArgs[len(args)] = page.Limit
queryArgs[len(args)+1] = page.Offset
rows, err := s.db.Query(query, args...)
rows, err := s.db.Query(query, queryArgs...)
if err != nil {
return nil, 0, fmt.Errorf("查询日志失败:%w", err)
}
defer rows.Close()
var logs []QueryLog
var total int64 = 0
hasRows := false
for rows.Next() {
hasRows = true
var log QueryLog
var totalCount int64
err := rows.Scan(
&log.ID,
&log.Timestamp,
@@ -297,11 +297,18 @@ func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog,
&log.DNSSECServer,
&log.Answers,
&log.ResponseCode,
&totalCount,
)
if err != nil {
return nil, 0, fmt.Errorf("扫描日志失败:%w", err)
}
logs = append(logs, log)
total = totalCount
}
// 如果没有数据,总数为 0
if !hasRows {
total = 0
}
return logs, total, nil