import os,json,csv,copy
from riskAssessment import M_riskAssessment as M_RA
def getLevel(risk):
srisk=M_RA.getSetting()['srisk']
for index, value in enumerate(srisk[1:5]):
if risk<value:
return index+1
return len(srisk)-1
def metricsResult(edgeList):
series=[]
edges=[]
namelist=['路径总体数量','最短路径长度','路径长度均值','与起点间距离']
inputPath='../pack_v3.1/input/input.json'
resultPath='../pack_v3.1/result/e1_metrics.json'
for edge in edgeList:
edges.append('E'+edge[2:])
with open(inputPath, 'r') as f:
Topo = json.load(f)
f.close()
Topo['delete_edges'][0]=edges
with open(inputPath, 'w') as f:
json.dump(Topo, f)
f.close()
# print("######################")
p=os.system('python3 ../pack_v3.1/main_m.py')
# print(p)
if p==0:
with open(resultPath, 'r') as f:
metrics = json.load(f)
f.close()
flag=len(metrics)-1
for item in range(len(metrics)):
if metrics[item][0]==0:
flag=item
# print(flag)
break
for i in range(len(namelist)):
temp=[]
for m in range(flag+1):
temp.append(metrics[m][i])
series.append({'name':namelist[i],
'type': 'line',
'stack': 'Total',
'areaStyle': {},
'emphasis': {
'focus': 'series'
},
'data':temp
})
return series,edgeList[:flag]
else:
return 0
def rissEdges():
inputPath='../pack_v3.1/input/input.json'
result=[]
with open(inputPath, 'r') as f:
Topo = json.load(f)
f.close()
edges=Topo['edges']
for i in range(len(edges)-1):
result.append('攻击'+str(i+2))
return result
def getAssetsList():
assets=M_RA.getAssets()
assetsList=[]
for value in assets:
assetsList.append({'value':value['host'],'label':value['host']})
return assetsList
def getAssetsData(value,scene):
assetsChartData={}
assetsData={}
vulData={}
criterionData={}
children=[]
colorList=[]
color={
'高':100,
'中':66,
'低':33,
'3.9':100,
'0.8':20,
'2.8':80,
'2.3':70
}
assets=M_RA.getAssets()
vulnerability=M_RA.getVulnerability()
for asset in assets:
if value==asset['host']:
for i in asset['children']:
for j in assets:
if i==j['host']:
children+=[{'name':i,'image':j['image']}]
assetsChartData.update({'name': '攻击者','image':'pc.png','children':[{'name':value+"\n"+asset['ip'],'image':asset['image'],'edgeName':asset['edge'],'children':children}]})
assetsData.update({'name':asset['name'],'level':asset['level'],'manufacturer':asset['manufacturer'],'ip':asset['ip']})
for vul in vulnerability:
if vul['name']==asset['vul']:
vulData.update({'name':vul['name'],'type':vul['type'],'cvss':vul['cvss'],'ip':vul['ip']})
criterionData.update({'es':vul['es'],'a':vul['a'],'i':vul['i'],'c':vul['c'],})
colorList+=[color[vul['es']],color[vul['a']],color[vul['i']],color[vul['c']]]
break
# print(assetsChartData)
# print(vulData)
return assetsChartData,assetsData,vulData,criterionData,colorList
def getRiskResult():
data=[['product', '初始风险', '残余风险']]
rrisk=M_RA.getRrisk()
edges=[]
for item in rrisk[-6:]:
data.append([item['time'],item['srisk'],item['rrisk'],item['rrisk_num']])
temp=[]
for i in item['edges']:
temp.append(i[1:])
edges.append(temp)
return data,edges
def updataRisk(edge):
inputPath='../pack_v3.1/input/input.json'
resultPath='../pack_v3.1/result/rrisk.json'
rrisk=M_RA.getRrisk()
setting=M_RA.getSetting()
setRrisk=setting['rrisk']
if rrisk[-1]['rrisk']<=setRrisk:
with open(inputPath, 'r') as f:
Topo = json.load(f)
f.close()
Topo['delete_edges'][0]=['E'+edge[2:]]
with open(inputPath, 'w') as f:
json.dump(Topo, f)
f.close()
srisk=5
else:
edges=copy.deepcopy(rrisk[-1]['edges'])
edges.append('E'+edge[2:])
with open(inputPath, 'r') as f:
Topo = json.load(f)
f.close()
Topo['delete_edges'][0]=edges
with open(inputPath, 'w') as f:
json.dump(Topo, f)
f.close()
srisk=rrisk[-1]['rrisk']
p=os.system('python3 ../pack_v3.1/main_r.py')
if p==0:
with open(resultPath, 'r') as f:
result = json.load(f)
f.close()
# print("*************")
# print(result)
n_rrisk=result['result']
n_rrisk.update({'rrisk_num':copy.deepcopy(n_rrisk['rrisk'])})
n_rrisk['rrisk']=getLevel(copy.deepcopy(n_rrisk['rrisk']))
n_rrisk.update({'srisk':srisk})
rrisk.append(n_rrisk)
# print("*************")
# print(n_rrisk)
M_RA.updataRisk(rrisk)
def getEdgesRisk(length):
file_list=['impact', 'likehood', 'each_risk', 'depend_risk']
data_list=[]
for measure in file_list:
path="./uploads/"+measure+".csv"
with open(path, 'r') as f:
data = list(csv.reader(f))
f.close()
temp_list=[]
if measure=='depend_risk':
temp_list=[0]*length
for row in data[1:]:
# print(row[1])
if row[1]!='E1':
# print(row[1])
temp_list[int(row[1][1:])-2]+=float(row[-1])
# print(int(row[1][1:])-2)
else:
for row in data[1:]:
temp_list.append(float(row[-1]))
max_val = max(temp_list)
min_val = min(temp_list)
avg_val = sum(temp_list) / len(temp_list)
partition=[min_val + (avg_val - min_val) / 2,avg_val + (max_val - avg_val) / 2]
count_partition1 = 0
count_partition2 = 0
count_partition3 = 0
for value in temp_list:
if value<partition[0]:
count_partition1+=1
elif value<partition[1]:
count_partition2+=1
else:
count_partition3+=1
result=[count_partition3,count_partition2,count_partition1]
data_list.append(result)
# print(data_list)
transpose = list(map(list, zip(*data_list)))
return transpose
def getSysRisk():
rrisk=M_RA.getRrisk()
setting=M_RA.getSetting()
risk=rrisk[-1]['rrisk_num']
if risk<setting['sysrisk'][1]:
return [{'value':0.1,'name':'低危'}]
elif risk<setting['sysrisk'][2]:
return [{'value':0.33,'name':'中危'}]
return [{'value':0.66,'name':'高危'}]
def updataSetting(smin,smax):
m_setting=M_RA.getSetting()
imun=smax-smin
m_setting['sysrisk']=[smin,smin+imun/3,smax-imun/3,smax]
m_setting['srisk']=[smin,smin+imun/5,smin+2*imun/5,smax-2*imun/5,smax-imun/5,smax]
M_RA.updataSetting(m_setting)
def getLEdge():
rrisk=M_RA.getRrisk()
inputPath='../pack_v3.1/input/input.json'
result=[]
with open(inputPath, 'r') as f:
Topo = json.load(f)
f.close()
edges=Topo['edges']
Dedges=rrisk[-1]['edges']
for e in edges[1:]:
if e['edge_name'] in Dedges:
continue
result.append('攻击'+e['edge_name'][1:])
return result
def getRankData():
# 从数据库获取排序数据
rankA = M_RA.getRankA()
# print(rankA)
# 如果没有数据,返回默认值
if not rankA:
return {
"attackTypes": [0,0,0,0,0,0,0,0,0,0],
"rankResult": [],
"methods": []
}
# 构建返回数据
attackTypes = rankA.get("attack_types", [])
rankResult = rankA.get("rank_results", [])
# 提取所有排序方法名称
methods = []
for item in rankResult:
if "name" in item and item["name"] not in methods:
methods.append(item["name"])
print( {
"attackTypes": attackTypes,
"rankResult": rankResult,
"methods": methods
})
return {
"attackTypes": attackTypes,
"rankResult": rankResult,
"methods": methods
}这是总体后端框架代码,我需要理清楚各个模块的功能以及从哪里获取数据,生成了哪些文件,又输出到哪里,不应修改优化代码,仅仅分析代码流程,帮我理清输入输出
最新发布