Код: Выделить всё
#include <iostream>
#include <string>
#include <random>
#include <iomanip>
#include <sstream>
#include <unordered_map>
#include <ctime>
// Простая функция для генерации случайного токена
std::string generate_token() {
static std::mt19937 rng((unsigned) std::time(nullptr));
static std::uniform_int_distribution<uint64_t> dist;
uint64_t random_value = dist(rng);
std::stringstream ss;
ss << std::hex << random_value;
return ss.str();
}
Для простоты можно использовать std::unordered_map, где ключ — идентификатор сессии или пользователя, значение — токен.
Код: Выделить всё
// В простом случае — глобальный map
std::unordered_map<std::string, std::string> session_tokens;
// Функция для установки токена для сессии
void set_csrf_token(const std::string& session_id) {
std::string token = generate_token();
session_tokens[session_id] = token;
}
// Функция для проверки токена
bool validate_csrf_token(const std::string& session_id, const std::string& token) {
auto it = session_tokens.find(session_id);
if (it != session_tokens.end() && it->second == token) {
return true;
}
return false;
}
При отправке формы или страницы вставьте токен в HTML:
Код: Выделить всё
<input type="hidden" name="X-CSRF-TOKEN" value="ТУТ_ТОКЕН">
4. Проверка токена при получении POST-запроса
При обработке POST-запроса извлекайте значение токена из заголовка или тела запроса и проверяйте:
Код: Выделить всё
// Пример: при обработке запроса
std::string received_token = ...; // из POST данных или заголовков
std::string session_id = ...; // из куки или другого источника
if (validate_csrf_token(session_id, received_token)) {
// Токен валиден, продолжаем обработку
} else {
// Токен недействителен — отклоняем запрос
}