Bilinen ve doğabilecek tüm "Sql İnjection" fixi ;
<blockquote data-attributes="" data-quote="MAREK38" data-source="post: 19453493" class="bbCodeBlock bbCodeBlock--expandable bbCodeBlock--quote js-expandWatch is-expandable">
Kod:
void DBManager::Query(const char * c_pszFormat, ...)[/FONT]
Kod bloğunu değiştir ;
Kod:
void DBManager::Query(const char * c_pszFormat, ...) { char szQuery[4096]; va_list args; va_start(args, c_pszFormat); vsnprintf(szQuery, sizeof(szQuery), c_pszFormat, args); va_end(args); std::string sQuery(szQuery); m_sql.AsyncQuery(sQuery.substr(0,sQuery.find_first_of(";")==-1?sQuery.length(): sQuery.find_first_of(";")).c_str()); }
Arat ;
Kod:
SQLMsg * DBManager::DirectQuery(const char * c_pszFormat, ...)
Değiştir ;
Kod:
SQLMsg * DBManager::DirectQuery(const char * c_pszFormat, ...) { char szQuery[4096]; va_list args; va_start(args, c_pszFormat); vsnprintf(szQuery, sizeof(szQuery), c_pszFormat, args); va_end(args); std::string sQuery(szQuery); return m_sql_direct.DirectQuery(sQuery.substr(0, sQuery.find_first_of(";") == -1 ? sQuery.length(): sQuery.find_first_of(";")).c_str()); }
Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion)
Kod bloğunu değiştir ;
Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) { if (companion.empty()) return; char companionEscaped[CHARACTER_NAME_MAX_LEN * 2 + 1]; DBManager::instance().EscapeString(companionEscaped, sizeof(companionEscaped), companion.c_str(), companion.length()); DBManager::instance().Query("DELETE FROM messenger_list%s WHERE account='%s' AND companion = '%s'", get_table_postfix(), account.c_str(), companionEscaped); __RemoveFromList(account, companion); sys_log(1, "Messenger Remove %s %s", account.c_str(), companion.c_str()); TPacketGGMessenger pack; pack.bHeader = HEADER_GG_MESSENGER_REMOVE; strlcpy(pack.szAccount, account.c_str(), sizeof(pack.szAccount)); strlcpy(pack.szCompanion, companion.c_str(), sizeof(pack.szCompanion)); P2P_MANAGER::instance().Send(&pack, sizeof(TPacketGGMessenger)); }
guild_manager.cpp aç
Arat ;
Kod:
std::unique_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'", get_table_postfix(), __escape_name)); Üstteki kod yoksa bunu arat ; std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'", get_table_postfix(), gcp.name));
Üstüne ekle ;
Kod:
static char __escape_name[GUILD_NAME_MAX_LEN * 2 + 1]; DBManager::instance().EscapeString(__escape_name, sizeof(__escape_name), static_cast<const char *>(gcp.name), sizeof(gcp.name));
Var ise arat ;
Kod:
get_table_postfix(), gcp.name
Değiştir ;
Kod:
get_table_postfix(), __escape_name
C++ ile SQL Injection Güvenlik Açığına Karşı Arkadaşı, Fısıltıyı ve Lonca Sistemini Güvenceye Almak
Metin2 özel sunucularında güvenlik en önemli önceliklerden biridir. Özellikle C++ tabanlı sunucu kaynak kodlarında geliştirilen sistemlerde SQL injection gibi güvenlik açıklarına karşı alınması gereken önlemler çok önemlidir. Bu yazıda, arkadaşlık, fısıltı ve lonca gibi kullanıcı etkileşimine dayalı sistemlerde oluşabilecek SQL injection açıklarını nasıl kapatabileceğimizi detaylı olarak ele alacağız.
SQL Injection Nedir?
SQL injection, kötü niyetli kullanıcıların sistemdeki veritabanına doğrudan erişerek veri çalmaları veya veri üzerinde değişiklik yapmalarını sağlayan bir güvenlik açığıdır. Metin2 özel sunucularda genellikle C++ ile yazılmış olan auth ve game sunucularında, kullanıcıdan gelen veriler doğrudan SQL sorgusuna entegre edildiğinde bu tür açıklar ortaya çıkar.
Arkadaş Sistemi Güvenliği
Metin2'de arkadaşlık sistemi, oyuncuların birbirlerini ekleyip mesajlaşma yapabilmelerini sağlar. Ancak bu sistemde, kullanıcı adı gibi girdiler doğrudan SQL sorgusuna aktarılırsa, SQL injection saldırılarına açık hale gelir. Bu durumda, kullanıcı adı alanına özel karakterler veya SQL komutları girilerek sistem sorgulanabilir.
Örneğin, kullanıcı adı olarak ' OR 1=1-- gibi bir ifade girildiğinde, tüm kullanıcılar listelenebilir. Bu tür saldırıları önlemek için C++ tarafında kullanıcı girdileri mutlaka filtrelenmelidir. std::string türünde gelen veriler öncelikle escape edilmeli ve sorguya gönderilmeden önce kontrol edilmelidir.
Fısıltı Sistemi ve SQL Injection
Fısıltı (whisper) sistemi, oyuncuların özel mesajlaşmalarını sağlar. Bu sistemde de kullanıcı adı ve mesaj içerikleri SQL sorgularına aktarılır. Eğer bu veriler filtrelenmeden kullanılırsa, saldırganlar veritabanındaki diğer kullanıcıların mesajlarını görüntüleyebilir veya silinebilir.
Bu tür açıkları kapatmak için mesaj içeriklerinde özel karakterler temizlenmelidir. Örneğin, backslash veya tırnak işaretleri gibi karakterler kaldırılmalı ya da uygun escaping fonksiyonları ile işlenmelidir. Ayrıca, mesaj gönderme işlemi öncesinde kullanıcı adı doğrulaması yapılmalıdır.
Lonca Sistemi ve Güvenlik
Loncalar, Metin2 oyununda birlikte oynayan oyuncuların oluşturduğu gruplardır. Lonca adı, liderliği, üyelik işlemleri gibi işlemler veritabanında saklanır. Lonca isimleri gibi alanlarda da SQL injection saldırıları olabilir. Örneğin, bir loncanın ismine özel SQL karakterleri yerleştirilirse, veritabanında istenmeyen değişiklikler yapılabilir.
Lonca sistemlerinde SQL injection'a karşı alınacak en etkili önlem, tüm kullanıcı girdilerinin doğrulanması ve filtrelenmesidir. Kullanıcı girdileri doğrudan SQL sorgusuna gönderilmeden önce prepared statements kullanılmalıdır. Bu sayede, kullanıcı girdisi SQL kodu gibi yorumlanamaz.
C++ Kaynak Kodlarında Uygulanabilecek Önlemler
Metin2 sunucu kaynak kodlarında, özellikle DBCore ve GameCore bölümlerinde SQL injection'a karşı alınabilecek bazı teknikler vardır:
- Girdi doğrulama: Oyuncudan gelen tüm veriler kontrol edilmelidir.
- Prepared Statements: SQL sorguları parametreli olarak oluşturulmalı.
- Escape Fonksiyonları: Girdilerdeki özel karakterler uygun şekilde temizlenmelidir.
- Günlük kayıtları: Şüpheli girişler loglanmalı ve izlenmelidir.
Sonuç
Metin2 özel sunucularında güvenlik, sadece oyun deneyimini değil, aynı zamanda sunucu sahiplerinin verilerini de korur. Arkadaş, fısıltı ve lonca gibi sistemlerde SQL injection açıklarını önlemek için C++ seviyesinde dikkatli kodlama yapılması şarttır. Doğru güvenlik önlemleri ile hem kullanıcı güvenliği sağlanır hem de sunucu daha kararlı çalışır.
Securing Friend, Whisper, and Guild Systems Against SQL Injection in C++
Security is one of the most critical aspects in Metin2 private servers. Especially in systems developed with C++ based server source codes, taking precautions against vulnerabilities like SQL injection is extremely important. In this article, we will thoroughly examine how to prevent SQL injection flaws that may occur in user interaction-based systems such as friendship, whispering, and guilds.
What is SQL Injection?
SQL injection is a security flaw that allows malicious users to access the database directly and steal or alter data. In Metin2 private servers, these vulnerabilities often arise from the auth and game servers written in C++, where user inputs are directly integrated into SQL queries.
Friend System Security
The friend system in Metin2 allows players to add each other and communicate. However, if inputs such as usernames are directly passed to SQL queries without filtering, the system becomes vulnerable to SQL injection attacks. For example, inserting expressions like ' OR 1=1-- into the username field could allow all users to be listed.
To prevent such attacks, user inputs must be filtered on the C++ side. Data received as std::string should first be escaped and validated before being sent to the query.
Whisper System and SQL Injection
The whisper system allows players to send private messages. Here too, usernames and message contents are passed to SQL queries. If these inputs are used without filtering, attackers could view or delete other users' messages.
To prevent such vulnerabilities, special characters in message content should be removed or processed using appropriate escaping functions. Additionally, username validation must be performed before sending a message.
Guild System and Security
Guilds are groups formed by players who play together in Metin2. Information such as guild names, leadership, and membership processes are stored in the database. SQL injection attacks can also occur in fields like guild names. For instance, embedding special SQL characters in a guild name might allow unintended database changes.
To protect against SQL injection in guild systems, all user inputs must be validated and filtered. Before sending user inputs directly to SQL queries, prepared statements should be used. This prevents user input from being interpreted as SQL code.
Preventive Measures in C++ Source Code
In Metin2 server source codes, especially within the DBCore and GameCore sections, there are several technical measures that can be implemented against SQL injection:
- Input validation: All data received from the player must be checked.
- Prepared Statements: SQL queries should be created with parameters.
- Escape Functions: Special characters in inputs should be cleaned appropriately.
- Logging: Suspicious entries should be logged and monitored.
Conclusion
Security in Metin2 private servers protects not only the gameplay experience but also the server owner's data. To prevent SQL injection flaws in systems like friends, whispers, and guilds, careful coding at the C++ level is essential. With proper security measures, both user safety and server stability are ensured.
