2024-08-23



package main
 
import (
    "fmt"
    "github.com/gin-gonic/gin"
    "net/http"
    "time"
)
 
// 自定义日志格式
type customLogger struct {
    method string
    url    string
    status int
    start  time.Time
}
 
// 实现 gin.HandlerFunc 接口
func (c *customLogger) Write(p []byte) (n int, err error) {
    fmt.Printf("[%s] %q %d %v\n", c.method, c.url, c.status, time.Since(c.start))
    return len(p), nil
}
 
// Logger 中间件
func Logger() gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        path := c.Request.URL.Path
        logger := &customLogger{
            method: c.Request.Method,
            url:    path,
            start:  start,
        }
        // 重写 ResponseWriter 的 Write 方法
        c.Writer = logger
 
        // 继续执行其他的中间件和处理函数
        c.Next()
 
        // 当所有中间件和处理函数执行完毕后,记录响应状态码
        logger.status = c.Writer.Status()
    }
}
 
func main() {
    r := gin.Default()
 
    // 使用自定义的Logger中间件
    r.Use(Logger())
 
    r.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World!")
    })
 
    // 启动服务器
    r.Run(":8080")
}

这段代码定义了一个自定义的日志中间件Logger,它会记录每个请求的HTTP方法、URL、响应时间和状态码。在main函数中,我们使用r.Use(Logger())来应用这个中间件。当服务器接收到请求时,Logger中间件会记录请求的开始时间,并在请求处理完毕后记录状态码和响应时间。

2024-08-23

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。以下是一些常见的Linux中间件Nginx的使用场景和示例代码:

  1. 作为静态内容的Web服务器:



server {
    listen       80;
    server_name  localhost;
 
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
  1. 作为代理服务器:



server {
    listen       80;
    server_name  localhost;
 
    location / {
        proxy_pass http://upstream_server;
    }
}
  1. 配置负载均衡:



upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}
 
server {
    listen       80;
    server_name  localhost;
 
    location / {
        proxy_pass http://backend;
    }
}
  1. 配置SSL/TLS:



server {
    listen       443 ssl;
    server_name  localhost;
 
    ssl_certificate      /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key  /etc/nginx/ssl/nginx.key;
 
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
  1. 配置缓存:



server {
    listen       80;
    server_name  localhost;
 
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 1d;
    }
}
  1. 配置负载压力测试:



server {
    listen       80;
    server_name  localhost;
 
    location / {
        proxy_pass http://backend;
        proxy_connect_timeout 1s;
        proxy_read_timeout 1s;
    }
}
  1. 配置日志记录:



server {
    listen       80;
    server_name  localhost;
 
    location / {
        proxy_pass http://backend;
        access_log  /var/log/nginx/access.log;
        error_log   /var/log/nginx/error.log;
    }
}

这些示例仅展示了Nginx配置的一部分,实际配置需要根据具体需求进行调整。

2024-08-23



# 使用外部Nginx基础镜像
FROM nginx:1.19.0
 
# 定义数据目录
ENV NGINX_DIR /etc/nginx
ENV NGINX_LOG_DIR /var/log/nginx
ENV NGINX_HTML_DIR /usr/share/nginx/html
 
# 创建配置文件目录
RUN mkdir -p ${NGINX_DIR}/conf.d
 
# 复制自定义配置文件
COPY custom.conf ${NGINX_DIR}/conf.d/default.conf
 
# 复制静态文件
COPY html/* ${NGINX_HTML_DIR}
 
# 设置容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]

这个Dockerfile示例展示了如何使用外部的Nginx基础镜像,并覆盖默认配置文件以及复制自定义的静态文件。这样做避免了重复编写Nginx的安装和配置过程,同时也使得镜像的维护更加简单和高效。

2024-08-23

Nginx中间件漏洞复现通常涉及到CVE-2019-9193漏洞,该漏洞是因为Nginx在处理包含特制的If-Modified-Since头的请求时,解析日期时间时使用了错误的年份导致的。

以下是复现该漏洞的步骤:

  1. 安装Docker和Docker Compose。
  2. 克隆Vulhub仓库到本地:git clone https://github.com/vulhub/vulhub.git
  3. 进入Nginx相应的环境目录,例如cd vulhub/nginx/CVE-2019-9193
  4. 运行docker-compose up -d启动环境
  5. 使用工具如curl或者wget发送带有特制的If-Modified-Since头的请求。

以下是一个使用curl发送请求的例子:




curl -H 'If-Modified-Since: Sat, 01 Jan 2016 00:00:01 GMT' http://your-nginx-host

如果Nginx版本在2019年9月以后的安全更新补丁发布之前的版本,则可能会出现相应的漏洞。在实际情况中,你需要确保Nginx的版本与漏洞描述相符合,并且使用的If-Modified-Since头也要正确设置。

注意:在实际的渗透测试中,请确保你已经得到了目标的授权,并且不要对任何系统造成破坏。

2024-08-23

以下是一个基于您提出的需求的Nginx配置示例,包括GeoIP2自动更新、防盗链、防爬虫、限制访问速度和限制连接数。

首先,确保你已经安装了Nginx和必要的开发工具。




# 安装Nginx
sudo apt-install nginx
 
# 安装开发工具
sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

接下来,安装GeoIP2和Nginx的GeoIP2模块:




# 安装GeoIP2库
sudo apt-get install geoip2 libgeoip-dev
 
# 安装Nginx GeoIP2模块
cd /usr/src
sudo git clone https://github.com/leev/ngx_http_geoip2_module.git
cd ngx_http_geoip2_module
sudo ./auto/configure
sudo make
sudo make install

配置Nginx:




# /etc/nginx/nginx.conf
 
events {}
 
http {
    geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
        auto_reload 5m;
        $geoip2_metadata_country_build metadata start 2 end 2;
        $geoip2_metadata_city_build metadata start 3 end 3;
    }
 
    server {
        listen 80;
        server_name your_domain.com;
 
        # 防盗链
        valid_referers none blocked server_names *.your_domain.com;
        if ($invalid_referer) {
            return 403;
        }
 
        # 防爬虫
        if ($http_user_agent ~* (Googlebot|Bing|Yahoo|Crawl|Flickr|Twitter)) {
            return 403;
        }
 
        # 限制访问速度
        limit_rate_after 1m;
        limit_rate 50k;
 
        # 限制连接数
        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_status 429;
        limit_conn_track_key $binary_remote_addr;
        limit_conn_zone $server_name zone=perserver:10m;
 
        location / {
            # 根据不同的国家设置不同的访问速度
            set $limit_rate 50k;
            if ($geoip2_data_country_code = "CN") {
                set $limit_rate 100k;
            }
            limit_rate $limit_rate;
 
            # 根据不同的国家设置不同的最大连接数
            set $limit_conn "32";
            if ($geoip2_data_country_code = "CN") {
                set $limit_conn "64";
            }
            limit_conn $limit_conn perip;
            limit_conn $limit_conn perserver;
 
            root /var/www/html;
            index index.html index.htm;
        }
    }
}

确保你已经下载了GeoLite2的数据库文件,并放置在正确的目录下。你可以从MaxMind官网获取这个数据库文件。




# 下载GeoLite2数据库
cd /usr/share/GeoIP/
sudo wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
sudo gunzip GeoLite2-City.mmdb.gz
sudo chmod 644 GeoLite2-City.mmdb

最后,重启Nginx以应用新的配置:




sudo systemctl restart nginx

这个配置示例提供了一个基本框架,你可以根据自己的需求进行调整和增强

2024-08-23



from flask import Flask
from flask_cors import CORS
 
app = Flask(__name__)
CORS(app, resources=r'/*')
 
@app.route('/')
def hello_world():
    return 'Hello, Cross-Origin-World!'
 
if __name__ == '__main__':
    app.run()

这段代码首先导入了Flask框架和Flask-CORS扩展。然后创建了一个Flask实例并初始化了CORS。最后定义了一个简单的路由,该路由允许跨域请求。在实际部署时,可以通过配置来指定允许跨域的域名,或者使用通配符*允许所有域的跨域请求。这段代码是一个简单的示例,展示了如何在Flask应用中启用CORS。

2024-08-23



import logging
import pandas as pd
 
# 配置logging库
logging.basicConfig(level=logging.INFO)
 
# 创建一个pandas DataFrame来保存日志数据
logs_df = pd.DataFrame(columns=['level', 'message'])
 
# 自定义处理日志的处理器
class LoggingHandler(logging.Handler):
    def emit(self, record):
        level = record.levelname
        message = record.getMessage()
        logs_df.loc[len(logs_df)] = [level, message]
 
# 添加自定义处理器到logger
handler = LoggingHandler()
logging.getLogger().addHandler(handler)
 
# 记录一些日志
logging.info('这是一条信息级别的日志')
logging.error('这是一条错误级别的日志')
logging.warning('这是一条警告级别的日志')
 
# 查看日志数据
print(logs_df)

这段代码首先配置了logging库,并创建了一个pandas DataFrame来保存日志数据。然后定义了一个自定义的日志处理器,当记录日志时,它会将日志信息添加到DataFrame中。最后,这段代码记录了几条日志,并打印出了保存的日志数据。这个例子展示了如何将日志信息收集和分析结合在一起,对于监控和分析应用程序的运行情况非常有用。

2024-08-23



import logging
from flask import Flask
 
# 创建Flask应用实例
app = Flask(__name__)
 
# 配置日志记录
app.logger.setLevel(logging.INFO)
 
@app.route('/')
def index():
    app.logger.info('访问了首页')
    return 'Hello, World!'
 
if __name__ == '__log__':
    # 在应用启动时,直接运行以下代码
    app.run(debug=True)

这段代码演示了如何在Flask应用中配置和使用日志记录功能。在index路由中,我们记录了一条信息级别的日志,当访问首页时,这条日志会被记录下来。在实际部署时,日志信息会被写入到日志文件中,而不是直接打印到控制台。

2024-08-23



import logging
 
# 创建一个logger
logger = logging.getLogger('my_logger')
 
# 设定logger的level为DEBUG
logger.setLevel(logging.DEBUG)
 
# 创建一个handler,用于写入log到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
 
# 创建一个handler,用于写入log到文件
file_handler = logging.FileHandler('my_app.log')
file_handler.setLevel(logging.ERROR)
 
# 设置logger的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
 
# 给logger添加handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)
 
# 测试log输出
logger.debug('这是一个debug级别的日志信息')
logger.info('这是一个info级别的日志信息')
logger.warning('这是一个warning级别的日志信息')
logger.error('这是一个error级别的日志信息')
logger.critical('这是一个critical级别的日志信息')

这段代码首先创建了一个名为my_logger的logger,并设置了其日志级别为DEBUG。然后,它添加了两个handler:一个用于将日志输出到控制台,另一个用于将日志写入文件my_app.log。两个handler的级别分别是DEBUG和ERROR。最后,通过设置输出格式并将formatter添加到handler,定义了日志的输出样式。这样,不同级别的日志信息可以在控制台上以不同的形式输出,同时也会被写入到文件中。

2024-08-23

报错解释:

这个错误表明RabbitMQ插件:rabbitmq_delayed_message_exchange没有安装成功。RabbitMQ的一些特性是通过插件机制提供的,比如延迟消息交换就是通过这个插件实现的。如果RabbitMQ无法找到这个插件,它会报告:plugins_not_found错误。

解决方法:

  1. 确认你正在使用的RabbitMQ版本支持rabbitmq_delayed_message_exchange插件。
  2. 如果插件支持,可以通过RabbitMQ的插件管理命令来安装它。以下是安装RabbitMQ插件的命令:



# 首先进入RabbitMQ的插件目录
cd /path/to/rabbitmq/sbin
 
# 使用RabbitMQ提供的命令安装插件
./rabbitmq-plugins enable rabbitmq_delayed_message_exchange

确保你有足够的权限执行这些命令,并且RabbitMQ服务正在运行。如果你是在Docker容器中运行RabbitMQ,你可能需要进入容器内部来执行这些命令。

如果你不需要延迟消息交换特性,你也可以考虑移除相关代码,避免这个错误。