Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!
Buda olabilir name değerini unique yapmissin yani tabanda bundan 1 tane olacak baska olmayacak bunu yapinca evet veritabani ayni ismi birdaha yazmaz fakat oyun içerisinde yinede lonca acildi mesajını verebilir bunu bir test etmek gerekiyor.
Bunu ben yapmadım, Orjinal veritabanı tablolarında bu indexler zaten var yok ise eklemelisiniz çünkü unique olması gereken tablo kolonları var player.player tablosunda name kolonu account.account tablosunda login kolonu bunlar orjinalinde olması gereken indexler 2009 da ilk sızdırılan dosyalardaki veritabanını yüklerseniz onun içerisinde var bu indexler
Bunu ben yapmadım, Orjinal veritabanı tablolarında bu indexler zaten var yok ise eklemelisiniz çünkü unique olması gereken tablo kolonları var player.player tablosunda name kolonu account.account tablosunda login kolonu bunlar orjinalinde olması gereken indexler 2009 da ilk sızdırılan dosyalardaki veritabanını yüklerseniz onun içerisinde var bu indexler
Test ettim fakat bu tam olarak çözüm değil bu seferde şöyle oluyor başka karakter o lonca isminde lonca açıyor oyunda açıldı diyor yang vs. gerekeni alıyor ama guild.name unique olduğu için aynı isimden yazmıyor o loncadan 1 tane oluyor ve oyunda en son kim o isimde lonca açtıysa onu lider yapıyor ve diğer liderleri siliyor. Sanırım en iyi çözüm orjinal kodlarını kullanmak
Ayrıca başarılı bir kodlamacı Ken' den mesaj
You don't have to implement the second fix in your source files because there is no potential SQL Injection for MakeGuild. The system is already checking the alpha characters 1 or 2 time(s).
Son düzenleme:
Sql açığını fixlemek için girdiğiniz kodlar lonca buguna sebep olmaktadır bug aynı lonca isminden herkes açabilir bunu fixlemek için lonca kodunu hiç değiştirmenize gerek yok orjinalini kullanın sql açığı sadece messenger de mevcuttu loncada yok
guild_manager.cpp içerisinde kod satırını orjinal ile değiştirin.
Kod:DWORD CGuildManager::CreateGuild(TGuildCreateParameter& gcp) { if (!gcp.master) return 0; if (!check_name(gcp.name)) { gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> 길ë ì´ë¦ì´ ì í©íì§ ììµëë¤.")); return 0; } std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'", get_table_postfix(), gcp.name)); if (pmsg->Get()->uiNumRows > 0) { MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult); if (!(row[0] && row[0][0] == '0')) { gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> ì´ë¯¸ ê°ì ì´ë¦ì 길ëê° ììµëë¤.")); return 0; } } else { gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> 길ë를 ìì±í ì ììµëë¤.")); return 0; } // new CGuild(gcp) queries guild tables and tell dbcache to notice other game servers. // other game server calls CGuildManager::LoadGuild to load guild. CGuild * pg = M2_NEW CGuild(gcp); m_mapGuild.insert(std::make_pair(pg->GetID(), pg)); return pg->GetID(); }
Bugtan ss
![]()
Ben şimdi fixlemiştim SQL Açıgını tekrar hangi eski dosyayı atayım ?
en saglam çözüm budur
______________________________________
DWORD CGuildManager::CreateGuild(TGuildCreateParameter& gcp)
{
if (!gcp.master)
return 0;
if (!check_name(gcp.name))
{
gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> 길ë ì´ë¦ì´ ì í©íì§ ììµëë¤."));
return 0;
}
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));
std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'",
get_table_postfix(), __escape_name));
if (pmsg->Get()->uiNumRows > 0)
{
MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);
if (!(row[0] && row[0][0] == '0'))
{
gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> ì´ë¯¸ ê°ì ì´ë¦ì 길ëê° ììµëë¤."));
return 0;
}
}
else
{
gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> 길ë를 ìì±í ì ììµëë¤."));
return 0;
}
// new CGuild(gcp) queries guild tables and tell dbcache to notice other game servers.
// other game server calls CGuildManager::LoadGuild to load guild.
CGuild * pg = M2_NEW CGuild(gcp);
m_mapGuild.insert(std::make_pair(pg->GetID(), pg));
return pg->GetID();
}
______________________________________
DWORD CGuildManager::CreateGuild(TGuildCreateParameter& gcp)
{
if (!gcp.master)
return 0;
if (!check_name(gcp.name))
{
gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> 길ë ì´ë¦ì´ ì í©íì§ ììµëë¤."));
return 0;
}
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));
std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'",
get_table_postfix(), __escape_name));
if (pmsg->Get()->uiNumRows > 0)
{
MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);
if (!(row[0] && row[0][0] == '0'))
{
gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> ì´ë¯¸ ê°ì ì´ë¦ì 길ëê° ììµëë¤."));
return 0;
}
}
else
{
gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ë> 길ë를 ìì±í ì ììµëë¤."));
return 0;
}
// new CGuild(gcp) queries guild tables and tell dbcache to notice other game servers.
// other game server calls CGuildManager::LoadGuild to load guild.
CGuild * pg = M2_NEW CGuild(gcp);
m_mapGuild.insert(std::make_pair(pg->GetID(), pg));
return pg->GetID();
}
Ben şimdi fixlemiştim SQL Açıgını tekrar hangi eski dosyayı atayım ?
fixlerken 2 dosya üzerinde oynama yapmıştın messenger kalsın açık messengerde idi guild de sorun yok o yüzden guild_manager içerisinde kod bloğunu eski haline getir bunda açık yok zaten eski haline getirmezsen oyunda lonca bugu oluşur
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 37
- Görüntüleme
- 2K
- Cevaplar
- 8
- Görüntüleme
- 2K
- Cevaplar
- 8
- Görüntüleme
- 2K