anpera.net https://anpera.dyndns.org/phpbb3/ |
|
battle.php eval() https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=5033 |
Seite 1 von 1 |
Autor: | Welv [ Fr 20 Nov, 2009 18:25 ] |
Betreff des Beitrags: | battle.php eval() |
Hi Eval ist nicht so mein Fall und ich würde gerne wissen was es zb hier in der battle.php genau bezweckt PHP: if(isset($buff['minbadguydamage'])){
$buff['minbadguydamage'] = stripslashes($buff['minbadguydamage']); eval("\$buff['minbadguydamage'] = $buff[minbadguydamage];"); } |
Autor: | Kevz [ Fr 20 Nov, 2009 18:42 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Siehe die Beschreibung von Eval. Dann hast Du auch deine Antwort! :-) |
Autor: | Eliwood [ Fr 20 Nov, 2009 18:56 ] |
Betreff des Beitrags: | Re: battle.php eval() |
So die das aussieht stammt das aus der "neuen" Version - nur diese Verwendet eval - dann fehlt aber die Ersetzung der Text-Variablen. Ist es selbstgebaut, dann hast du ein Problem: Jeder, der Zugang zu Adminwerkzeugen hat, die Buffs erstellen können, kann damit das Spiel manipulieren und für minbadguydamage irgendwas einsetzen - zum Beispiel "db_query('UPDATE accounts SET superuser = 3 WHERE acctid = $session[user][acctid]');" - funktioneirt ohne Probleme sowas. |
Autor: | Welv [ Fr 20 Nov, 2009 19:03 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Das stammt aus der letzten originalen battle.php. Ich weiß dass eval strings als php code ausührt, nur würd ich gerne wissen was es im zusammenhang mim $buff array macht. Wann kommt denn da zu ausfürender phpcode rein? Ausser beim editieren ![]() |
Autor: | Eliwood [ Fr 20 Nov, 2009 19:40 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Tatsache. Was es aber dort sucht, kann ich nicht beantworten - ausgenützt wird diese "Funktionalität" nirgendwo. Vielleicht ist es besser, die Stelle einfach zu löschen. Wie bereits erwähnt - sie ist gefährlich. |
Autor: | Welv [ Fr 20 Nov, 2009 19:57 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Das ist der Grund warum ich gefragt hab. Wollt hier eval falls möglich durch etwas anderes ersetzen, aber da es scheinbar eh keinen sinnvollen Zweck erfüllt, werd ich sie wirklich einfach streichen. Schonmal danke dafür. Jetzt ist mir noch eingefallen dass es ja die funktionen createarray sowie createstring gibt. Ist es da nicht sinnvoller mit serialize und unserialize zu arbeiten? |
Autor: | Salator [ Sa 21 Nov, 2009 18:29 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Interessante Sache mit dem eval, auch interessant wie oft das sinnlos durchlaufen wird. Trotzdem würde ich gern wissen ob es nicht doch irgendwo eine Stelle gibt die das nutzt. Deswegen habe ich den Durchlauf von eval davon abhängig gemacht ob die Variable strlen>4 hat und wenn das auftritt schreibe ich einen Log-Eintrag. Code für die DS3, das wird sich vermutlich so nicht auf andere Versionen übernehmen lassen $this->bbcode_second_pass_code('', ' $who = -1; if (isset($buff['maxbadguydamage']) && $buff['maxbadguydamage'] != '') { if (isset($buff['maxbadguydamage']) && strlen($buff['maxbadguydamage']) > 4) { $buff['maxbadguydamage'] = stripslashes($buff['maxbadguydamage']); systemlog('battle.php eval maxbadguydamage: '.$buff['maxbadguydamage']); eval("\$buff['maxbadguydamage'] = $buff[maxbadguydamage];"); } $max = $buff['maxbadguydamage']; if (isset($buff['minbadguydamage']) && strlen($buff['minbadguydamage']) > 4) { $buff['minbadguydamage'] = stripslashes($buff['minbadguydamage']); systemlog('battle.php eval minbadguydamage: '.$buff['minbadguydamage']); eval("\$buff['minbadguydamage'] = $buff[minbadguydamage];"); } $min = $buff['minbadguydamage']; $who = 0; } ') Und createstring/createarray kann man wirklich besser mit serialize/unserialize machen. In der DS-Edition sieht das so aus: $this->bbcode_second_pass_code('', ' /** * Erzeugt String aus Array (eindimensional). Veraltet, serialize() wird empfohlen! * Die Methode ist nur noch aus Kompatibilitätsgründen vorhanden, verwendet intern jedoch serialize() * * @param array $array Eingabe-Array * @return string Ausgabe */ function createstring($array) { if (is_array($array)) { return serialize($array); } return $output; } /** * Erzeugt Array (eindimensional) aus String. Veraltet, unserialize() wird empfohlen! * Die Methode ist nur noch aus Kompatibilitätsgründen vorhanden, verwendet intern jedoch unserialize() * * @param string Eingabe-String * @return array $array Ausgabe */ function createarray($string) { return unserialize($string); } ') Freischalten solltest du die Änderung aber wenn möglichst wenig Spieler online sind. |
Autor: | Welv [ Sa 21 Nov, 2009 23:47 ] |
Betreff des Beitrags: | Re: battle.php eval() |
An der originalen battle werd ich nicht viel ändern, ausser eval zu streichen, sie noticefrei zu machen und createarray etc zu ersetzen. Falls jemand interesse hat, hab ich ne Funktion geschrieben die prüft ob etwas mit serialze bearbeitet wurde. Ein einfaches @ tuts natürlich auch und ist nicht so rechenintensiv, macht aber weniger Spaß ^^ PHP: function logd_is_serialized($in){
#©Welv: anpera.net #Prüft ob ein String mit serialize() serialisiert wurde #Durch RegEx sehr rechenintensiev! if(is_string($in)){ $array="^a:\d+:\{.*(;})$"; # fängt mit a an, :, zahl(en), :, {, beliebige Zeichen, hört mit ;} auf $integer="^i:\d+;$"; # fängt mit i an, :, zahl(en), hört mit ; auf $dezimal="^d:\d+\.\d+;$"; # fängt mit d an, :, zahl(en), ., zahl(en), hört mit ; auf $string="^s:\d+:\".*(\";)$"; # fängt mit s an, :, zahl(en), :, ", beliebige Zeichen, hört mit "; auf $bool="^b:(0|1);$"; # fängt mit b an, 0 oder 1, hört mit ; auf if(preg_match("/(".$array.")|(".$integer.")|(".$dezimal.")|(".$string.")|(".$bool.")/", $in)) return true; else return false; }else return false; } |
Autor: | Salator [ So 22 Nov, 2009 14:05 ] |
Betreff des Beitrags: | Re: battle.php eval() |
So, ich hab auch schon die ersten Treffer für eval. Was ich im Log allerdings vergessen habe, wer es ausgelöst hat und wie der Gegner hieß... Okay, der macht das bestimmt wieder, ich werd den Übeltäter schon finden ![]() 22.11.2009 13:08:29 Fairy battle.php eval minbadguydamage: $session[user][level]*4 22.11.2009 13:08:29 Fairy battle.php eval maxbadguydamage: $session[user][level]*10 22.11.2009 13:08:22 Fairy battle.php eval minbadguydamage: $session[user][level]*3 22.11.2009 13:08:22 Fairy battle.php eval maxbadguydamage: $session[user][level]*8 Edit: Zu dem Zeitpunkt war außer mir nur 1 Spieler online, das schränkt die Suche doch schonmal ein: 22.11.2009 13:08:30 (USER) Accountsuche 14 Zusatzpunkte für eine perfekte Heldentat 22.11.2009 13:08:29 (USER) Accountsuche DK: Erhält 14 Punkte. Davor: 1079 Danach: 1093 Edit2: Habe den Auslöser gefunden. Erst hatte ich die Spezialfähigkeit (im konkreten Fall "Nahkampf") in Verdacht, hier wird die Buff-Stärke aber schon vorher ausgerechnet (zumindest in der DS3) Anders sieht es bei Buffs aus dem Zauberladen aus. Blitzschlag/Feuerball/Golem haben genau die obigen Werte drin, Funkenregen geht von $badguy[creaturehealth] aus. Okay, die ersten drei könnte man vermutlich fest für Level 15 angeben ohne dass sich für den Spielverlauf großartig was ändert. Beim Funkenregen weiß ich aber nicht was man da nehmen könnte. Noch besser wäre es natürlich wenn jemand ne Idee hat wie man die Buffs auch ohne eval flexibel halten kann |
Autor: | Eliwood [ So 22 Nov, 2009 21:40 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Man könnte das eval sichern. Ohne einen eigenen Mathe-Parser zu schreiben bleibt einem nur das übrig. Immernoch besser als eval völlig unreflektiert zu verwenden. Habe das sogar mal gemacht. Gegen ausnützen sicher. |
Autor: | Salator [ Fr 04 Dez, 2009 22:39 ] |
Betreff des Beitrags: | Re: battle.php eval() |
So, ich präsentiere hier mein Ergebnis aus Eliwoods Code. Das Ganze wurde als Funktion ausgelegt und funktioniert nun auch mit dem badguy-Array. Funktionsfähig getestet mit der Dragonslayer-Edition V3, für die 0.9.7 müssen wahrscheinlich die Zeilen mit systemlog deaktiviert oder in debuglog geändert werden. Diesen Block oben bei den Funktionen rein: $this->bbcode_second_pass_code('', ' /* Variables in Buffs | 2005 by Eliwood Format: round(<level>*2/3+1) statt round($session[user][level]*2/3+1) */ //Hilfsfunktion für checked_eval() function getSessionValue($match) { global $session,$badguy,$buff; // evtl. anpassen if(isset($badguy[$match[1]])) return $badguy[$match[1]]; if(isset($session['user'][$match[1]])) return $session['user'][$match[1]]; systemlog ('eval Buff('.$buff['name'].'): $badguy[`$'.$match[1].'`0] oder $session[user][`$'.$match[1].'`0] existiert nicht',$session['user']['acctid']); return 0; //muss numerisch sein, sonst whitescreen (unexpected '[nächstes Zeichen]' in eval'd code) } //Führt eval() nur aus, wenn übergebener String eine Rechenoperation ist function checked_eval($value) { global $session,$buff; $value = preg_replace_callback('/<([A-Z]+)>/i', 'getSessionValue', $value); $search = array('+','-','/','*','(',')',' ','round','.'); $replace = array(''); $value2 = str_replace($search,$replace,$value); if(is_numeric($value2)) { if($value!=$value2) { eval('$value = '.$value.';'); } return round($value); } else { systemlog('eval Buff('.$buff['name'].'): `$'.$value.'`0 ist keine Rechenoperation und wurde nicht ausgeführt',$session['user']['acctid']); return 0; //muss numerisch sein, sonst whitescreen (mt_rand() expects exactly 2 parameters) } } /* END Variables in Buffs | 2005 by Eliwood */ ') Weiter unten müssen dann noch die beiden Aufrufe von eval ersetzt werden. Sinnvollerweise so, dass die Funktion nur bei Bedarf aufgerufen wird, also wenn strlen>4 ist. Und wenn man nichts selber verändert hat muss auch nicht das komplette buff-Array durchlaufen werden, lediglich minbadguydamage und maxbadguydamage können Code enthalten. Der neue Code-Block sieht dann so wie folgt aus. Was vom Original zu ersetzen ist findet ihr hoffentlich selber. $this->bbcode_second_pass_code('', ' $who = -1; if (isset($buff['maxbadguydamage']) && $buff['maxbadguydamage'] != '') { if (isset($buff['maxbadguydamage']) && strlen($buff['maxbadguydamage']) > 4) { $buff['maxbadguydamage'] = stripslashes($buff['maxbadguydamage']); $buff['maxbadguydamage']=checked_eval($buff['maxbadguydamage']); } $max = $buff['maxbadguydamage']; if (isset($buff['minbadguydamage']) && strlen($buff['minbadguydamage']) > 4) { $buff['minbadguydamage'] = stripslashes($buff['minbadguydamage']); $buff['minbadguydamage']=checked_eval($buff['minbadguydamage']); } $min = $buff['minbadguydamage']; $who = 0; } ') |
Autor: | Welv [ Sa 05 Dez, 2009 15:56 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Sieht ja ganz ordentlich aus. Werds mal bei Zeiten testen. |
Autor: | Salator [ Mi 06 Jan, 2010 20:37 ] |
Betreff des Beitrags: | Re: battle.php eval() |
Wer die Änderug einbaut, in der pvparena muss das dann auch gemacht werden. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |