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
src/game/char.cpp açılır ve aratılır
ve değiştirilir
İyi forumlar.
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&#50613; &#45285;&#51012; &#52488;&#44284;&#54616;&#50668; &#49345;&#51216;&#51012; &#50676;&#49688;&#44032; &#50630;&#49845;&#45768;&#45796;")); 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&#50613; &#45285;&#51012; &#52488;&#44284;&#54616;&#50668; &#49345;&#51216;&#51012; &#50676;&#49688;&#44032; &#50630;&#49845;&#45768;&#45796;")); 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.
