anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mo 09 Jun, 2025 14:56

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: battle.php eval()
BeitragVerfasst: Fr 20 Nov, 2009 18:25 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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];");
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Fr 20 Nov, 2009 18:42 
Offline
Freak
Freak

Registriert: Mo 06 Sep, 2004 15:17
Beiträge: 3236
Geschlecht: Männlich
Siehe die Beschreibung von Eval. Dann hast Du auch deine Antwort! :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Fr 20 Nov, 2009 18:56 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Fr 20 Nov, 2009 19:03 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Fr 20 Nov, 2009 19:40 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Fr 20 Nov, 2009 19:57 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Sa 21 Nov, 2009 18:29 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 02 Feb, 2009 21:11
Beiträge: 168
Geschlecht: Männlich
LoGD: salator.selfhost.de/lotgd
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.

_________________
if(date("ymmd")=="10050502") echo("Der alte Sack wird heute 40");


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Sa 21 Nov, 2009 23:47 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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;
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: So 22 Nov, 2009 14:05 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 02 Feb, 2009 21:11
Beiträge: 168
Geschlecht: Männlich
LoGD: salator.selfhost.de/lotgd
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

_________________
if(date("ymmd")=="10050502") echo("Der alte Sack wird heute 40");


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: So 22 Nov, 2009 21:40 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Fr 04 Dez, 2009 22:39 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 02 Feb, 2009 21:11
Beiträge: 168
Geschlecht: Männlich
LoGD: salator.selfhost.de/lotgd
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;
}
')

_________________
if(date("ymmd")=="10050502") echo("Der alte Sack wird heute 40");


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Sa 05 Dez, 2009 15:56 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Sieht ja ganz ordentlich aus. Werds mal bei Zeiten testen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: battle.php eval()
BeitragVerfasst: Mi 06 Jan, 2010 20:37 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 02 Feb, 2009 21:11
Beiträge: 168
Geschlecht: Männlich
LoGD: salator.selfhost.de/lotgd
Wer die Änderug einbaut, in der pvparena muss das dann auch gemacht werden.

_________________
if(date("ymmd")=="10050502") echo("Der alte Sack wird heute 40");


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum