一、详细介绍
SamWaf网站防火墙是一款适用于小公司、工作室和个人网站的开源轻量级网站防火墙,完全私有化部署,数据加密且仅保存本地,一键启动,支持Linux,Windows 64位,Arm64。
主要功能:
代码完全开源
支持私有化部署
轻量化不依赖三方服务
完全独立引擎,防护功能不依赖IIS,Nginx
自定义防护规则,支持脚本和界面编辑
支持白名单访问
支持IP黑名单
支持URL白名单
支持限制URL访问
支持指定界面数据隐私输出
支持CC频率访问
支持全局一键配置
支持分网站单独防护策略
日志加密保存
通讯日志加密
信息脱敏保存
支持OWASP CRS规则集
自动SSL证书申请以及续签
SSL证书批量检测到期情况
支持IPV6
支持自定义拦截界面
二、效果展示
1.部分代码
代码如下(示例):
// 导出excel
func (w *WafCommonApi) ExportExcelApi(c *gin.Context) {
var req request.WafCommonReq
err := c.ShouldBind(&req)
if err == nil {
// 生成文件名
fileName := time.Now().Format("20060102150405") + ".xlsx"
// 创建 Excel 文件
f := excelize.NewFile()
sheetName := "Sheet1"
// 获取数据的类型和值
dataType, dataValue := getStructTypeValueByName(req.TableName)
/*dataType := reflect.TypeOf(data)
dataValue := reflect.ValueOf(data)*/
// 设置表头
for i := 0; i < dataType.NumField(); i++ {
field := dataType.Field(i)
if field.Name == "BaseOrm" {
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", w.GetColumnName(i), 1), " - ")
} else {
colName := field.Tag.Get("json") // 获取 excel 标签的值,即表头名称
//fmt.Println(fmt.Sprintf("%v , %v %v %v", i, colName, dataType.NumField(), fmt.Sprintf("%s%d", w.GetColumnName(i), 1)))
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", w.GetColumnName(i), 1), colName)
}
}
// 填充数据
for i := 0; i < dataValue.Len(); i++ {
rowNum := i + 2
rowValue := dataValue.Index(i)
for j := 0; j < dataType.NumField(); j++ {
field := dataType.Field(j)
if field.Name == "BaseOrm" {
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", w.GetColumnName(j), rowNum), "")
} else {
colValue := rowValue.Field(j).Interface()
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", w.GetColumnName(j), rowNum), colValue)
}
}
}
// 保存 Excel 文件
if err := f.SaveAs(fileName); err != nil {
log.Fatal("无法保存 Excel 文件:", err)
}
// 设置响应头
c.Header("Content-Type", "application/octet-stream")
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
// 将文件内容输出给客户端
c.File(fileName)
// 删除临时文件
if err := os.Remove(fileName); err != nil {
log.Println("无法删除临时文件:", err)
}
} else {
response.FailWithMessage("解析失败", c)
}
}
func (w *WafCommonApi) ImportExcelApi(c *gin.Context) {
file, err := c.FormFile("file") // "excelFile" 对应前端上传的文件字段名
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 生成文件名
fileName := time.Now().Format("20060102150405") + "import.xlsx"