Guten Tag allesammt, ich sitze jetzt schon seit längerem an einem Problem fest und habe mich nun dazu entschlossen euch um Hilfe zu fragen. Ich programmiere an einer Multiaccount Klasse für mein Browsergame, die anhand einer log Tabelle Spieler mit der selben IP in eine Tabelle (multiaccount) einträgt. Sollten binnend 30 Tagen zu viele Einträge des Users in der Tabelle sein (Besser gesagt, zu viele Tage mit geteilter IP zwischen mehreren Spielern) wird der Administrator benachrichtigt.
--
-- Tabelle: log
--
CREATE TABLE IF NOT EXISTS `log` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` varchar(75) NOT NULL DEFAULT '',
`action` varchar(100) NOT NULL DEFAULT '',
`detail` text,
`time` bigint,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;
--
-- Tabelle: Multiaccount
--
CREATE TABLE IF NOT EXISTS `multiaccount` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` varchar(75) NOT NULL DEFAULT '',
`log_ids` text,
`reason` text,
`time` bigint,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;
An sich sucht die Klasse alle Einträge raus, die die gleiche IP besitzen wie der User (User A), dann werden die betroffenen log_ids in der Tabelle multiaccount eingetragen (um mehrfache Einträge zu verhindern), des Weiteren kann so ein 3 Spieler (User C) mit der gleichen IP erfasst werden, ohne dass die anderen 2 Spieler (User A & B) (die bereits einen Eintrag besitzen) einen Eintrag bekommen.
Das Problem liegt dabei, dass wenn der User A sich ein zweites mal einloggt, ein neuer Eintrag in der log Tabelle hinzugefügt wird und so ein neuer Eintrag in der "multiaccount" Tabelle getätigt wird, obwohl besagter User A bereits mit User B einen Eintrag in der multiaccount Tabelle besitzen. Da dies relativ schwierig zu erklären ist, hier einfach ein gekürzter/vereinfachter Ausschnitt meiner Klasse:
<?php
$this->user_ids[] = $user_id;//Eigene user id
$time_older = $time-2592000;
$qry_log = mysql_query("SELECT * FROM log WHERE action = 'IP'
AND detail = '".$_SERVER['REMOTE_ADDR']."' AND time >= '".$time_older."'
AND user_id != '".$user_id."'");
if(mysql_num_rows($qry_log) != 0){
while($row_log = mysql_fetch_assoc($qry_log)){
$time_login = $row_log["time"];
$this->user_ids[] = $row_log["user_id"];//Die user_id des Anderen
$this->id_log_array[] = $row_log["id"];
}
//Eigene logs
$qry_log_own = mysql_query("SELECT id FROM log WHERE action = 'IP'
AND detail = '".$_SERVER['REMOTE_ADDR']."' AND time >= '".$time_older."'
AND user_id = '".$user_id."'");
while($row_own_log = mysql_fetch_assoc($qry_log_own)){
$this->id_log_array[] = $row_own_log["id"];
}
$this->id_log_array = array_unique($this->id_log_array);
$this->user_ids = array_unique($this->user_ids);
for($i=0; $i < count($this->user_ids); $i++){
$array_log_ids_usr = array();//Leeren array für jeden user
$array_multi_usr = array();
$list_log_ids_multi = "";
$user_id_multi = $this->user_ids[$i];
$ids_for_qry = join(',',$this->id_log_array); //Alle auffälligen log ids
$qry_usr_multi_log = mysql_query("SELECT id FROM log WHERE id IN ($ids_for_qry) AND action = 'IP'
AND detail = '".$_SERVER['REMOTE_ADDR']."' AND time >= '".$time_older."'
AND user_id = '".$user_id_multi."'");
while($row_log_multi = mysql_fetch_assoc($qry_usr_multi_log)){
//Alle log Ids des spezifischen Benutzers:
$array_log_ids_usr[] = $row_log_multi["id"];
}
//Bereits benutzte ids:
$check_if_multi = mysql_query("SELECT log_ids FROM multiaccount WHERE user_id = '".$user_id_multi."'
AND time >= '".$time_older."'");
while($row = mysql_fetch_assoc($check_if_multi)){
$list_log_ids_multi = $row["log_ids"].",".$list_log_ids_multi;
}
$array_multi_usr = explode(",",$list_log_ids_multi);
$array_multi_usr = array_unique($array_multi_usr);
if(count(array_intersect($array_multi_usr, $array_log_ids_usr)) != count($array_log_ids_usr)){
//Wenn es noch nicht benutzte ids gibt, dem user einen Eintrag verpassen
/*Problem: Wenn User A sich mit der IP X einloggt und der User B tut dies auch werden die beiden log ids in die multiaccount
Tabelle eingefügt. Soweit so gut, wenn sich User A jedoch nochmal einloggt, dann wird noch ein Eintrag getätigt, da es eine neue log_id des Users A gibt */
mysql_query("INSERT INTO multiaccount (user_id, log_ids, reason, time)
VALUES ('".$this->user_ids[$i]."', '".implode(',',$this->id_log_array)."', 'IP', '".$time."')");
}
}
}
?>
paar kleine sachen:
1. mysql gibts ab 5.5 net mehr, wieso nutzt du noch den scheiß
2. der aufbau is total scheiße, mach fuer jede tabelle eine klasse um den code von sql zutrennen, dem service sollte es vollkommen egal sein von wo die daten kommen.
3. dir is bewusst das paar leute dynamische ips haben, die sich jeden tag aendern oder? brauchst wenn eine like suche und viellleicht einen cookie fuer multi accounts
4. schon ma an proxys gedacht? da bringt dir die aktuelle ip abfrage 0.
mal paar kleine sachen die du ueber denken solltest
Erstmal danke für deine Anregungen hinsichtlich dem code. Das mit dynamischen IPs & Proxys ist mir wohl bewusst, ich habe ja auch nichts davon gesagt, dass die IP abzugleichen die einzige Maßname sei. Auch wenn das mit der IP leicht zu umgehen ist halte ich es dennoch für ein wichtiges Teil einer solchen Klasse. Denn Multiaccounts wird es immer in solchen Spielen geben, man kann lediglich versuchen Multiaccounts das Leben schwieriger zu machen. (Ja ich bin mir bewusst, dass dann nicht nur Multiaccounts davon betroffen sind sondern auch normale Spieler, ich denke jedoch auch dass man hier Kompromisse eingehen muss um im großen Ganzen ein faires Spiel zu ermöglichen)
Ich wäre natürlich weiterhin dankbar einen Lösungsansatz, denn auch wenn ich mich nun vom mysql_* trenne, bleibt mein Problem jedoch weiterhin bestehen.
Whats App Standort ermitteln? 03/15/2014 - Off Topic - 14 Replies Wenn jemand ein Bild schießt dann speichern sich da ja GPS Daten ein. Und wenn mir jemand das Bild in Whats App schickt, kann ich dann durch Programme ermitteln wo das Bild geschossen wurde? Wenn ja wie heißen diese?
[VB.NET].NET Assembly ermitteln 05/13/2013 - .NET Languages - 2 Replies Ich wollte mich einmal erkundigen, ob es eine Möglichkeit gibt zu ermitteln, ob es sich bei einer angewählten Datei um ein .NET Assembly handelt?
Ich erkundige mich gerade über Reflection, doch bin bis jetzt noch nicht fündig geworden.
Vielleicht weiß einer von euch einen Ansatz?
Grüße
coladose
Server IP ermitteln 03/10/2012 - Last Chaos - 5 Replies Hi, wie komme ich denn an die IP eines LC-Servers ?
THX
[C++] Betriebssystem ermitteln 11/11/2011 - Coding Tutorials - 6 Replies Im Grunde ist das Ganze nicht schwer zu realisieren. Zuerst enumerieren wir für uns valide OS systeme durch:
enum
{
WIN_2000 = 0, WIN_XP, WIN_VISTA, WIN_7
};
Es sollte klar sein, was hier passiert: WIN_2000 ist nun als 0 definiert, Win_XP als 1, WIN_VISTA als 2 und WIN_7 als 3.
Homepages ermitteln!!! 03/11/2009 - Off Topic - 13 Replies Hi leute
hab ne nette seite gefunden, die den preis von websiten ermitellt!
Und elitepvpers ist sage und schreibe:
$358400.8 USD Wert !! ohne scheiß!