mmofacts.com

Komsiches Problem

gepostet vor 18 Jahre, 6 Monate von gollum1990
So habe Kampfscript fertigestellt klappt alles nur mein Problem ist.
Ich gebe in meinen Eingabe Feld den Anzugreifenden Usernamen ein und
wie viele Einheiten ich schicke. Der Kampf läuft alles ohne Fehler nur
nach den Kampf werde ich als den angreifenden User eingeloggt.
So:
Sie sind eingeloggt als gollum1990
[...]
Gebe Username ein: test
Gebe Einheiten ein: 120
Ergebnis:
Gewonnen
Link zurück
_______________________________
Sie sind eingeloggt als test
[...]
Versteht ihr mein Problem, wenn ich den User: test angreife.
Bekomme ich mein Kampfergebnis und werde anschließend als
test eingeloggt warum???
Code Auschnitt:
$einheiten =$_POST['einheiten'];

$username =$_POST['username'];
$gegner = "SELECT `angriffc`, `verteidigungc`, `angriff`, `verteidigung`, `anzahl` FROM `login` WHERE `username` = '".$username."'";
$gegner2 = mysql_query($gegner, $verbindung) or die (mysql_error());
while($gegner3 = mysql_fetch_array($gegner2))
{
$du = "SELECT `angriffc`, `verteidigungc`, `angriff`, `verteidigung`, `anzahl` FROM `login` WHERE `username` = '".$usernamen."'";
$du2 = mysql_query($du, $verbindung) or die (mysql_error());
$du3 = mysql_fetch_array($du);
$deincharacterangriff = $du3['angriffc'] * $du3['verteidigugn'];
$gegnercharacterverteidigung = $gegner3['angriffc'] * $gegner3['verteidigung'];
$deineeinheitenangriff = $du3['angriff'] * $du3['verteidigung'] * $du3['anzahl'];
$gegnereinheitenverteidigung = $gegner3['angriff'] * $gegner['verteidigung'] * $gegner['anzahl'];
$deingesamtangriff = $deincharacterangriff + $deineeinheitenangriff;
$gegnergesamtverteidigung = $gegnercharacterverteidigung + $gegnereinheitenverteidigung;
if($deingesamtangriff > $gegnergesamtverteidigung)
{
echo 'Du hast gewonnen.';
flush();
sleep(5);
echo 'Deine Punkte wurden addiert.';
$sql = "UPDATE `login` SET `points` = `points` + 100, `kampfpunkte` = `kampfpunkte` + 1 WHERE `username` =
'".$usernamen."'";
$sql2 = mysql_query($sql, $verbindung) or die (mysql_error());
}
else
{
echo 'Du hast leider Verloren.';
echo '5 Sekunden warten.';
$sql = "UPDATE `login` SET `xp` = `xp` + 100 WHERE `username` = '".$username."'";
$sql2 = mysql_query($sql, $verbindung) or die (mysql_error());
flush();
sleep(5);
echo 'Der Gegner hat 100 Erfahrungspunkte bekommen.';
}
}
Danke für eure Hilfe
LG, gollum1990
gepostet vor 18 Jahre, 6 Monate von Crasher

$username =$_POST['username'];

Ich geh mal davon aus das du in deinem Loginscript auch $username her nimmst. Daher werden die Probleme kommen.
Weiter solltest du die Daten die vom user kommen Prüfen der kann dir sonnst was verkaufen.
gepostet vor 18 Jahre, 6 Monate von gollum1990
Also, eingeloggter User definiere ich mit $usernamem.
Ja klar ich habe da schon meine Überprüfungen^^
gepostet vor 18 Jahre, 6 Monate von gorgo
Original von gollum1990
Also, eingeloggter User definiere ich mit $usernamem.
Ja klar ich habe da schon meine Überprüfungen^^

davon ist da aber nix zu sehen
gepostet vor 18 Jahre, 6 Monate von blum
ich nehme an, du speicherst den benutzer mit $_SESSION['username'] ?
dann nimmt die session-variable den wert von $_POST['username'] an, ergo wirst du als der anzugegreifender spieler eingeloggt.
weiss nicht, ob das nun ein bug in php ist oder $_POST und $_SESSION als ENV-Variable gespeichert werden.
hatte mal das problem, bin fast deppert geworden....
gepostet vor 18 Jahre, 6 Monate von mifritscher
du meinst dass bei ihm register_global an ist?
gepostet vor 18 Jahre, 6 Monate von Störti
Original von blumweiss nicht, ob das nun ein bug in php ist oder $_POST und $_SESSION als ENV-Variable gespeichert werden.

Wenn das der Fall ist, dann ist das aber ein SAU FETTER Sicherheitsbug in PHP, ich denke nicht,d ass das möglich ist, da man ja sonst die Session kinderleicht verändern kann...
Wie identifizierst du denn den User, wenn scheinbar eine einfache Username-Änderung den User schon "umloggt"?
gepostet vor 18 Jahre, 6 Monate von mifritscher
Wenn register_global an ist (ne Einstellung in der php.ini, sieht man u.a. in phpinfo()) werden die session, post, get und einiges anderes global definiert, also dass man statt $_SESSION['username'] $username verwenden kann.
Ist seit php 4.irgendwas standardmäßig deaktiviert, eben weil es schwere Sicherheitslücken hervorrufen kann und zu solchen Mist kommt.
gepostet vor 18 Jahre, 6 Monate von gollum1990
Als ich weiss jetzt nicht was ich machen soll??
gepostet vor 18 Jahre, 6 Monate von Kampfhoernchen
1. In der php.ini das Flag Register_globals auf "false" setzen
2. falls nicht möglich: sieh dir ini_set() an
3. Die Variablen in $_SESSION[] mit einem Prefix (z.B. auth_username, auth_ip usw) versehen, und dann als Variablen $auth nicht woanders verändern, idealerweise aus Sicherheitsgründen das Prefix immer mal ändern, am besten irgendwas völlig kryptisches.
Alternativ wäre natürlich eine eigene Sessionklasse basierend auf mysql-heap-Tabellen.
gepostet vor 18 Jahre, 6 Monate von gollum1990
Also, ich hoste im Internet, ich kann mir die php.ini nicht anschauen gesweige den ändern. Frage was meinst du mit Prefix, hab ich noch nie gehört??
gepostet vor 18 Jahre, 6 Monate von Itchy
Alternativ wäre natürlich eine eigene Sessionklasse basierend auf mysql-heap-Tabellen.

Leicht Offtopic, aber haste dafür ein Beispiel? In HEAP/MEMORY Tabellen sind BLOB bzw. TEXT Spalten nicht erlaubt, wie speichert man da eine Klasse rein - in (viele) VARCHAR(255) Felder aufteilen?
gepostet vor 18 Jahre, 6 Monate von Kampfhoernchen
Gibt dazu genug fertige Lösungen, man bemühe kurz google.
Mit serialisierten Objekten wirds schwierig, wir registrieren grundsätzlich keine Objekte in der Session, sondern nur native Datentypen und Arrays.
gepostet vor 18 Jahre, 6 Monate von Flint
Original von Kampfhoernchen
Gibt dazu genug fertige Lösungen, man bemühe kurz google.
Mit serialisierten Objekten wirds schwierig, wir registrieren grundsätzlich keine Objekte in der Session, sondern nur native Datentypen und Arrays.

Das löst aber das Problem mit den 255 Chars bei Varchar nicht wirklich, den um ein Array zu speichern wird es vermutlich auch serialisiert und es muß anders sichergestellt werden das es 255 Zwichen nicht überschreitet. Ob man nun Arrays oder Objekte hat macht da imho keinen Unterschied.
Für die Verwendung von Sessions mit HEAP Tabellen ist es wohl am besten nur einzelne Variablen zu speichern, was ja auch mit den Eigenschaften eines Objektes möglich ist. Oder man speichert das Array/Objekt als 1:n Beziehung in einer weiteren Tabelle wobei das vieleicht etwas zu "aufwendig" ist.
gepostet vor 18 Jahre, 6 Monate von Itchy
Hab Google bemüht, ohne brauchbare Ergebnisse, die meisten Ergebnisse waren Suchanfragen in irgendwelchen Boards, die nicht beantwortet wurden. Der Rest war so in der Art Sessions in einer Heaptabelle zu verwalten, nicht aber die Daten dort zu speichern.
Ansonsten das was Flint gesagt hat. Selbst ein einfaches Array will ja irgendwie serialisiert werden und 255 Bytes kommen sehr schnell zusammen.
Im Moment schreibe ich das komplette $_SESSION Array serialisiert in eine MySQL MyISAM Tabelle, das geht auch ausreichend schnell im Testbetrieb, allerdings befürchte ich, daß bei viel Betrieb das evtl. ein Flaschenhals werden kann, sind immerhin bis zu 20k Daten, die da bei jeder Aktion geschrieben werden können.
gepostet vor 18 Jahre, 6 Monate von HSINC
in der 5.0.3 wurde varchar auf max 65k zeichen erhoeht. keine ahnung inwiefern das auch mit heap funzt
gepostet vor 18 Jahre, 6 Monate von Itchy
Hmm interessant. Würde sich evtl. dann lohnen von 4.1 auf 5.0 upzugraden.
gepostet vor 18 Jahre, 6 Monate von woodworker
wenn upgrade dann auf 5.1(.4)
und php 4.1 sollte nu wirklich keiner mehr haben - was es da so alles an bugfixes seit 4.1 gibt
gepostet vor 18 Jahre, 6 Monate von Sarge
duuhuu woodi.. die onkel hsinc und tante itchy sprechen da glaub von mysql und nicht php *duck_und_renn*
gepostet vor 18 Jahre, 6 Monate von Itchy
Jo... PHP hab ich 5.1.2 (muß demnächst auf 5.1.4 updaten) drauf, MySQL benutze ich 4.1.18. Ich sprach vom Update auf MySQL 5.0.21.

Auf diese Diskussion antworten