
Глобальный оценщик целостности API
Установите opam для сборки тестового API.
Установите git, python3, pip и .NET для сборки RESTler и Schemathesis.
Установите cargo для сборки Gaia.
Установите docker v26.0.1 и docker compose v2.26.1 для сборки Gaia с ELK Stack (необязательно, если не требуется).
Установите node >= v18.0.0 и npm >= v8.6.0
Чтобы создать локальный переключатель opam:
make opam-switch
make deps
make build
make build-test
make generate-swagger
make clean-swagger
make format
make clean-build-files
make clean
./_bin/gaia --help
gaia --configuration <configuration> --openapi-path <openapi-path> --workdir-path <workdir-path> --verbose <verbose>
workdir-path: Рабочая директория, в которой вы найдете различные журналы фаззеров.
openapi-path: Путь к файлу OpenAPI реального API. Требуется при использовании фаззинга или мониторинга, но не для статистики
verbose : Уровень детализации {NOTHING, LOW, MID, HIGH, ALL} (Значение по умолчанию: NOTHING)
configuration: Путь к JSON-файлу, который содержит:
{
"configuration": {
// Один из: fuzzing или monitoring
"fuzzing": {
//Обязательно
"config_fuzzer": {
//Обязательно
// В часах
"timeout": 1,
//Необязательно
// Отключить фаззеры
"disable_fuzzers": [{
"Restler":{
// Bfs, BfsFast, BfsCheap или RandomWalk
"strategy" : "Bfs"
}
},
"Schemathesis",
{"Custom": {"id": "1"}}
],
//Необязательно
"custom_fuzzers": [
"<командная строка, которая может принимать `--output_dir <PATH>`, `--openapi_path <PATH>` и `--timeout <FLOAT>` в качестве аргументов>"
],
//Необязательно
"generation_config": {
//необязательно (Обязательно, если вы задаете функцию для генерации значения)
"lib_path": "Абсолютный путь к динамической библиотеке (.so, .dll или .rs).",
//Необязательно
"generate_string": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая массив строк>",
//Или
"value": ["fuzzstring"],
//Или
"function": "<function() возвращающая массив строк>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_datetime": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая массив дат и времени в строковом формате>",
//Или
"value": ["2019-06-26T20:20:39+00:00"],
//Или
"function": "<function() возвращающая массив дат и времени в строковом формате>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_date": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая массив дат в строковом формате>",
//Или
"value": ["2019-06-26"],
//Или
"function": "<function() возвращающая массив дат в строковом формате>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_int": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая массив целых чисел в строковом формате>",
//Или
"value": ["0"],
//Или
"function": "<function() возвращающая массив целых чисел в строковом формате>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_number": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая массив чисел с плавающей точкой в строковом формате>",
//Или
"value": ["1.5"],
//Или
"function": "<function() возвращающая массив чисел с плавающей точкой в строковом формате>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_object": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая массив JSON-объектов в строковом формате>",
//Или
"value": ["{\"k\" : {\"v\" : \"value\" }}"],
//Или
"function": "<function() возвращающая массив JSON-объектов в строковом формате>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_path_parameter": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая карту ключ-значение, где строковый ключ ссылается на параметр пути, а значение — массив строк>",
//Или
"value": {
"k": {
"v": ["value"]
}
},
//Или
"function": "<function() возвращающая карту ключ-значение, где строковый ключ ссылается на параметр пути, а значение — массив строк>",
//Или
"file": "Путь к файлу словаря значений"
},
//Необязательно
"generate_query_parameter": {
//Один из: Command, Value, File path или Function
"command": "<командная строка, возвращающая карту ключ-значение, где строковый ключ ссылается на параметр запроса, а значение — массив строк>",
//Или
"value": {
"k": {
"v": ["value"]
}
},
//Или
"function": "<function() возвращающая карту ключ-значение, где строковый ключ ссылается на параметр запроса, а значение — массив строк>",
//Или
"file": "Путь к файлу словаря значений"
}
}
},
//Обязательно
"config_process_manager": {
//Необязательно
"config_reset": {
//Обязательно
"reset_lib": "Абсолютный путь к динамической библиотеке (.so, .dll или .rs).",
//Обязательно
"function": "Имя функции, которая принимает две строки в качестве аргументов и возвращает unit. Первая строка представляет журнал в формате JSON, а вторая — путь к файлу журнала в реальном времени."
},
//Обязательно
"config_proxy": {
//Необязательно
"headers_config": {
//Необязательно
"custom_headers": [
{
//Обязательно
"title": "title",
//Обязательно
"header_type": {
//Один из: Command или Value
"Command": {
//Обязательно
"cmd": "<Команда, возвращающая значение заголовка>",
//Обязательно
//Время обновления значения в миллисекундах
"duration": 0
},
// или
"Value": { "value": "Значение заголовка" }
}
}
]
},
//Необязательно
"openapi_config": {
//Необязательно
"responses_to_string": true, // Изменить тип ответов на строку
//Необязательно
"requests_config": {
//Один из: Exclude или Only
"only": {
//Обязательно
"requests": [
{
//Обязательно
"path": "Регулярное выражение, представляющее путь",
//Обязательно
"methods": [
"Get",
"Put",
"Post",
"Delete",
"Options",
"Head",
"Patch",
"Trace"
]
}
]
},
//Или
"Exclude": {
//Обязательно
"requests": [
{
//Обязательно
"path": "Регулярное выражение, представляющее путь",
//Необязательно: По умолчанию используются все методы, если не указано.
"methods": [
"Get",
"Put",
"Post",
"Delete",
"Options",
"Head",
"Patch",
"Trace"
]
}
]
}
}
},
//Необязательно
"stream_response_services": [
{
//Обязательно
"path": "Регулярное выражение, представляющее путь",
//Необязательно: По умолчанию используются все методы, если не указано.
"methods": [
"Get",
"Put",
"Post",
"Delete",
"Options",
"Head",
"Patch",
"Trace"
]
}
]
},
//Необязательно
"use_sync_requests" : true
}
},
"monitoring": {
"config_monitoring": {
//Один из: log_file_path или service
"log_file_path": {
//Обязательно
"path": "/home/log.log"
},
"service": {
//Обязательно
"url": "http://localhost:3000/log"
}
}
}
},
//Необязательно
"config_checker": {
//Необязательно
"checkers_cmd": [
"<командная строка, принимающая строку в качестве аргумента и возвращающая unit. Эта строка представляет журнал в формате JSON>"
],
//Необязательно
"checkers_lib": [
{
//Обязательно
"checkers_lib": "Абсолютный путь к динамической библиотеке (.so, .dll или .rs).",
//Обязательно
"function_names": [
"Имена функций, принимающих строку в качестве аргумента и возвращающих unit. Эта строка представляет журнал в формате JSON"
]
}
]
},
//Необязательно
"config_checker_elk_stack": {
//Обязательно
"kibana_port": 5602 //URL Kibana: http://localhost:{kibana_port}
},
//Необязательно
"config_statistics": {
//Обязательно
"process": {
//Один из: docker, process или service
"docker": {
//Обязательно
"container_id": "89u32eew2r"
},
"process": {
//Обязательно
"pid": 1100293
},
"service": {
//Обязательно
"url": "http://localhost:3000/statistics"
}
}
},
//Необязательно
"scanner": true
}
{
"id" : 9009,
"request": {
"method": "GET",
"url": "http://localhost:8080/api/data",
"headers": [
["connection", "keep-alive"],
["accept", "*/*"],
["user-agent", "schemathesis/3.24.3"],
["host", "localhost:8081"],
["accept-encoding", "gzip, deflate"],
["authorization", "Bearer"],
["x-schemathesis-testcaseid", "97pK1I"],
["authorization", "Bearer Test"]
],
"params": [],
"body": "",
"timestamp": "2024-06-17T12:43:21.717+00:00"
},
"response": {
"status_code": 403,
"headers": [
["access-control-allow-headers", "accept, content-type"],
["access-control-allow-origin", "*"],
["content-type", "application/json"],
["content-length", "70"]
],
"body": "{\"error\":\"get_data\",\"exception\":\"sender Test should be connected\"}",
"timestamp": "2024-06-17T12:43:21.717+00:00"
},
"reset": false
}
{
"request": {
"method": "POST",
"url": "http://localhost:20000/injection/block",
"headers": [
["user-agent", "restler/9.2.3"],
["content-type", "application/json"],
["accept", "application/json"],
["x-restler-sequence-id", "20f34e2b-13e8-4861-a7aa-77df3dff5ad6"],
["host", "localhost:22333"],
["content-length", "225"]
],
"params": [
["async", "fuzzstring"],
["force", "fuzzstring"],
["chain", "fuzzstring"]
],
"body": {
"data": "fuzzstring",
"operations": [[{ "branch": { "fuzz": false }, "data": "fuzzstring" }]]
},
"timestamp": "2024-06-17T12:43:21.717+00:00"
},
"response": {
"status_code": 400,
"headers": [
["content-type", "text/plain"],
["transfer-encoding", "chunked"]
],
"body": null,
"timestamp": "2024-06-17T12:43:21.722+00:00"
},
"reset": false
}
Copyright © 2024, Functori [email protected].