diff --git a/plugins/op_waf/index.py b/plugins/op_waf/index.py
index 962488dbe..31de0d03d 100755
--- a/plugins/op_waf/index.py
+++ b/plugins/op_waf/index.py
@@ -371,8 +371,8 @@ def removeIpWhite():
content = public.readFile(path)
content = json.loads(content)
- v = content[int(index)]
- content.remove(v)
+ k = content[int(index)]
+ content.remove(k)
cjson = public.getJson(content)
public.writeFile(path, cjson)
@@ -448,15 +448,9 @@ def saveScanRule():
if not data[0]:
return data[1]
- conf = getRuleJsonPath('scan_black')
- content = public.readFile(conf)
- cobj = json.loads(content)
-
- cobj['retry'] = args
-
- cjson = public.getJson(cobj)
- public.writeFile(conf, cjson)
-
+ path = getRuleJsonPath('scan_black')
+ cjson = public.getJson(args)
+ public.writeFile(path, cjson)
return public.returnJson(True, '设置成功!', [])
@@ -550,6 +544,25 @@ def removeSiteCdnHeader():
public.writeFile(path, cjson)
return public.returnJson(True, '删除成功!')
+def outputData():
+ args = getArgs()
+ data = checkArgs(args, ['s_Name'])
+ if not data[0]:
+ return data[1]
+
+ path = getRuleJsonPath(args['s_Name'])
+ content = public.readFile(path)
+ return public.returnJson(True, 'ok', content)
+
+def importData():
+ args = getArgs()
+ data = checkArgs(args, ['s_Name', 'pdata'])
+ if not data[0]:
+ return data[1]
+
+ path = getRuleJsonPath(args['s_Name'])
+ public.writeFile(path, args['pdata'])
+ return public.returnJson(True, '设置成功!')
def getLogsList():
args = getArgs()
@@ -709,6 +722,10 @@ if __name__ == "__main__":
print getLogsList()
elif func == 'get_safe_logs':
print getSafeLogs()
+ elif func == 'output_data':
+ print outputData()
+ elif func == 'import_data':
+ print importData()
elif func == 'waf_srceen':
print getWafSrceen()
elif func == 'waf_conf':
diff --git a/plugins/op_waf/js/op_waf.js b/plugins/op_waf/js/op_waf.js
index 02b9cb768..9fbf8f729 100755
--- a/plugins/op_waf/js/op_waf.js
+++ b/plugins/op_waf/js/op_waf.js
@@ -496,6 +496,87 @@ function removeIpWhite(index) {
});
}
+
+function funDownload(content, filename) {
+ // 创建隐藏的可下载链接
+ var eleLink = document.createElement('a');
+ eleLink.download = filename;
+ eleLink.style.display = 'none';
+ // 字符内容转变成blob地址
+ var blob = new Blob([content]);
+ eleLink.href = URL.createObjectURL(blob);
+ // 触发点击
+ document.body.appendChild(eleLink);
+ eleLink.click();
+ // 然后移除
+ document.body.removeChild(eleLink);
+}
+
+function outputLayer(rdata, name, type) {
+ window.Load_layer = layer.open({
+ type: 1,
+ title: type ? "导出数据" : "导入数据",
+ area: ['400px', '370px'],
+ shadeClose: false,
+ content: '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
导入格式如下:' +
+ (name == 'ip_white' || name == 'ip_black' ? "[[[127, 0, 0, 1],[127, 0, 0, 255]]]" : "[\"^/test\",\"^/web\"]") +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ (type ? '导出配置 ' : '保存 ') +
+ '
' +
+ '
'
+ });
+ var lead_error = CodeMirror.fromTextArea(document.getElementById("lead_data"), {
+ mode: 'html',
+ matchBrackets: true,
+ matchtags: true,
+ autoMatchParens: true
+ });
+ setTimeout(function () {
+ $('.btn_save').on('click', function () {
+ importData(name, lead_error.getValue());
+ })
+ $('.btn_save_to').on('click', function () {
+ funDownload(lead_error.getValue(), name + '.json');
+ });
+ $('#focus_tips').on('click', function () {
+ $('.placeholder').hide();
+ });
+ }, 100);
+}
+
+
+//导出数据
+function outputData(name, callback) {
+ var loadT = layer.msg('正在导出数据..', { icon: 16, time: 0 });
+
+ owPost('output_data', { s_Name: name } , function(data){
+ var tmp = $.parseJSON(data.data);
+ var rdata = $.parseJSON(tmp.data);
+ if (callback) callback(rdata,res);
+ outputLayer(rdata, name, true);
+ });
+}
+
+//导入数据
+function importData(name, pdata, callback) {
+ owPost('import_data', { s_Name: name, pdata: pdata } , function(data){
+ var rdata = $.parseJSON(data.data);
+ if (callback) callback();
+ layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
+ });
+}
+
+function fileInput(name) {
+ outputLayer('', name, false);
+}
+
//IP白名单
function ipWhite(type) {
if (type == undefined) {
@@ -525,8 +606,8 @@ function ipWhite(type) {
\
\
\
- 导入 \
- 导出 \
+ 导入 \
+ 导出 \
\
\
所有规则对白名单中的IP段无效,包括IP黑名单和URL黑名单,IP白名单具备最高优先权 \
@@ -566,6 +647,136 @@ function ipWhite(type) {
}
+// 获取IPV4黑名单
+function getIpv4Address(callback){
+ getRuleByName('ip_black', function(data){
+ var tmp = $.parseJSON(data.data);
+ var rdata = $.parseJSON(tmp.data);
+ callback(rdata);
+ });
+}
+
+// 获取IPV6黑名单
+function getIpv6Address(callback){
+ getRuleByName('ipv6_black', function(data){
+ var tmp = $.parseJSON(data.data);
+ var rdata = $.parseJSON(tmp.data);
+ callback(rdata);
+ });
+}
+
+
+// 添加ipv6请求
+function AddIpv6Req(ip,callback){
+ owPost('set_ipv6_back', {addr:ip}, function(data){
+ console.log(data);
+ // if(callback) callback(rdata);
+ });
+}
+
+//IP黑名单
+function ipBlack(type) {
+ if (type == undefined) {
+ create_l = layer.open({
+ type: 1,
+ title: "管理IP黑名单",
+ area: ['500px', '500px'],
+ closeBtn: 2,
+ shadeClose: false,
+ content: '\
+ \
+
\
+ \
+ \
+ 添加 \
\
+
\
+
\
+
\
+ \
+ \
+ 超始IP \
+ 结束IP \
+ 操作 \
+ \
+ \
+ \
+
\
+
\
+
\
+ 导入 \
+ 导出 \
+
\
+
\
+
\
+ 黑名单中的IP段将被禁止访问,IP白名单中已存在的除外 \
+ \
+
\
+ \
+
\
+ \
+ 添加 \
+
\
+
\
+
\
+ 黑名单中的IP段将被禁止访问,IP白名单中已存在的除外 \
+ \
+
',
+ success:function(index,layero){
+ $('.tab_list .tab_block').click(function(){
+ $(this).addClass('active').siblings().removeClass('active');
+ if($(this).index() === 0){
+ $('.ipv4_block').show().next().hide();
+ getIpv4Address(function(rdata){
+ var tbody = ''
+ for (var i = 0; i < rdata.length; i++) {
+ tbody += '\
+ '+ rdata[i][0].join('.') + ' \
+ '+ rdata[i][1].join('.') + ' \
+ 删除 \
+ '
+ }
+ $("#ip_black_con").html(tbody);
+ });
+ }else{
+ $('.ipv4_block').hide().next().show();
+ getIpv6Address(function(res){
+ // console.log(res);
+ var tbody = '',rdata = res;
+ for (var i = 0; i < rdata.length; i++) {
+ tbody += '\
+ '+ rdata[i] + ' \
+ 删除 \
+ '
+ }
+ $("#ipv6_black_con").html(tbody);
+ });
+ }
+ });
+ $('.btn_add_ipv6').click(function(){
+ var ipv6 = $('[name="ipv6_address"]').val();
+ add_ipv6_req(ipv6,function(res){
+ layer.close(loadT);
+ layer.msg(res.msg,{icon:res.status?1:2});
+ if(res.status){
+ $('[name="ipv6_address"]').val('');
+ $('.tab_list .tab_block:eq(1)').click();
+ }
+ });
+ });
+ $('.tab_list .tab_block:eq(0)').click();
+ }
+ });
+ tableFixed("ipBlack");
+ }
+}
+
function wafScreen(){
owPost('waf_srceen', {}, function(data){
@@ -1162,7 +1373,6 @@ function siteWafConfig(siteName, type) {
owPost('get_site_config_byname', { siteName: siteName }, function(data){
var tmp = $.parseJSON(data.data);
var rdata = tmp.data;
- console.log(rdata);
nginx_config = rdata;
var con = '\
\
diff --git a/plugins/op_waf/waf/rule/ipv6_black.json b/plugins/op_waf/waf/rule/ipv6_black.json
new file mode 100755
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/op_waf/waf/rule/ipv6_black.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file