💻 Exemplos de Código: Cap 12 - Strings e Segurança OWASP
Código executável completo demonstrando funções de manipulação de strings da <string.h>, formatação segura com snprintf e proteção contra injeções de Format String.
📄 Exemplo 1: Manipulação Segura com snprintf e strncmp (strings_seguras.c)
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(void) {
char bufferLog[128];
const char *servico = "AuthService";
const char *status = "200_OK";
int tempoMs = 14;
printf("====================================================\n");
printf(" 🛡️ CONSTRUCAO SEGURA DE LOGS (SNPRINTF)\n");
printf("====================================================\n");
// 1. Formatação com garantia estrita de limites
int bytesEscritos = snprintf(bufferLog, sizeof(bufferLog),
"[%s] Status: %s | Latencia: %d ms",
servico, status, tempoMs);
printf("Log Gerado: %s\n", bufferLog);
printf("Bytes Escritos: %d (Capacidade: %zu bytes)\n", bytesEscritos, sizeof(bufferLog));
// 2. Comparação segura com limite de caracteres
if (strncmp(status, "200_OK", 6) == 0) {
printf(">> Transacao Concluida com Sucesso! ✅\n");
} else {
printf(">> Falha na Transacao! ❌\n");
}
printf("====================================================\n");
return 0;
}
📄 Exemplo 2: Tokenização Segura de String com strtok_r (parser_csv.c)
#include <stdio.h>
#include <string.h>
int main(void) {
// String mutável na Stack contendo registro CSV
char linhaCsv[] = "SENSOR_TEMP_01,24.85,OPERACIONAL,PISO_2";
char *salvarPonteiro = NULL;
printf("====================================================\n");
printf(" 📄 PARSER CSV SEGURO E REENTRANTE (STRTOK_R)\n");
printf(" Linha Original: \"%s\"\n", linhaCsv);
printf("----------------------------------------------------\n");
// Extrai o primeiro token
char *token = strtok_r(linhaCsv, ",", &salvarPonteiro);
int campo = 1;
while (token != NULL) {
printf(" Campo #%d: %s\n", campo++, token);
// Próximos tokens passam NULL no primeiro argumento
token = strtok_r(NULL, ",", &salvarPonteiro);
}
printf("====================================================\n");
return 0;
}