diff --git a/plugins/op_waf/index.py b/plugins/op_waf/index.py index ccc182050..9dafdf829 100755 --- a/plugins/op_waf/index.py +++ b/plugins/op_waf/index.py @@ -118,6 +118,7 @@ def initSiteInfo(): cjson = public.getJson(site_contents_new) public.writeFile(path_site, cjson) + def initTotalInfo(): data = [] path_domains = getJsonPath('domains') @@ -135,7 +136,7 @@ def initTotalInfo(): total_contents_new = {} for x in range(len(domain_contents)): name = domain_contents[x]['name'] - if 'sites' in total_contents and name in total_contents['sites']: + if 'sites' in total_contents and name in total_contents['sites']: pass else: tmp = {} @@ -339,18 +340,18 @@ def getSiteConfig(): total_content = json.loads(total_content) # print total_content - + for x in content: tmp = [] tmp_v = {} if 'sites' in total_content and x in total_content['sites']: - tmp_v = total_content['sites'][x]; - - key_list = ['get','post','user-agent','cookie','cdn','cc'] + tmp_v = total_content['sites'][x] + + key_list = ['get', 'post', 'user-agent', 'cookie', 'cdn', 'cc'] for kx in range(len(key_list)): ktmp = {} - if kx in tmp_v : + if kx in tmp_v: ktmp['value'] = tmp_v[key_list[kx]] else: ktmp['value'] = '' @@ -360,10 +361,54 @@ def getSiteConfig(): # print tmp content[x]['total'] = tmp - content = public.getJson(content) return public.returnJson(True, 'ok!', content) + +def getLogsList(): + args = getArgs() + data = checkArgs(args, ['siteName']) + if not data[0]: + return data[1] + + data = [] + path = public.getLogsDir() + '/waf' + files = os.listdir(path) + for f in files: + if f == '.DS_Store': + continue + f = f.split('_') + if f[0] == args['siteName']: + fl = f[1].split('.') + data.append(fl[0]) + + return public.returnJson(True, 'ok!', data) + + +def getSafeLogs(): + args = getArgs() + data = checkArgs(args, ['siteName', 'toDate', 'p']) + if not data[0]: + return data[1] + + path = public.getLogsDir() + '/waf' + file = path + '/' + args['siteName'] + '_' + args['toDate'] + '.log' + if not os.path.exists(file): + return public.returnJson(False, "文件不存在!") + + retData = [] + file = open(file) + while 1: + lines = file.readlines(100000) + if not lines: + break + for line in lines: + + retData.append(json.loads(line)) + + return public.returnJson(True, '设置成功!', retData) + + def setObjOpen(): args = getArgs() data = checkArgs(args, ['obj']) @@ -427,6 +472,10 @@ if __name__ == "__main__": print saveScanRule() elif func == 'get_site_config': print getSiteConfig() + elif func == 'get_logs_list': + print getLogsList() + elif func == 'get_safe_logs': + print getSafeLogs() 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 eae323f1e..d9e96681c 100755 --- a/plugins/op_waf/js/op_waf.js +++ b/plugins/op_waf/js/op_waf.js @@ -865,6 +865,357 @@ function back_css(v) { } } +//查看网站日志 +function siteWafLog(siteName) { + var loadT = layer.msg('正在处理,请稍候..', { icon: 16, time: 0 }); + owPost('get_logs_list', { siteName: siteName } , function (data) { + var tmp = $.parseJSON(data.data); + var rdata = tmp.data; + var selectLogDay = ""; + var day = rdata[0]; + for (var i = 0; i < rdata.length; i++) { + selectLogDay += ''; + } + if (rdata == "") { + layer.msg("暂无日志记录", { icon: 6, shade: 0.3, time: 1000 }); + return + } + layer.open({ + type: 1, + title: "日志【" + siteName + "】", + area: ['880px', '500px'], + closeBtn: 2, + shadeClose: false, + content: '
时间 | 用户IP | 类型 | URI地址 | User-Agent | 状态 | 过滤器 | 过滤规则 | 操作 |
---|
时间 | '+ escapeHTML(time) + ' | 用户IP | ' + escapeHTML(ip_address) + ' |
---|---|---|---|
类型 | ' + escapeHTML(req_type) + ' | 过滤器 | ' + escapeHTML(filters) + ' |
名称 | \ +描述 | \ +状态 | \ +操作 | \ +
---|---|---|---|
CC防御 | \ +'+ rdata.cc.cycle + ' 秒内,请求同一URI累计超过 ' + rdata.cc.limit + ' 次,封锁IP ' + rdata.cc.endtime + ' 秒 | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 设置 | \ +
恶意容忍设置 | \ +'+ rdata.retry_cycle + ' 秒内,累计超过 ' + rdata.retry + ' 次恶意请求,封锁IP ' + rdata.retry_time + ' 秒 | \ +-- | \ +设置 | \ +
GET-URI过滤 | \ +'+ rdata.top.get.ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 规则 | \ +
GET-参数过滤 | \ +'+ rdata.top.get.ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 规则 | \ +
POST过滤 | \ +'+ rdata.top.post.ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 规则 | \ +
User-Agent过滤 | \ +'+ rdata.top['user-agent'].ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 规则 | \ +
Cookie过滤 | \ +'+ rdata.top.cookie.ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 规则 | \ +
禁止国外访问 | \ +'+ rdata.top.drop_abroad.ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 设置 | \ +
常见扫描器 | '+ rdata.top.scan.ps + ' | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 设置 | \ +
使用CDN | \ +该站点使用了CDN,启用后方可正确获取客户IP | \ +\
+ \
+ \
+ \
+ \
+ | \
+ 设置 | \ +
禁止执行PHP的URL | \ +禁止在指定URL运行PHP脚本 | \ +-- | \ +设置 | \ +
禁止访问的URL | \ +禁止访问指定的URL | \ +-- | \ +设置 | \ +
禁止扩展名 | \ +禁止访问指定扩展名 | \ +-- | \ +设置 | \ +
禁止上传的文件类型 | \ +禁止上传指定的文件类型 | \ +-- | \ +设置 | \ +
受保护的URL | \ +通过自定义参数加密URL地址,参数错误将被拦截 | \ +-- | \ +设置 | \ +
URL专用过滤 | \ +为特定URL地址设置过滤规则 | \ +-- | \ +设置 | \ +
敏感文字替换 | \ +替换设置的敏感文字 | \ +-- | \ +设置 | \ +
CMS专用过滤 | \ +为特定CMS提供的过滤规则 | \ +-- | \ +设置 | \ +