go实现自带webui支持限流人机验证爬虫防护sql注入xss攻击的waf web防火墙应用管理系统代码

代码语言:golang

所属分类:其他

代码描述:go实现自带webui支持限流人机验证爬虫防护sql注入xss攻击的waf web防火墙应用管理系统代码

代码标签: go 自带 webui 支持 限流 人机 验证 爬虫 防护 sql注入 xss 攻击 waf web

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

package main

import (
	"crypto/md5"
	"encoding/json"
	"fmt"
	"image"
	"image/color"
	"image/draw"
	"image/png"
	"io/ioutil"
	"log"
	"math"
	"math/rand"
	"net/http"
	"net/http/httputil"
	"net/url"
	"os"
	"regexp"
	"strconv"
	"strings"
	"sync"
	"time"

	"golang.org/x/image/font"
	"golang.org/x/image/font/basicfont"
	"golang.org/x/image/math/fixed"
)

// ============ 数据结构定义 ============

type Admin struct {
	Username string `json:"username"`
	Password string `json:"password"` // MD5存储
}

type ProxyTarget struct {
	ID           string    `json:"id"`
	Domain       string    `json:"domain"`       // 监听域名
	Target       string    `json:"target"`       // 目标地址
	Enabled      bool      `json:"enabled"`      // 是否启用
	CreatedAt    time.Time `json:"created_at"`
	RequestCount int64     `json:"request_count"`
	BlockCount   int64     `json:"block_count"`
}

type SessionData struct {
	Username  string
	LoginTime time.Time
}

type Statistics struct {
	TotalRequests int64            `json:"total_requests"`
	BlockedCount  int64            `json:"blocked_count"`
	AttackTypes   map[string]int64 `json:"attack_types"`
}

type Config struct {
	Admin                   Admin                  `json:"admin"`
	ProxyTargets            map[string]ProxyTarget `json:"proxy_targets"`
	EnableWAF               bool                   `json:"enable_waf"`
	EnableBot               bool                   `json:"enable_bot"`
	RateLimit               int                    `json:"rate_limit"`               // 每秒请求数
	RateLimitBurst          int                    `json:"rate_limit_burst"`         // 峰值
	EnableHumanVerification bool                   `json:"enable_human_verification"` // 启用人机验证
	Statistics              Statistics             `json:"statistics"`
}

// ============ 全局变量 ============

var (
	config         Config
	sessions       = make(map[string]SessionData)
	configFile     = "waf_config.json"
	rateLimiter    = make(map[string]*TokenBucket)
	captchaStore   = make(map[string]string)
	whitelistedIPs = make(map[string]time.Time) // 人机验证白名单
	mu             sync.RWMutex
	sessionMu      sync.RWMutex
	limiterMu      sync.RWMutex
	whitelistMu    sync.RWMutex
)

// ============ 令牌桶限流器 ============

type TokenBucket struct {
	tokens   float64
	capacity float64
	rate     float64
	lastTime time.Time
	mu       sync.Mutex
}

func NewTokenBucket(rate, capacity float64) *TokenBucket {
	return &TokenBucket{
		tokens:   capacity,
		capacity: capacity,
		rate:     rate,
		lastTime: time.Now(),
	}
}

func (tb *TokenBucket) Allow() bool {
	tb.mu.Lock()
	defer tb.mu.Unlock()

	now := time.Now()
	elapsed := now.Sub(tb.lastTime).Seconds()
	tb.tokens += elapsed * tb.rate

	if tb.tokens > tb.capacity {
		tb.tokens = tb.capacity
	}

	tb.lastTime = now

	if tb.tokens >= 1.0 {
		tb.tokens -= 1.0
		return true
	}

	return false
}

// ============ WAF规则引擎 ============

var wafRules = []struct {
	Name    string
	Pattern *regexp.Regexp
}{
	{"SQL_Injection", regexp.MustCompile(`(?i)(union.*select|select.*from|insert.*into|delete.*from|drop.*table|exec.*\(|script.*>)`)},
	{"XSS", regexp.MustCompile(`(?i)(<script|javascript:|onerror=|onload=|<iframe|eval\()`)},
	{"Path_Traversal", regexp.MustCompile(`(\.\./|\.\.\\|/etc/passwd|/windows/win\.ini)`)},
	{"Command_Injection", regexp.MustCompile(`(?i)(;|\||&|` + "`" + `)(\s)*(ls|cat|wget|curl|chmod|bash|sh|cmd|powershell)`)},
	{"XXE", regexp.MustCompile(`(?i)(<!entity|<!doctype.*\[)`)},
}

func checkWAF(r *http.Request) (bool, string) {
	if !config.EnableWAF {
		return true, ""
	}

	// 检查URL
	for _, rule := range wafRules {
		if rule.Pattern.MatchString(r.URL.String()) {
			return false, rule.Name
		}
	}

	// 检查POST数据
	if r.Method == "POST" {
		body, _ := ioutil.ReadAll(r.Body)
		// 重要的:读取后要重新装回去
		r.Body = ioutil.NopCloser(strings.NewReader(string(body)))

		for _, rule := range wafRules {
			if rule.Pattern.MatchString(string(body)) {
				return false, rule.Name
			}
		}
	}

	// 检查Headers
	for _, values := range r.Header {
		for _, value := range values {
			fo.........完整代码请登录后点击上方下载按钮下载查看

网友评论0