banip

package module
v0.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 7, 2023 License: MIT Imports: 4 Imported by: 0

README

What is echo-ban-ip?

echo-ban-ip is a out of the box echo middleware that to ban ip address that request too many. to prevent simple script attack.

echo-ban-ip 是一个开箱即用的echo中间件,用于禁止请求过多的ip地址。以防止简单的脚本攻击。

What is the difference between this and Rate Limiter?

The middleware is consistent of the most function of Rate Limiter. The most difference is that can ban ip address that request too many for punish.

该中间件与Rate Limiter的大部分功能一致。最大的区别是可以禁止请求过多的ip地址一个额外时长以进行惩罚。

Usage

Basic

package main

import (
	"net/http"
	"time"

	banip "github.com/CorrectRoadH/echo-ban-ip"
	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()

	e.Use(banip.FilterRequestConfig(banip.FilterConfig{
		LimitTime:         1 * time.Minute,
		LimitRequestCount: 60,
		BanTime:           1 * time.Hour,
	}))

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}

AllowList and DenyList

package main

import (
	"net/http"
	"time"

	banip "github.com/CorrectRoadH/echo-ban-ip"
	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()

	e.Use(banip.FilterRequestConfig(banip.FilterConfig{
		LimitTime:         1 * time.Minute,
		LimitRequestCount: 60,
		BanTime:           1 * time.Hour,
		AllowList:         []string{"127.0.0.1"},
		DenyList:         []string{"192.168.1.1"},
	}))

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}

Custom Deny Hander

package main

import (
	"net/http"
	"time"

	banip "github.com/CorrectRoadH/echo-ban-ip"
	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()

	e.Use(banip.FilterRequestConfig(banip.FilterConfig{
		LimitTime:         1 * time.Minute,
		LimitRequestCount: 60,
		BanTime:           1 * time.Hour,
		DenyHandler: func(c echo.Context, identifier string, err error) error {
			return c.String(http.StatusForbidden, "You are banned")
		},
	}))

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}

Custom Identifier

package main

import (
	"net/http"
	"time"

	banip "github.com/CorrectRoadH/echo-ban-ip"
	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()

	e.Use(banip.FilterRequestConfig(banip.FilterConfig{
		LimitTime:         1 * time.Minute,
		LimitRequestCount: 60,
		BanTime:           1 * time.Hour,
		DenyHandler: func(c echo.Context, identifier string, err error) error {
			return c.String(http.StatusForbidden, "You are banned")
		},
		IdentifierExtractor: func(c echo.Context) (string, error) {
			return c.Request().UserAgent(), nil
		},
	}))

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}

Skipper

package main

import (
	"net/http"
	"time"

	banip "github.com/CorrectRoadH/echo-ban-ip"
	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()

	e.Use(banip.FilterRequestConfig(banip.FilterConfig{
		Skipper: func(c echo.Context) bool {
			if c.Request().URL.Path == "/favicon.ico" {
				return true
			}
			return false
		},
		LimitTime:         1 * time.Minute,
		LimitRequestCount: 60,
		BanTime:           1 * time.Hour,
		DenyHandler: func(c echo.Context, identifier string, err error) error {
			return c.String(http.StatusForbidden, "You are banned")
		},
		IdentifierExtractor: func(c echo.Context) (string, error) {
			return c.Request().UserAgent(), nil
		},
	}))

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var RecordMap sync.Map

Functions

func FilterRequestConfig

func FilterRequestConfig(config FilterConfig) echo.MiddlewareFunc

func IsIPBanned

func IsIPBanned(IP string, config FilterConfig) bool

Types

type FilterConfig

type FilterConfig struct {
	Skipper             middleware.Skipper
	ErrorHandler        func(context echo.Context, err error) error
	DenyHandler         func(context echo.Context, identifier string, err error) error
	IdentifierExtractor middleware.Extractor

	LimitRequestCount int
	LimitTime         time.Duration // second
	BanTime           time.Duration // second
	AllowList         []string
	DenyList          []string
}

type IPRecord

type IPRecord struct {
	IP           string
	EarliestTime time.Time //unix time
	LastTime     time.Time //unix time
	Count        int
	// contains filtered or unexported fields
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL