Offline shop fonksiyon açığı hatasını düzeltme

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 30

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba arkadaşlar,

Dev forumun da gezerken rastladım ve sizlerle paylaşmak istiyorum. İşine lazım olanlar uygulayabilir.


src/common/service.h açılır ve eklenir

Kod:
#define __OFFLINE_SHOP_FIX_OPEN #define __OFFLINE_SHOP_VALUE_MAX 2000000000 #define __OFFLINE_SHOP_WARNING "[Protect Offline] Have more than 2.000.000.000 Yang!"

src/game/char.cpp açılır ve aratılır

Kod:
if (!LC_IsBrazil())     {         DWORD nTotalMoney = 0;         for (BYTE n = 0; n < bItemCount; ++n)             nTotalMoney += (pTable + n)->price;         if (GOLD_MAX - 1 <= nTotalMoney)         {             sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName());             ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20억 냥을 초과하여 상점을 열수가 없습니다"));             return;         }     }

ve değiştirilir

Kod:
#ifdef __OFFLINE_SHOP_FIX_OPEN     int64_t szTotalMoney = 0;     for (int n = 0; n < bItemCount; ++n)     {         szTotalMoney += static_cast<int64_t>((pTable+n)->price);     }     std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT money FROM player.player WHERE id = %u", GetPlayerID()));     if (pMsg->Get()->uiNumRows == 0)         return;            DWORD dwCurrentMoney = 0;     MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);     str_to_number(dwCurrentMoney, row[0]);        szTotalMoney += static_cast<int64_t>(dwCurrentMoney);     if (__OFFLINE_SHOP_VALUE_MAX <= szTotalMoney)     {         ChatPacket(CHAT_TYPE_INFO, __OFFLINE_SHOP_WARNING);         return;     } #else            if (!LC_IsBrazil())     {         DWORD nTotalMoney = 0;         for (BYTE n = 0; n < bItemCount; ++n)             nTotalMoney += (pTable + n)->price;         if (GOLD_MAX - 1 <= nTotalMoney)         {             sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName());             ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20억 냥을 초과하여 상점을 열수가 없습니다"));             return;         }     } #endif

İyi forumlar.

Offline Shop Fonksiyon Açığı Hatasını Düzeltme Rehberi

Metin2 özel sunucu geliştirme sürecinde karşılaşılan yaygın sorunlardan birisi olan Offline Shop fonksiyon açığı hatası, sunucuların güvenliğini doğrudan etkileyebilecek ciddi bir durumdur. Bu makalede, bu açığın ne olduğunu, neden oluştuğunu ve nasıl düzeltileceğini detaylı olarak ele alacağız.

Offline Shop Fonksiyon Açığı Nedir?

Offline Shop, oyuncuların internete bağlı olmadan sandık açmalarına veya eşya transferlerine olanak tanıyan bir özelliktir. Ancak bu özellik, doğru şekilde korunmadığında, kötü niyetli kullanıcılar tarafından exploit edilebilir. Bu durumda, sunucuda istenmeyen eşya çoğalması, veritabanında bozulmalar veya hatta tamamen sunucunun çökmesine sebep olabilir.

Açığın Kaynağı

Genellikle C++ tabanlı game server kaynak kodlarında, offline shop işlemleri sırasında gerekli kontrollerin yapılmaması sonucunda bu açığa rastlanır. Özellikle client ile server arasında gönderilen verilerin doğrulanmaması, saldırganların bu verileri manipüle etmesine olanak tanır.

Açığı Giderme Yöntemleri

1. Girdi Doğrulama: Sunucuya gelen tüm verilerin kontrol edilmesi gerekir. Örneğin, bir oyuncu offline shop üzerinden eşya gönderdiğinde, eşyanın gerçekten oyuncuda olup olmadığı, miktarının geçerli aralıkta olup olmadığı gibi kontroller yapılmalıdır.

2. Yetkilendirme Kontrolleri: Offline işlem yapmaya çalışan kullanıcının gerçekten o karaktere sahip olup olmadığı kontrol edilmelidir. Bu işlem genellikle auth sunucusuyla entegre çalışarak yapılır.

3. Loglama ve İzleme: Tüm offline shop işlemlerinin loglanması, şüpheli aktivitelerin daha kolay tespit edilmesini sağlar. Bu loglar, gelecekte benzer açıkların önüne geçmek için de değerlidir.

Teknik Uygulama Örneği (Python / C++)

Aşağıda basit bir kontrol fonksiyonu örneği verilmiştir:

if not check_item_ownership(player_id, item_id):
return False # Eşya sahipliği yok
if not validate_item_count(item_count):
return False # Geçersiz miktar

Bu tür kontroller, py root veya uiscript üzerinden de entegre edilebilir.

Sonuç

Metin2 özel sunucularında offline shop güvenlik açıklarını önlemek için, C++ sunucu tarafı kodlamada dikkatli olunmalı ve gerekli kontroller mutlaka uygulanmalıdır. Bu sayede hem oyuncuların güvenliği sağlanır hem de sunucu bütünlüğü korunmuş olur.


How to Fix Offline Shop Function Vulnerability Error

Metin2 private server development includes various challenges, one of which is the common issue known as the Offline Shop function vulnerability. This vulnerability can directly impact the security of servers. In this article, we will discuss what this vulnerability is, why it occurs, and how to fix it in detail.

What Is the Offline Shop Vulnerability?

Offline Shop allows players to open chests or transfer items without being connected to the internet. However, if not properly secured, malicious users may exploit this feature. As a result, unwanted item duplication, database corruption, or even server crashes can occur.

Source of the Vulnerability

This vulnerability typically occurs in C++-based game server source codes when necessary checks are not performed during offline shop operations. Specifically, failure to validate data sent between the client and server allows attackers to manipulate these values.

Methods to Resolve the Vulnerability

1. Input Validation: All incoming data to the server must be validated. For instance, when a player attempts to send an item through the offline shop, the server must check whether the item truly exists in the player's inventory and whether the quantity is within valid limits.

2. Authorization Checks: The identity of the user attempting the offline operation must be verified. This ensures that the person making the request is actually the owner of the character, often done via integration with the auth server.

3. Logging and Monitoring: Logging all offline shop transactions helps detect suspicious activities more easily. These logs can also be valuable for preventing similar vulnerabilities in the future.

Technical Implementation Example (Python / C++)

Here’s a simple validation function example:

if not check_item_ownership(player_id, item_id):
return False # Item ownership invalid
if not validate_item_count(item_count):
return False # Invalid count

Such checks can also be integrated into py root or uiscript.

Conclusion

To prevent offline shop vulnerabilities in Metin2 private servers, careful attention must be paid to C++ server-side coding, and necessary checks must be implemented. This ensures both player safety and server integrity.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt