
Évaluateur global d'intégrité d'API
Installez opam pour construire l'API de tests.
Installez git, python3, pip et .NET pour construire RESTler et Schemathesis.
Installez cargo pour construire Gaia.
Installez docker v26.0.1 et docker compose v2.26.1 pour construire Gaia avec la pile ELK (optionnel sinon).
Installez node >= v18.0.0 et npm >= v8.6.0
Pour créer un switch local 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 <chemin-openapi> --workdir-path <chemin-répertoire-travail> --verbose <verbose>
workdir-path : Le répertoire de travail où vous trouverez les différents journaux des fuzzers.
openapi-path : Chemin du fichier OpenAPI de l'API réelle. Requis lorsque vous utilisez le fuzzing ou la surveillance mais pas pour les statistiques
verbose : Le niveau de verbosité {NOTHING, LOW, MID, HIGH, ALL} (Valeur par défaut : NOTHING)
configuration : Le chemin du fichier json qui contient :
{
"configuration": {
// L'un des : fuzzing ou monitoring
"fuzzing": {
//Requis
"config_fuzzer": {
//Requis
// En heures
"timeout": 1,
//Optionnel
// Désactiver les fuzzers
"disable_fuzzers": [{
"Restler":{
// Bfs, BfsFast, BfsCheap ou RandomWalk
"strategy" : "Bfs"
}
},
"Schemathesis",
{"Custom": {"id": "1"}}
],
//Optionnel
"custom_fuzzers": [
"<ligne de commande pouvant accepter `--output_dir <PATH>`, `--openapi_path <PATH>` et `--timeout <FLOAT>` comme arguments>"
],
//Optionnel
"generation_config": {
//optionnel (Requis si vous définissez une fonction pour générer une valeur)
"lib_path": "Chemin absolu vers la bibliothèque dynamique (.so, .dll ou .rs).",
//Optionnel
"generate_string": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie un tableau de chaînes>",
//Ou
"value": ["fuzzstring"],
//Ou
"function": "<function() qui renvoie un tableau de chaînes>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_datetime": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie un tableau de datetime au format chaîne>",
//Ou
"value": ["2019-06-26T20:20:39+00:00"],
//Ou
"function": "<function() qui renvoie un tableau de datetime au format chaîne>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_date": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie un tableau de dates au format chaîne>",
//Ou
"value": ["2019-06-26"],
//Ou
"function": "<function() qui renvoie un tableau de dates au format chaîne>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_int": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie un tableau d'entiers au format chaîne>",
//Ou
"value": ["0"],
//Ou
"function": "<function() qui renvoie un tableau d'entiers au format chaîne>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_number": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie un tableau de flottants au format chaîne>",
//Ou
"value": ["1.5"],
//Ou
"function": "<function() qui renvoie un tableau de flottants au format chaîne>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_object": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie un tableau d'objets json au format chaîne>",
//Ou
"value": ["{\"k\" : {\"v\" : \"value\" }}"],
//Ou
"function": "<function() qui renvoie un tableau d'objets json au format chaîne>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_path_parameter": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie une carte clé-valeur avec une clé chaîne faisant référence à un paramètre de chemin et un tableau de chaînes de valeurs>",
//Ou
"value": {
"k": {
"v": ["value"]
}
},
//Ou
"function": "<function() qui renvoie une carte clé-valeur avec une clé chaîne faisant référence à un paramètre de chemin et un tableau de chaînes de valeurs>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
},
//Optionnel
"generate_query_parameter": {
//L'un des : Command, Value, File path ou Function
"command": "<ligne de commande qui renvoie une carte clé-valeur avec une clé chaîne faisant référence à un paramètre de requête et un tableau de chaînes de valeurs>",
//Ou
"value": {
"k": {
"v": ["value"]
}
},
//Ou
"function": "<function() qui renvoie une carte clé-valeur avec une clé chaîne faisant référence à un paramètre de requête et un tableau de chaînes de valeurs>",
//Ou
"file": "Le chemin du fichier vers le dictionnaire de valeurs"
}
}
},
//Requis
"config_process_manager": {
//Optionnel
"config_reset": {
//Requis
"reset_lib": "Chemin absolu vers la bibliothèque dynamique (.so, .dll ou .rs).",
//Requis
"function": "Nom de la fonction qui prend deux chaînes comme arguments et renvoie une unité. La première chaîne représente le journal au format JSON, et la seconde le chemin vers le fichier journal en temps réel."
},
//Requis
"config_proxy": {
//Optionnel
"headers_config": {
//Optionnel
"custom_headers": [
{
//Requis
"title": "titre",
//Requis
"header_type": {
//L'un des : Command ou Value
"Command": {
//Requis
"cmd": "<Commande qui renvoie la valeur de l'en-tête>",
//Requis
//Durée de rafraîchissement en millisecondes
"duration": 0
},
// ou
"Value": { "value": "Valeur de l'en-tête" }
}
}
]
},
//Optionnel
"openapi_config": {
//Optionnel
"responses_to_string": true, // Change le type des réponses en chaîne
//Optionnel
"requests_config": {
//L'un des : Exclude ou Only
"only": {
//Requis
"requests": [
{
//Requis
"path": "Regex représentant un chemin",
//Requis
"methods": [
"Get",
"Put",
"Post",
"Delete",
"Options",
"Head",
"Patch",
"Trace"
]
}
]
},
//Ou
"Exclude": {
//Requis
"requests": [
{
//Requis
"path": "Regex représentant un chemin",
//Optionnel : Par défaut, toutes les méthodes si non spécifié.
"methods": [
"Get",
"Put",
"Post",
"Delete",
"Options",
"Head",
"Patch",
"Trace"
]
}
]
}
}
},
//Optionnel
"stream_response_services": [
{
//Requis
"path": "Regex représentant un chemin",
//Optionnel : Par défaut, toutes les méthodes si non spécifié.
"methods": [
"Get",
"Put",
"Post",
"Delete",
"Options",
"Head",
"Patch",
"Trace"
]
}
]
},
//Optionnel
"use_sync_requests" : true
}
},
"monitoring": {
"config_monitoring": {
//L'un des : log_file_path ou service
"log_file_path": {
//Requis
"path": "/home/log.log"
},
"service": {
//Requis
"url": "http://localhost:3000/log"
}
}
}
},
//Optionnel
"config_checker": {
//Optionnel
"checkers_cmd": [
"<ligne de commande qui prend une chaîne comme argument et renvoie une unité. Cette chaîne représente le journal au format JSON>"
],
//Optionnel
"checkers_lib": [
{
//Requis
"checkers_lib": "Chemin absolu vers la bibliothèque dynamique (.so, .dll ou .rs).",
//Requis
"function_names": [
"Noms de fonctions qui prennent une chaîne comme argument et renvoient une unité. Cette chaîne représente le journal au format JSON"
]
}
]
},
//Optionnel
"config_checker_elk_stack": {
//Requis
"kibana_port": 5602 //Url Kibana : http://localhost:{kibana_port}
},
//Optionnel
"config_statistics": {
//Requis
"process": {
//L'un des : docker, process ou service
"docker": {
//Requis
"container_id": "89u32eew2r"
},
"process": {
//Requis
"pid": 1100293
},
"service": {
//Requis
"url": "http://localhost:3000/statistics"
}
}
},
//Optionnel
"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].