mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-04 05:00:25 +08:00
WAF添加规则:调整界面/增加正则表达式测试功能
This commit is contained in:
@@ -41,6 +41,7 @@ func init() {
|
|||||||
GetPost("/updateSetPopup", new(UpdateSetPopupAction)).
|
GetPost("/updateSetPopup", new(UpdateSetPopupAction)).
|
||||||
Post("/count", new(CountAction)).
|
Post("/count", new(CountAction)).
|
||||||
Get("/selectPopup", new(SelectPopupAction)).
|
Get("/selectPopup", new(SelectPopupAction)).
|
||||||
|
Post("/testRegexp", new(TestRegexpAction)).
|
||||||
|
|
||||||
// IP管理
|
// IP管理
|
||||||
GetPost("/ipadmin", new(ipadmin.IndexAction)).
|
GetPost("/ipadmin", new(ipadmin.IndexAction)).
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package waf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestRegexpAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *TestRegexpAction) RunPost(params struct {
|
||||||
|
Regexp string
|
||||||
|
IsCaseInsensitive bool
|
||||||
|
Body string
|
||||||
|
}) {
|
||||||
|
var exp = params.Regexp
|
||||||
|
if params.IsCaseInsensitive && !strings.HasPrefix(params.Regexp, "(?i)") {
|
||||||
|
exp = "(?i)" + exp
|
||||||
|
}
|
||||||
|
reg, err := regexp.Compile(exp)
|
||||||
|
if err != nil {
|
||||||
|
this.Data["result"] = maps.Map{
|
||||||
|
"isOk": false,
|
||||||
|
"message": "解析正则出错:" + err.Error(),
|
||||||
|
}
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
|
|
||||||
|
if reg.MatchString(params.Body) {
|
||||||
|
this.Data["result"] = maps.Map{
|
||||||
|
"isOk": true,
|
||||||
|
"message": "匹配成功",
|
||||||
|
}
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["result"] = maps.Map{
|
||||||
|
"isOk": false,
|
||||||
|
"message": "匹配失败",
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<input type="hidden" name="optionsJSON" v-if="checkpoint != null && checkpoint.options != null" :value="JSON.stringify(checkpoint.options)"/>
|
<input type="hidden" name="optionsJSON" v-if="checkpoint != null && checkpoint.options != null" :value="JSON.stringify(checkpoint.options)"/>
|
||||||
<table class="ui table definition selectable">
|
<table class="ui table definition selectable">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="title">参数</td>
|
<td class="title">参数 *</td>
|
||||||
<td>
|
<td>
|
||||||
<select name="prefix" class="ui dropdown auto-width" @change="changeCheckpoint()" v-model="rule.checkpointPrefix">
|
<select name="prefix" class="ui dropdown auto-width" @change="changeCheckpoint()" v-model="rule.checkpointPrefix">
|
||||||
<option value="">[选择参数]</option>
|
<option value="">[选择参数]</option>
|
||||||
@@ -51,14 +51,6 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
||||||
<!-- 参数过滤器 -->
|
|
||||||
<tr v-if="checkpoint != null && !checkpoint.isComposed">
|
|
||||||
<td>编解码</td>
|
|
||||||
<td>
|
|
||||||
<http-firewall-param-filters-box :v-filters="rule.paramFilters"></http-firewall-param-filters-box>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- 选项 -->
|
<!-- 选项 -->
|
||||||
<tbody v-if="checkpoint != null && !checkpoint.isComposed && checkpoint.options != null && checkpoint.options.length > 0">
|
<tbody v-if="checkpoint != null && !checkpoint.isComposed && checkpoint.options != null && checkpoint.options.length > 0">
|
||||||
<tr v-for="option in checkpoint.options">
|
<tr v-for="option in checkpoint.options">
|
||||||
@@ -89,7 +81,7 @@
|
|||||||
|
|
||||||
<tbody v-show="checkpoint != null && !checkpoint.isComposed">
|
<tbody v-show="checkpoint != null && !checkpoint.isComposed">
|
||||||
<tr>
|
<tr>
|
||||||
<td>操作符</td>
|
<td>操作符 *</td>
|
||||||
<td>
|
<td>
|
||||||
<select class="ui dropdown" name="operator" style="width:10em" v-model="rule.operator" @change="changeOperator()">
|
<select class="ui dropdown" name="operator" style="width:10em" v-model="rule.operator" @change="changeOperator()">
|
||||||
<option v-for="op in operators" :value="op.code">{{op.name}}</option>
|
<option v-for="op in operators" :value="op.code">{{op.name}}</option>
|
||||||
@@ -97,18 +89,11 @@
|
|||||||
<p class="comment" v-if="operator != null" v-html="operator.description"></p>
|
<p class="comment" v-if="operator != null" v-html="operator.description"></p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-if="operator.case != 'none'">
|
|
||||||
<td>开启大小写不敏感</td>
|
|
||||||
<td>
|
|
||||||
<div class="ui checkbox">
|
|
||||||
<input name="case" type="checkbox" value="1" v-model="rule.isCaseInsensitive"/>
|
|
||||||
<label></label>
|
|
||||||
</div>
|
|
||||||
<p class="comment">开启后忽略英文字母大小写</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>对比值</td>
|
<td>
|
||||||
|
<span v-if="rule.operator == 'match' || rule.operator == 'not match'">正则表达式</span>
|
||||||
|
<span v-else>对比值</span>
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<!-- 二进制数据 -->
|
<!-- 二进制数据 -->
|
||||||
<div v-if="rule.operator == 'contains binary'">
|
<div v-if="rule.operator == 'contains binary'">
|
||||||
@@ -121,9 +106,41 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 其余数据 -->
|
<!-- 其余数据 -->
|
||||||
<textarea rows="3" maxlength="4096" name="value" v-model="rule.value" v-else></textarea>
|
<textarea rows="3" maxlength="4096" name="value" v-model="rule.value" @input="changeRuleValue" v-else></textarea>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr v-if="rule.operator == 'match' || rule.operator == 'not match'">
|
||||||
|
<td>正则表达式测试</td>
|
||||||
|
<td>
|
||||||
|
<a href="" v-if="!regexpTestIsOn" @click.prevent="changeRegexpTestIsOn">[输入测试字符串]</a>
|
||||||
|
<div v-if="regexpTestIsOn">
|
||||||
|
<textarea placeholder="输入要测试的内容" rows="3" v-model="regexpTestBody" ref="regexpTestBody" @input="changeRegexpTestBody"></textarea>
|
||||||
|
<p class="comment">
|
||||||
|
<span v-if="regexpTestResult.isOk" class="green">{{regexpTestResult.message}}</span>
|
||||||
|
<span v-if="!regexpTestResult.isOk" class="red">{{regexpTestResult.message}}</span>
|
||||||
|
|
||||||
|
<a href="" @click.prevent="changeRegexpTestIsOn">[结束测试]</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr v-if="operator.case != 'none'">
|
||||||
|
<td>不区分大小写</td>
|
||||||
|
<td>
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<input name="case" type="checkbox" value="1" v-model="rule.isCaseInsensitive" @change="changeCaseInsensitive"/>
|
||||||
|
<label></label>
|
||||||
|
</div>
|
||||||
|
<p class="comment">开启后忽略英文字母大小写</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- 参数过滤器 -->
|
||||||
|
<tr v-if="checkpoint != null && !checkpoint.isComposed">
|
||||||
|
<td>编解码</td>
|
||||||
|
<td>
|
||||||
|
<http-firewall-param-filters-box :v-filters="rule.paramFilters"></http-firewall-param-filters-box>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -68,4 +68,57 @@ Tea.context(function () {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.changeOperator()
|
this.changeOperator()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* caseInsensitive
|
||||||
|
*/
|
||||||
|
this.changeCaseInsensitive = function () {
|
||||||
|
if (this.rule.operator == "match" || this.rule.operator == "not match") {
|
||||||
|
if (this.regexpTestIsOn) {
|
||||||
|
this.changeRegexpTestBody()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* value
|
||||||
|
*/
|
||||||
|
this.changeRuleValue = function () {
|
||||||
|
if (this.rule.operator == "match" || this.rule.operator == "not match") {
|
||||||
|
if (this.regexpTestIsOn) {
|
||||||
|
this.changeRegexpTestBody()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.regexpTestIsOn = false
|
||||||
|
this.regexpTestResult = {isOk: false, message: ""}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 正则测试
|
||||||
|
*/
|
||||||
|
this.regexpTestIsOn = false
|
||||||
|
this.regexpTestBody = ""
|
||||||
|
this.regexpTestResult = {isOk: false, message: ""}
|
||||||
|
|
||||||
|
this.changeRegexpTestIsOn = function () {
|
||||||
|
this.regexpTestIsOn = !this.regexpTestIsOn
|
||||||
|
if (this.regexpTestIsOn) {
|
||||||
|
this.$delay(function () {
|
||||||
|
this.$refs.regexpTestBody.focus()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.changeRegexpTestBody = function () {
|
||||||
|
this.$post(".testRegexp")
|
||||||
|
.params({
|
||||||
|
"regexp": this.rule.value,
|
||||||
|
"body": this.regexpTestBody,
|
||||||
|
"isCaseInsensitive": this.rule.isCaseInsensitive
|
||||||
|
})
|
||||||
|
.success(function (resp) {
|
||||||
|
this.regexpTestResult = resp.data.result
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
Reference in New Issue
Block a user