added hash
This commit is contained in:
parent
2c1c077611
commit
251a59ddbe
@ -129,6 +129,28 @@ public:
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsMessageValid(const std::string& fullMessage) {
|
||||||
|
#ifdef ENABLE_NETWORK_CHECKSUM
|
||||||
|
size_t hashPos = fullMessage.find("#hash:");
|
||||||
|
if (hashPos == std::string::npos) {
|
||||||
|
return false; // Хеша нет, хотя он ожидался
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string originalContent = fullMessage.substr(0, hashPos);
|
||||||
|
std::string receivedHashStr = fullMessage.substr(hashPos + 6); // 6 — длина "#hash:"
|
||||||
|
|
||||||
|
// Вычисляем ожидаемый хеш от контента
|
||||||
|
size_t expectedHash = std::hash<std::string>{}(originalContent + NET_SECRET);
|
||||||
|
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << std::hex << expectedHash;
|
||||||
|
|
||||||
|
return ss.str() == receivedHashStr;
|
||||||
|
#else
|
||||||
|
return true; // В режиме отладки пропускаем всё
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*
|
/*
|
||||||
void init() {
|
void init() {
|
||||||
@ -299,8 +321,17 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void process_message(const std::string& msg) {
|
void process_message(const std::string& msg) {
|
||||||
std::cout << "Received from player " << id_ << ": " << msg << std::endl;
|
if (!IsMessageValid(msg)) {
|
||||||
auto parts = split(msg, ':');
|
// Логируем попытку подмены и просто выходим из обработки
|
||||||
|
std::cout << "[Security] Invalid packet hash. Dropping message." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string cleanMessage = msg.substr(0, msg.find("#hash:"));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "Received from player " << id_ << ": " << cleanMessage << std::endl;
|
||||||
|
auto parts = split(cleanMessage, ':');
|
||||||
|
|
||||||
if (parts.empty()) return;
|
if (parts.empty()) return;
|
||||||
|
|
||||||
@ -326,7 +357,7 @@ private:
|
|||||||
receivedState.handle_full_sync(parts, 2);
|
receivedState.handle_full_sync(parts, 2);
|
||||||
timedClientStates.add_state(receivedState);
|
timedClientStates.add_state(receivedState);
|
||||||
|
|
||||||
retranslateMessage(msg);
|
retranslateMessage(cleanMessage);
|
||||||
}
|
}
|
||||||
else if (parts[0] == "RESPAWN") {
|
else if (parts[0] == "RESPAWN") {
|
||||||
{
|
{
|
||||||
|
|||||||
@ -884,8 +884,8 @@ namespace ZL
|
|||||||
int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>(
|
int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
std::chrono::system_clock::now().time_since_epoch()).count();
|
std::chrono::system_clock::now().time_since_epoch()).count();
|
||||||
|
|
||||||
std::cout << "getSyncTimeMs localNow = " << localNow << std::endl;
|
//std::cout << "getSyncTimeMs localNow = " << localNow << std::endl;
|
||||||
std::cout << "getSyncTimeMs getTimeOffset = " << networkClient->getTimeOffset() << std::endl;
|
//std::cout << "getSyncTimeMs getTimeOffset = " << networkClient->getTimeOffset() << std::endl;
|
||||||
|
|
||||||
// Добавляем смещение, полученное от сервера
|
// Добавляем смещение, полученное от сервера
|
||||||
return localNow + networkClient->getTimeOffset(); // Нужно добавить геттер в интерфейс
|
return localNow + networkClient->getTimeOffset(); // Нужно добавить геттер в интерфейс
|
||||||
@ -917,7 +917,7 @@ namespace ZL
|
|||||||
|
|
||||||
auto now_ms = newTickCount;
|
auto now_ms = newTickCount;
|
||||||
|
|
||||||
std::cout << "processTickCount = " << now_ms << std::endl;
|
//std::cout << "processTickCount = " << now_ms << std::endl;
|
||||||
|
|
||||||
sparkEmitter.update(static_cast<float>(delta));
|
sparkEmitter.update(static_cast<float>(delta));
|
||||||
planetObject.update(static_cast<float>(delta));
|
planetObject.update(static_cast<float>(delta));
|
||||||
|
|||||||
@ -9,6 +9,9 @@
|
|||||||
using std::min;
|
using std::min;
|
||||||
using std::max;
|
using std::max;
|
||||||
|
|
||||||
|
constexpr auto NET_SECRET = "880b3713b9ff3e7a94b2712d54679e1f";
|
||||||
|
#define ENABLE_NETWORK_CHECKSUM
|
||||||
|
|
||||||
constexpr float ANGULAR_ACCEL = 0.005f * 1000.0f;
|
constexpr float ANGULAR_ACCEL = 0.005f * 1000.0f;
|
||||||
constexpr float SHIP_ACCEL = 1.0f * 1000.0f;
|
constexpr float SHIP_ACCEL = 1.0f * 1000.0f;
|
||||||
constexpr float ROTATION_SENSITIVITY = 0.002f;
|
constexpr float ROTATION_SENSITIVITY = 0.002f;
|
||||||
|
|||||||
@ -78,7 +78,23 @@ namespace ZL {
|
|||||||
void WebSocketClient::Send(const std::string& message) {
|
void WebSocketClient::Send(const std::string& message) {
|
||||||
if (!connected) return;
|
if (!connected) return;
|
||||||
|
|
||||||
auto ss = std::make_shared<std::string>(message);
|
std::string finalMessage = message;
|
||||||
|
|
||||||
|
#ifdef ENABLE_NETWORK_CHECKSUM
|
||||||
|
// Вычисляем хеш. Для примера используем std::hash,
|
||||||
|
// но в продакшене лучше взять быструю реализацию типа MurmurHash3.
|
||||||
|
size_t hashValue = std::hash<std::string>{}(message + NET_SECRET);
|
||||||
|
|
||||||
|
// Преобразуем хеш в hex-строку для передачи
|
||||||
|
std::stringstream ss_hash;
|
||||||
|
ss_hash << std::hex << hashValue;
|
||||||
|
|
||||||
|
// Добавляем хеш в конец сообщения через разделитель
|
||||||
|
// Например: "UPD:12345:pos...#hash:a1b2c3d4"
|
||||||
|
finalMessage += "#hash:" + ss_hash.str();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto ss = std::make_shared<std::string>(finalMessage);
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(writeMutex_);
|
std::lock_guard<std::mutex> lock(writeMutex_);
|
||||||
writeQueue_.push(ss);
|
writeQueue_.push(ss);
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
namespace ZL {
|
namespace ZL {
|
||||||
|
|
||||||
|
|
||||||
class WebSocketClientBase : public INetworkClient {
|
class WebSocketClientBase : public INetworkClient {
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user