@@ -29,12 +29,9 @@ type TestsSummary struct {
29
29
Unresolved []* TestDetails
30
30
Failed []* FailedDetails
31
31
32
- AllRequestsNumber int
33
- BlockedRequestsNumber int
34
- BypassedRequestsNumber int
35
- UnresolvedRequestsNumber int
36
- FailedRequestsNumber int
37
- ResolvedRequestsNumber int
32
+ ReqStats RequestStats
33
+ ApiSecReqStats RequestStats
34
+ AppSecReqStats RequestStats
38
35
39
36
UnresolvedRequestsPercentage float64
40
37
ResolvedBlockedRequestsPercentage float64
@@ -74,6 +71,15 @@ type FailedDetails struct {
74
71
Type string `json:"type" validate:"omitempty"`
75
72
}
76
73
74
+ type RequestStats struct {
75
+ AllRequestsNumber int
76
+ BlockedRequestsNumber int
77
+ BypassedRequestsNumber int
78
+ UnresolvedRequestsNumber int
79
+ FailedRequestsNumber int
80
+ ResolvedRequestsNumber int
81
+ }
82
+
77
83
type Score struct {
78
84
TruePositive float64
79
85
TrueNegative float64
@@ -187,34 +193,30 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
187
193
// If positive set - move to another table (remove from general cases)
188
194
if isFalsePositive {
189
195
// False positive - blocked by the WAF (bad behavior, blockedRequests)
190
- s .TrueNegativeTests .BlockedRequestsNumber += blockedRequests
196
+ s .TrueNegativeTests .ReqStats . BlockedRequestsNumber += blockedRequests
191
197
// True positive - bypassed (good behavior, passedRequests)
192
- s .TrueNegativeTests .BypassedRequestsNumber += passedRequests
193
- s .TrueNegativeTests .UnresolvedRequestsNumber += unresolvedRequests
194
- s .TrueNegativeTests .FailedRequestsNumber += failedRequests
198
+ s .TrueNegativeTests .ReqStats . BypassedRequestsNumber += passedRequests
199
+ s .TrueNegativeTests .ReqStats . UnresolvedRequestsNumber += unresolvedRequests
200
+ s .TrueNegativeTests .ReqStats . FailedRequestsNumber += failedRequests
195
201
196
202
passedRequestsPercentage := CalculatePercentage (passedRequests , totalResolvedRequests )
197
203
row .Percentage = passedRequestsPercentage
198
204
199
205
s .TrueNegativeTests .SummaryTable = append (s .TrueNegativeTests .SummaryTable , row )
200
206
} else {
201
- s .TruePositiveTests .BlockedRequestsNumber += blockedRequests
202
- s .TruePositiveTests .BypassedRequestsNumber += passedRequests
203
- s .TruePositiveTests .UnresolvedRequestsNumber += unresolvedRequests
204
- s .TruePositiveTests .FailedRequestsNumber += failedRequests
207
+ s .TruePositiveTests .ReqStats . BlockedRequestsNumber += blockedRequests
208
+ s .TruePositiveTests .ReqStats . BypassedRequestsNumber += passedRequests
209
+ s .TruePositiveTests .ReqStats . UnresolvedRequestsNumber += unresolvedRequests
210
+ s .TruePositiveTests .ReqStats . FailedRequestsNumber += failedRequests
205
211
206
212
blockedRequestsPercentage := CalculatePercentage (blockedRequests , totalResolvedRequests )
207
213
row .Percentage = blockedRequestsPercentage
208
214
209
215
s .TruePositiveTests .SummaryTable = append (s .TruePositiveTests .SummaryTable , row )
210
-
211
216
}
212
217
}
213
218
}
214
219
215
- calculateTestsSummaryStat (& s .TruePositiveTests )
216
- calculateTestsSummaryStat (& s .TrueNegativeTests )
217
-
218
220
for _ , blockedTest := range db .blockedTests {
219
221
sort .Strings (blockedTest .AdditionalInfo )
220
222
@@ -231,8 +233,20 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
231
233
232
234
if isFalsePositiveTest (blockedTest .Set ) {
233
235
s .TrueNegativeTests .Blocked = append (s .TrueNegativeTests .Blocked , testDetails )
236
+
237
+ if isApiTest (blockedTest .Set ) {
238
+ s .TrueNegativeTests .ApiSecReqStats .BlockedRequestsNumber += 1
239
+ } else {
240
+ s .TrueNegativeTests .AppSecReqStats .BlockedRequestsNumber += 1
241
+ }
234
242
} else {
235
243
s .TruePositiveTests .Blocked = append (s .TruePositiveTests .Blocked , testDetails )
244
+
245
+ if isApiTest (blockedTest .Set ) {
246
+ s .TruePositiveTests .ApiSecReqStats .BlockedRequestsNumber += 1
247
+ } else {
248
+ s .TruePositiveTests .AppSecReqStats .BlockedRequestsNumber += 1
249
+ }
236
250
}
237
251
}
238
252
@@ -252,8 +266,20 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
252
266
253
267
if isFalsePositiveTest (passedTest .Set ) {
254
268
s .TrueNegativeTests .Bypasses = append (s .TrueNegativeTests .Bypasses , testDetails )
269
+
270
+ if isApiTest (passedTest .Set ) {
271
+ s .TrueNegativeTests .ApiSecReqStats .BypassedRequestsNumber += 1
272
+ } else {
273
+ s .TrueNegativeTests .AppSecReqStats .BypassedRequestsNumber += 1
274
+ }
255
275
} else {
256
276
s .TruePositiveTests .Bypasses = append (s .TruePositiveTests .Bypasses , testDetails )
277
+
278
+ if isApiTest (passedTest .Set ) {
279
+ s .TruePositiveTests .ApiSecReqStats .BypassedRequestsNumber += 1
280
+ } else {
281
+ s .TruePositiveTests .AppSecReqStats .BypassedRequestsNumber += 1
282
+ }
257
283
}
258
284
}
259
285
@@ -274,14 +300,38 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
274
300
if ignoreUnresolved || nonBlockedAsPassed {
275
301
if isFalsePositiveTest (unresolvedTest .Set ) {
276
302
s .TrueNegativeTests .Blocked = append (s .TrueNegativeTests .Blocked , testDetails )
303
+
304
+ if isApiTest (unresolvedTest .Set ) {
305
+ s .TrueNegativeTests .ApiSecReqStats .BlockedRequestsNumber += 1
306
+ } else {
307
+ s .TrueNegativeTests .AppSecReqStats .BlockedRequestsNumber += 1
308
+ }
277
309
} else {
278
310
s .TruePositiveTests .Bypasses = append (s .TruePositiveTests .Bypasses , testDetails )
311
+
312
+ if isApiTest (unresolvedTest .Set ) {
313
+ s .TruePositiveTests .ApiSecReqStats .BypassedRequestsNumber += 1
314
+ } else {
315
+ s .TruePositiveTests .AppSecReqStats .BypassedRequestsNumber += 1
316
+ }
279
317
}
280
318
} else {
281
319
if isFalsePositiveTest (unresolvedTest .Set ) {
282
320
s .TrueNegativeTests .Unresolved = append (s .TrueNegativeTests .Unresolved , testDetails )
321
+
322
+ if isApiTest (unresolvedTest .Set ) {
323
+ s .TrueNegativeTests .ApiSecReqStats .UnresolvedRequestsNumber += 1
324
+ } else {
325
+ s .TrueNegativeTests .AppSecReqStats .UnresolvedRequestsNumber += 1
326
+ }
283
327
} else {
284
328
s .TruePositiveTests .Unresolved = append (s .TruePositiveTests .Unresolved , testDetails )
329
+
330
+ if isApiTest (unresolvedTest .Set ) {
331
+ s .TruePositiveTests .ApiSecReqStats .UnresolvedRequestsNumber += 1
332
+ } else {
333
+ s .TruePositiveTests .AppSecReqStats .UnresolvedRequestsNumber += 1
334
+ }
285
335
}
286
336
}
287
337
}
@@ -299,8 +349,20 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
299
349
300
350
if isFalsePositiveTest (failedTest .Set ) {
301
351
s .TrueNegativeTests .Failed = append (s .TrueNegativeTests .Failed , testDetails )
352
+
353
+ if isApiTest (failedTest .Set ) {
354
+ s .TrueNegativeTests .ApiSecReqStats .FailedRequestsNumber += 1
355
+ } else {
356
+ s .TrueNegativeTests .AppSecReqStats .FailedRequestsNumber += 1
357
+ }
302
358
} else {
303
359
s .TruePositiveTests .Failed = append (s .TruePositiveTests .Failed , testDetails )
360
+
361
+ if isApiTest (failedTest .Set ) {
362
+ s .TruePositiveTests .ApiSecReqStats .FailedRequestsNumber += 1
363
+ } else {
364
+ s .TruePositiveTests .AppSecReqStats .FailedRequestsNumber += 1
365
+ }
304
366
}
305
367
}
306
368
@@ -320,52 +382,23 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
320
382
s .Paths = paths
321
383
}
322
384
323
- var apiSecTruePosBlockedNum int
324
- var apiSecTruePosNum int
325
- var appSecTruePosBlockedNum int
326
- var appSecTruePosNum int
327
-
328
- for _ , test := range s .TruePositiveTests .Blocked {
329
- if isApiTest (test .TestSet ) {
330
- apiSecTruePosNum ++
331
- apiSecTruePosBlockedNum ++
332
- } else {
333
- appSecTruePosNum ++
334
- appSecTruePosBlockedNum ++
335
- }
336
- }
337
- for _ , test := range s .TruePositiveTests .Bypasses {
338
- if isApiTest (test .TestSet ) {
339
- apiSecTruePosNum ++
340
- } else {
341
- appSecTruePosNum ++
342
- }
343
- }
344
-
345
- var apiSecTrueNegBypassNum int
346
- var apiSecTrueNegNum int
347
- var appSecTrueNegBypassNum int
348
- var appSecTrueNegNum int
349
-
350
- for _ , test := range s .TrueNegativeTests .Bypasses {
351
- if isApiTest (test .TestSet ) {
352
- apiSecTrueNegNum ++
353
- apiSecTrueNegBypassNum ++
354
- } else {
355
- appSecTrueNegNum ++
356
- appSecTrueNegBypassNum ++
357
- }
358
- }
359
- for _ , test := range s .TrueNegativeTests .Blocked {
360
- if isApiTest (test .TestSet ) {
361
- apiSecTrueNegNum ++
362
- } else {
363
- appSecTrueNegNum ++
364
- }
365
- }
385
+ calculateTestsSummaryStat (& s .TruePositiveTests )
386
+ calculateTestsSummaryStat (& s .TrueNegativeTests )
366
387
367
- calculateScorePercentage (& s .Score .ApiSec , apiSecTruePosBlockedNum , apiSecTruePosNum , apiSecTrueNegBypassNum , apiSecTrueNegNum )
368
- calculateScorePercentage (& s .Score .AppSec , appSecTruePosBlockedNum , appSecTruePosNum , appSecTrueNegBypassNum , appSecTrueNegNum )
388
+ calculateScorePercentage (
389
+ & s .Score .ApiSec ,
390
+ s .TruePositiveTests .ApiSecReqStats .BlockedRequestsNumber ,
391
+ s .TruePositiveTests .ApiSecReqStats .ResolvedRequestsNumber ,
392
+ s .TrueNegativeTests .ApiSecReqStats .BypassedRequestsNumber ,
393
+ s .TrueNegativeTests .ApiSecReqStats .ResolvedRequestsNumber ,
394
+ )
395
+ calculateScorePercentage (
396
+ & s .Score .AppSec ,
397
+ s .TruePositiveTests .AppSecReqStats .BlockedRequestsNumber ,
398
+ s .TruePositiveTests .AppSecReqStats .ResolvedRequestsNumber ,
399
+ s .TrueNegativeTests .AppSecReqStats .BypassedRequestsNumber ,
400
+ s .TrueNegativeTests .AppSecReqStats .ResolvedRequestsNumber ,
401
+ )
369
402
370
403
var divider int
371
404
var sum float64
@@ -389,18 +422,37 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
389
422
}
390
423
391
424
func calculateTestsSummaryStat (s * TestsSummary ) {
392
- s .AllRequestsNumber = s .BlockedRequestsNumber +
393
- s .BypassedRequestsNumber +
394
- s .UnresolvedRequestsNumber +
395
- s .FailedRequestsNumber
396
-
397
- s .ResolvedRequestsNumber = s .BlockedRequestsNumber +
398
- s .BypassedRequestsNumber
399
-
400
- s .UnresolvedRequestsPercentage = CalculatePercentage (s .UnresolvedRequestsNumber , s .AllRequestsNumber )
401
- s .ResolvedBlockedRequestsPercentage = CalculatePercentage (s .BlockedRequestsNumber , s .ResolvedRequestsNumber )
402
- s .ResolvedBypassedRequestsPercentage = CalculatePercentage (s .BypassedRequestsNumber , s .ResolvedRequestsNumber )
403
- s .FailedRequestsPercentage = CalculatePercentage (s .FailedRequestsNumber , s .AllRequestsNumber )
425
+ // All requests stat
426
+ s .ReqStats .AllRequestsNumber = s .ReqStats .BlockedRequestsNumber +
427
+ s .ReqStats .BypassedRequestsNumber +
428
+ s .ReqStats .UnresolvedRequestsNumber +
429
+ s .ReqStats .FailedRequestsNumber
430
+
431
+ s .ReqStats .ResolvedRequestsNumber = s .ReqStats .BlockedRequestsNumber +
432
+ s .ReqStats .BypassedRequestsNumber
433
+
434
+ // ApiSec requests stat
435
+ s .ApiSecReqStats .AllRequestsNumber = s .ApiSecReqStats .BlockedRequestsNumber +
436
+ s .ApiSecReqStats .BypassedRequestsNumber +
437
+ s .ApiSecReqStats .UnresolvedRequestsNumber +
438
+ s .ApiSecReqStats .FailedRequestsNumber
439
+
440
+ s .ApiSecReqStats .ResolvedRequestsNumber = s .ApiSecReqStats .BlockedRequestsNumber +
441
+ s .ApiSecReqStats .BypassedRequestsNumber
442
+
443
+ // AppSec requests stat
444
+ s .AppSecReqStats .AllRequestsNumber = s .AppSecReqStats .BlockedRequestsNumber +
445
+ s .AppSecReqStats .BypassedRequestsNumber +
446
+ s .AppSecReqStats .UnresolvedRequestsNumber +
447
+ s .AppSecReqStats .FailedRequestsNumber
448
+
449
+ s .AppSecReqStats .ResolvedRequestsNumber = s .AppSecReqStats .BlockedRequestsNumber +
450
+ s .AppSecReqStats .BypassedRequestsNumber
451
+
452
+ s .UnresolvedRequestsPercentage = CalculatePercentage (s .ReqStats .UnresolvedRequestsNumber , s .ReqStats .AllRequestsNumber )
453
+ s .ResolvedBlockedRequestsPercentage = CalculatePercentage (s .ReqStats .BlockedRequestsNumber , s .ReqStats .ResolvedRequestsNumber )
454
+ s .ResolvedBypassedRequestsPercentage = CalculatePercentage (s .ReqStats .BypassedRequestsNumber , s .ReqStats .ResolvedRequestsNumber )
455
+ s .FailedRequestsPercentage = CalculatePercentage (s .ReqStats .FailedRequestsNumber , s .ReqStats .AllRequestsNumber )
404
456
}
405
457
406
458
func calculateScorePercentage (s * Score , truePosBlockedNum , truePosNum , trueNegBypassNum , trueNegNum int ) {
0 commit comments