diff --git a/internal/web/actions/default/servers/components/waf/policy.go b/internal/web/actions/default/servers/components/waf/policy.go
index 2e7eacba..bc9ebc47 100644
--- a/internal/web/actions/default/servers/components/waf/policy.go
+++ b/internal/web/actions/default/servers/components/waf/policy.go
@@ -97,6 +97,7 @@ func (this *PolicyAction) RunGet(params struct {
"blockOptions": firewallPolicy.BlockOptions,
"pageOptions": firewallPolicy.PageOptions,
"captchaOptions": firewallPolicy.CaptchaOptions,
+ "jsCookieOptions": firewallPolicy.JSCookieOptions,
"useLocalFirewall": firewallPolicy.UseLocalFirewall,
"synFlood": firewallPolicy.SYNFlood,
"log": firewallPolicy.Log,
diff --git a/internal/web/actions/default/servers/components/waf/update.go b/internal/web/actions/default/servers/components/waf/update.go
index 51398f24..d3c1ced7 100644
--- a/internal/web/actions/default/servers/components/waf/update.go
+++ b/internal/web/actions/default/servers/components/waf/update.go
@@ -10,7 +10,6 @@ import (
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
- "net/http"
)
type UpdateAction struct {
@@ -36,17 +35,17 @@ func (this *UpdateAction) RunGet(params struct {
// block options
if firewallPolicy.BlockOptions == nil {
- firewallPolicy.BlockOptions = &firewallconfigs.HTTPFirewallBlockAction{
- StatusCode: http.StatusForbidden,
- Body: "Blocked By WAF",
- URL: "",
- Timeout: 60,
- }
+ firewallPolicy.BlockOptions = firewallconfigs.NewHTTPFirewallBlockAction()
}
// page options
if firewallPolicy.PageOptions == nil {
- firewallPolicy.PageOptions = firewallconfigs.DefaultHTTPFirewallPageAction()
+ firewallPolicy.PageOptions = firewallconfigs.NewHTTPFirewallPageAction()
+ }
+
+ // jscookie options
+ if firewallPolicy.JSCookieOptions == nil {
+ firewallPolicy.JSCookieOptions = firewallconfigs.NewHTTPFirewallJavascriptCookieAction()
}
// mode
@@ -79,6 +78,7 @@ func (this *UpdateAction) RunGet(params struct {
"blockOptions": firewallPolicy.BlockOptions,
"pageOptions": firewallPolicy.PageOptions,
"captchaOptions": firewallPolicy.CaptchaOptions,
+ "jsCookieOptions": firewallPolicy.JSCookieOptions,
"useLocalFirewall": firewallPolicy.UseLocalFirewall,
"synFloodConfig": firewallPolicy.SYNFlood,
"log": firewallPolicy.Log,
@@ -110,21 +110,22 @@ func (this *UpdateAction) RunGet(params struct {
}
func (this *UpdateAction) RunPost(params struct {
- FirewallPolicyId int64
- Name string
- GroupCodes []string
- BlockOptionsJSON []byte
- PageOptionsJSON []byte
- CaptchaOptionsJSON []byte
- Description string
- IsOn bool
- Mode string
- UseLocalFirewall bool
- SynFloodJSON []byte
- LogJSON []byte
- MaxRequestBodySize int64
- DenyCountryHTML string
- DenyProvinceHTML string
+ FirewallPolicyId int64
+ Name string
+ GroupCodes []string
+ BlockOptionsJSON []byte
+ PageOptionsJSON []byte
+ CaptchaOptionsJSON []byte
+ JsCookieOptionsJSON []byte
+ Description string
+ IsOn bool
+ Mode string
+ UseLocalFirewall bool
+ SynFloodJSON []byte
+ LogJSON []byte
+ MaxRequestBodySize int64
+ DenyCountryHTML string
+ DenyProvinceHTML string
Must *actions.Must
}) {
@@ -136,7 +137,7 @@ func (this *UpdateAction) RunPost(params struct {
Require("请输入策略名称")
// 校验拦截选项JSON
- var blockOptions = &firewallconfigs.HTTPFirewallBlockAction{}
+ var blockOptions = firewallconfigs.NewHTTPFirewallBlockAction()
err := json.Unmarshal(params.BlockOptionsJSON, blockOptions)
if err != nil {
this.Fail("拦截动作参数校验失败:" + err.Error())
@@ -144,7 +145,7 @@ func (this *UpdateAction) RunPost(params struct {
}
// 校验显示页面选项JSON
- var pageOptions = &firewallconfigs.HTTPFirewallPageAction{}
+ var pageOptions = firewallconfigs.NewHTTPFirewallPageAction()
err = json.Unmarshal(params.PageOptionsJSON, pageOptions)
if err != nil {
this.Fail("校验显示页面动作配置失败:" + err.Error())
@@ -156,7 +157,7 @@ func (this *UpdateAction) RunPost(params struct {
}
// 校验验证码选项JSON
- var captchaOptions = &firewallconfigs.HTTPFirewallCaptchaAction{}
+ var captchaOptions = firewallconfigs.NewHTTPFirewallCaptchaAction()
err = json.Unmarshal(params.CaptchaOptionsJSON, captchaOptions)
if err != nil {
this.Fail("验证码动作参数校验失败:" + err.Error())
@@ -180,6 +181,16 @@ func (this *UpdateAction) RunPost(params struct {
}
}
+ // 校验JSCookie选项JSON
+ var jsCookieOptions = firewallconfigs.NewHTTPFirewallJavascriptCookieAction()
+ if len(params.JsCookieOptionsJSON) > 0 {
+ err = json.Unmarshal(params.JsCookieOptionsJSON, jsCookieOptions)
+ if err != nil {
+ this.Fail("JSCookie动作参数校验失败:" + err.Error())
+ return
+ }
+ }
+
// 最大内容尺寸
if params.MaxRequestBodySize < 0 {
params.MaxRequestBodySize = 0
@@ -194,6 +205,7 @@ func (this *UpdateAction) RunPost(params struct {
BlockOptionsJSON: params.BlockOptionsJSON,
PageOptionsJSON: params.PageOptionsJSON,
CaptchaOptionsJSON: params.CaptchaOptionsJSON,
+ JsCookieOptionsJSON: params.JsCookieOptionsJSON,
Mode: params.Mode,
UseLocalFirewall: params.UseLocalFirewall,
SynFloodJSON: params.SynFloodJSON,
diff --git a/internal/web/actions/default/servers/server/settings/locations/waf/index.go b/internal/web/actions/default/servers/server/settings/locations/waf/index.go
index d816e7ca..4c40de58 100644
--- a/internal/web/actions/default/servers/server/settings/locations/waf/index.go
+++ b/internal/web/actions/default/servers/server/settings/locations/waf/index.go
@@ -39,7 +39,7 @@ func (this *IndexAction) RunGet(params struct {
}
if firewallPolicy != nil {
// captcha action
- var captchaOptions = firewallconfigs.DefaultHTTPFirewallCaptchaAction()
+ var captchaOptions = firewallconfigs.NewHTTPFirewallCaptchaAction()
if len(firewallPolicy.CaptchaOptionsJSON) > 0 {
err = json.Unmarshal(firewallPolicy.CaptchaOptionsJSON, captchaOptions)
if err != nil {
diff --git a/internal/web/actions/default/servers/server/settings/waf/index.go b/internal/web/actions/default/servers/server/settings/waf/index.go
index 0d710f2a..791285ed 100644
--- a/internal/web/actions/default/servers/server/settings/waf/index.go
+++ b/internal/web/actions/default/servers/server/settings/waf/index.go
@@ -52,7 +52,7 @@ func (this *IndexAction) RunGet(params struct {
}
if firewallPolicy != nil {
// captcha action
- var captchaOptions = firewallconfigs.DefaultHTTPFirewallCaptchaAction()
+ var captchaOptions = firewallconfigs.NewHTTPFirewallCaptchaAction()
if len(firewallPolicy.CaptchaOptionsJSON) > 0 {
err = json.Unmarshal(firewallPolicy.CaptchaOptionsJSON, captchaOptions)
if err != nil {
diff --git a/web/public/js/components/iplist/ip-list-table.js b/web/public/js/components/iplist/ip-list-table.js
index 29a831e5..a1f361ee 100644
--- a/web/public/js/components/iplist/ip-list-table.js
+++ b/web/public/js/components/iplist/ip-list-table.js
@@ -175,8 +175,8 @@ Vue.component("ip-list-table", {
- [服务:{{item.policy.server.name}}]
- [服务:{{item.policy.server.name}}]
+ [网站:{{item.policy.server.name}}]
+ [网站:{{item.policy.server.name}}]
[策略:{{item.policy.name}}]
diff --git a/web/public/js/components/server/http-firewall-block-options-viewer.js b/web/public/js/components/server/http-firewall-block-options-viewer.js
index b128da6a..37b69056 100644
--- a/web/public/js/components/server/http-firewall-block-options-viewer.js
+++ b/web/public/js/components/server/http-firewall-block-options-viewer.js
@@ -9,6 +9,7 @@ Vue.component("http-firewall-block-options-viewer", {
默认设置
如果最大封禁时长大于封禁时长({{timeout}}秒),那么表示每次封禁的时候,将会在这两个时长数字之间随机选取一个数字作为最终的封禁时长。 选中后,表示允许系统尝试全局封禁某个IP,以提升封禁性能。
@@ -55,7 +56,7 @@ Vue.component("http-firewall-block-options", {
提示内容
-
+
@@ -78,6 +79,13 @@ Vue.component("http-firewall-block-options", {
+
+
失败全局封禁
+
+
+
是否在失败时全局封禁,默认为只封禁对单个网站的访问。
+选中后,表示允许系统尝试全局封禁某个IP,以提升封禁性能。
| 有效时间 | +
+
+
+ 秒
+
+ 验证通过后在这个时间内不再验证,默认3600秒。 + |
+
| 最多失败次数 | +
+
+
+ 次
+
+ 建议填入一个不小于5的数字,以减少误判几率。允许用户失败尝试的最多次数,超过这个次数将被自动加入黑名单。如果为空或者为0,表示不限制。 + |
+
| 失败拦截时间 | +
+
+
+ 秒
+
+ 在达到最多失败次数(大于0)时,自动拦截的时长;如果为0表示不自动拦截。 + |
+
| 失败全局封禁 | +
+ 选中后,表示允许系统尝试全局封禁某个IP,以提升封禁性能。 + |
+