Zur Boardunity Forenstartseite
  #1  
Alt 08.03.2004, 05:33
Mitglied
 
Registriert seit: 03.2004
Beiträge: 40

eval oder doch evil ?


Ich bin grade wie viele andere auch in der Entwicklung der perfekten Boardsoftware. Meine Software legt vor allem Wert auf Performance und Geschwindigkeit. Daher habe ich mich auch dazu entschlossen, keine Templateklasse, sondern die eval() Funktion für die Ausgabe zu benutzen.

Das Template wird zuerst eingeladen, in Blöcke geteilt, in den einzelnen Blöcken werden dann die Variabeln ersetzt und am Ende jeden Scriptes alle templates und Variabeln gekillt, die in folgenden Scripte nicht mehr benötigt werden. Der Vorteil liegt schlicht und ergreifend darin, dass ich jedes Template nur einmal "anfassen" muss, aber gleichzeitig auch die Anzahl der Templates übersichtlich bleibt.

Die Performance lässt jedes mir bekannte Board im Regen stehen. 10.000 Zugriffe von Apachebench werden in ca. 160 Sekunden abgearbeitet ohne, dass das Board merkbar langsamer wird. Die Seitengenerierung auf den anderen Seiten liegen bei 50 simulaten Zugriffen durch AB immer noch bei 0.004 (Memberlist mit 50 Membern) und 0.019 Sekunden (viewtopic mit 15 Posts) - und das bei einem Funktionsumfang, der dem vBulletin doch sehr nahe kommt (der Kalender fehlt noch). An sich bin ich also sehr zufrieden.

Auf der Suche nach Informationen bin ich immer wieder auf so Sätze gestossen, wie "eval ist unsicher" oder "eval ist eine große Quelle für Sicherheitslöcher" usw.

Nun zu meinen Fragen:
1. Inwiefern ist eval unsicher?
Da ich auf Sicherheit sehr viel Wert lege, werden bei absenden eines Formulars immer die referer überprüft. Das Script ist so geschrieben, dass Register Globals off sein kann und Report E_ALL liefert auf keiner Seite einen Fehler. Reicht dass, um sich sicher zu fühlen oder hab ich noch was vergessen?

2. Wonach muss ich überhaupt suchen?
Regelmässig tauchen ja z. B. beim PHPBB2 Bugfixes auf, wo meistens was von "gefährlich" beisteht. Wie teste ich also am besten meine Software auf Fehler bzw. auf Sicherheitslücken?

Alles, was ich bei google und auch hier im Board gefunden hab, war alles nicht der "wahre Jakob", also hoffe ich mal, dass ein paar Macher mir etwas auf die Sprünge helfen können.
  #2  
Alt 08.03.2004, 10:25
Mitglied
 
Registriert seit: 10.2003
Ort: Bottrop
Beiträge: 779
Hi. Erstmal wüsste ich gern, ob du die Software hinterher auch veröffentlichst, und wenn ja, welches Lizenzmodell du dir vorgestellt hast (wäre nämlich von deiner Beschreibung her ausgesprochen interessiert... ").

Bin leider auch nicht so der Sicherheitsprofi, aber die größte Sicherheitslücke, die ich bei eval sehe ist folgende:
Wenn der User eine Eingabe ausführen kann (per Formular, URL, o.ä.) und du die Eingabe in dein eval mit einbindest.
Spontan fällt mir nichts ein, wo das sinnvoll / möglich wäre... trotzdem ein Beispiel, dass mit einem einfachen addslashes ausgehebelt werden könnte...:
PHP-Code:
<?php
 $var 
$_POST['var'];
 eval(
'$index = "'.$tpl->get('index').'"');
 
?>
Würde diese Variabe $var nun im Template verwendet könnte folgender Inhalt Probleme bereiten:
Code:
".(($db->query('DELETE FROM tabelle')) ? 'Alles gelöscht' : 'nix gelöscht...')."
Na ja... schlechtes Beispiel und ich weiß noch nichtmal, ob`s so klappen würde...

Jedenfalls ist eval immer dann gefährlich, wenn Besucher die Möglichkeit haben ihren eigenen Code einzuschleusen.
Wie gesagt... htmlentities & addslashes sollten da zur Absicherung ausreichen.

Alle angaben ohne Gewähr... "

Die Sicherheitsfehler beim phpBB2 waren teilweise XSS-Möglichkeiten. Dazu gibts hier irgendwo schon ein Thema. Bevor ich das gelesen hab wusste ich ehrlich gesagt auch nicht, was das sein soll... (und trotzdem konnte ich keine derartigen Lücken in meinen Sachen finden. )

Na ja... hoffe dir irgendwie geholfen zu haben... "

__________________
Patrick Gotthardt
Patrick Gotthardt on Software
  #3  
Alt 08.03.2004, 13:20
Benutzerbild von Michael Przybyla
Mitglied
 
Registriert seit: 02.2003
Beiträge: 184
Zitat:
Ich bin grade wie viele andere auch in der Entwicklung der perfekten Boardsoftware.


Zitat:
Meine Software legt vor allem Wert auf Performance und Geschwindigkeit. Daher habe ich mich auch dazu entschlossen, keine Templateklasse, sondern die eval() Funktion für die Ausgabe zu benutzen.
Dein erster Satz passt hier nicht so recht rein.
Denn durch die Benutzung von eval() wird das ganze nicht schneller - eher langsamer.

Zitat:
Das Template wird zuerst eingeladen, in Blöcke geteilt, in den einzelnen Blöcken werden dann die Variabeln ersetzt und am Ende jeden Scriptes alle templates und Variabeln gekillt, die in folgenden Scripte nicht mehr benötigt werden. Der Vorteil liegt schlicht und ergreifend darin, dass ich jedes Template nur einmal "anfassen" muss, aber gleichzeitig auch die Anzahl der Templates übersichtlich bleibt.
Muss ja wirklich schnell sein.
Schon mal drüber nachgedacht das ganze einmal per Script machen zulassen und dies dann zu cachen?

Zitat:
Die Performance lässt jedes mir bekannte Board im Regen stehen.
Hast du auch alle Test auf einem Server durchgeführt, mit den gleichen Einstellungen ect. ?
Und wenn ich ein paar Funktion in Board X ausbaue die ziemlich zeitraubend sind, dann ist klar, dass das ganze schneller ist.

Zitat:
Wenn der User eine Eingabe ausführen kann (per Formular, URL, o.ä.) und du die Eingabe in dein eval mit einbindest.
Deshalb prüft man auch alle Variablen und behandelt sie evt. mit addslashes(), stripslashes(), htmlspecialchars, mysql_real_escape_string usw.

Zitat:
Na ja... schlechtes Beispiel und ich weiß noch nichtmal, ob`s so klappen würde...
Stimmt. Denn dieses gibt "Alles gelöscht" aus wenn der Query erfolgreich war, bzw. "nix gelöscht" wenn nicht.

  #4  
Alt 08.03.2004, 15:00
Zeitdenken Team
 
Registriert seit: 12.2003
Beiträge: 41
Es gibt übrigens schon Template-Klassen, die genau auf dem eval() Prinzip basieren. Aber diese sind mit Sicherheit nicht schneller als andere Template Klassen und aufgrund der zusätzlichen Sicherheitschecks die man machen müsste eher langsamer...

Bei einem Forum beeinflusst das Template-System die performance bei weitem nicht so sehr wie die Gestaltung und Umfang der Datenbankabfragen - Dieses ist m.E. der Flaschenhals der meisten Forensysteme...

  #5  
Alt 08.03.2004, 16:12
Mitglied
 
Registriert seit: 03.2004
Beiträge: 40
Erstmal Danke für die ganzen Antworten.

Die Geschwindigkeit kommt auch nicht allein durch die Templates, sondern zu einem großem Teil durch verschiedene Cachingmechanismen. Viele Daten, die sich selten bis fast nie ändern, wie die Boardkonfiguration, der Empfang von Nachrichten, Boardstats (wie viele User maximal online am usw.), Ranks, eigene Userdaten usw. werden immer wieder in Textdateien zwischengespeichert, bei Aufruf included und nur bei Änderungen neu geladen. Dadurch spar ich mir ne ganze Menge Datenbankabfragen.

Meine Indexseite hat je nach Level (also Moderator, Admin oder Gast) noch zwischen 4 und 7 Datenbankabfragen. Da sind aber auch schon Funktionen wie "Wie viele User lesen in welchem Forum" und "Gelesene Topics in der Datenbank" schon mit drin.

Im Vergleich dazu hat z. B. das phpBB+ schon 88. Einige Daten hab ich in verschiedenen Tabellen doppelt gespeichert. Das erhöht zwar geringfügig den Speicherbedarf, aber brauch ich nicht für einen Wert eine 2. Tabelle mit einzubeziehen.

Insgesamt hab ich also schon mehr gemacht als nur die eval Funktion. Vergleichsweise hab ich das punBB und das phpBB installiert. Und das punBB ist trotz weniger Features und ohne Templates nur 20 % schneller. Das phpBB ist 10 mal langsamer und das phpBB+ ist ausser Konkurrenz, weil der Server bei nem AB Test innerhalb weniger Sekunden abkackt. Testserver ist ein P4 2 Ghz, 512 MB Ram mit installiertem Turck MMCache. Die 3 Boards sind alle in der Standardversion installiert, also ohn Änderungen an der Konfiguration oder an den Scripten.

Wenn ich das richtig verstanden habe, entspricht ja eval in ungefähr dem echo Befehl, mit dem Unterschied, dass PHP Variabeln direkt ausgegeben werden können. Demnach sollte also die Performance relativ gut sein. Dazu muss ich sagen, dass ich pro Datei nur 1 - 4 mal den eval Befehl verwende. Jedes Template wird nur einmal geladen, in ein Array gepresst und dann pro Block einmal mit Variabeln ausgefüllt.

Wenn ich diese Templates jetzt cache steht ja in den Templates statt dem Platzhalter <? echo $variable ?> großartig mehr ändert sich ja nicht.

Also ob ich jetzt schreibe echo (bei mir halt eval) "alles" oder echo $irgendwas und dann echo $nochwas usw. sollte doch für die Leistungsfähigkeit der Templates keine Rolle spielen. Wenn ich da jetzt was falsch verstanden hab, verbessert micht.

  #6  
Alt 08.03.2004, 17:52
Benutzerbild von DaddyCool
Platzanweiser
 
Registriert seit: 10.2003
Ort: Niedersachsen
Beiträge: 306
Zitat:
Zitat von Oliver
Die Geschwindigkeit kommt auch nicht allein durch die Templates, sondern zu einem großem Teil durch verschiedene Cachingmechanismen. Viele Daten, die sich selten bis fast nie ändern, wie die Boardkonfiguration, der Empfang von Nachrichten, Boardstats (wie viele User maximal online am usw.), Ranks, eigene Userdaten usw. werden immer wieder in Textdateien zwischengespeichert, bei Aufruf included und nur bei Änderungen neu geladen. Dadurch spar ich mir ne ganze Menge Datenbankabfragen.
Mit Dateien wäre ich persönlich sparsam.
Je mehr Dateien -> desto mehr Zugriffe auf die Festplatte

Ich bevorzuge eher die Methode gewisse Daten serialisiert in der DB abzulegen und alles in einem Rutsch in einem Query abzurufen.
Die Konfiguration selbst, landet aber in einer eigenen Datei.

Genauso wie meine vorbereiteten Templates. Diese werden als fertiger PHP Code zwischengespeichert und nur bei Änderung aktualisiert. So kann ich if-else Konstrukte, eingebettete Templates usw. performant realisieren. In diesem fall nutze ich als die gleiche Methode wie ciruZ und das in einigen Projekten sehr erfolgreich.

Zitat:
Meine Indexseite hat je nach Level (also Moderator, Admin oder Gast) noch zwischen 4 und 7 Datenbankabfragen. Da sind aber auch schon Funktionen wie "Wie viele User lesen in welchem Forum" und "Gelesene Topics in der Datenbank" schon mit drin.
Durchweg 6 Querys, egal welchen Status der User hat.

Aktuelle Version -> http://felovia.crazy-board.de/

Zitat:
Im Vergleich dazu hat z. B. das phpBB+ schon 88. Einige Daten hab ich in verschiedenen Tabellen doppelt gespeichert. Das erhöht zwar geringfügig den Speicherbedarf, aber brauch ich nicht für einen Wert eine 2. Tabelle mit einzubeziehen.
Mache ich ähnlich.

Zitat:
Insgesamt hab ich also schon mehr gemacht als nur die eval Funktion. Vergleichsweise hab ich das punBB und das phpBB installiert. Und das punBB ist trotz weniger Features und ohne Templates nur 20 % schneller. Das phpBB ist 10 mal langsamer und das phpBB+ ist ausser Konkurrenz, weil der Server bei nem AB Test innerhalb weniger Sekunden abkackt. Testserver ist ein P4 2 Ghz, 512 MB Ram mit installiertem Turck MMCache. Die 3 Boards sind alle in der Standardversion installiert, also ohn Änderungen an der Konfiguration oder an den Scripten.
Teste lieber auf einem Server der im produktiv Einsatz ist, d.h. wo auch mehrere Scripte und Kunden nebeneinander laufen. Dort sieht man erst richtig wie schnell ein Script ist, alles andere wäre nicht representabel, da man die Konfig des Servers dann so anpassen könnte das die eigene Software schneller läuft.

Solltest du auf einem Server testen, auf dem mehrere Kunden liegen, vergiss meine Aussage.

Darüber hinaus zeigt sich die Qualität eines Boardes erst wenn eine gewisse Anzahl an Datensätzen in den wichtigsten Tabellen vorhanden ist, der PHP code kann noch so gut sein, aber wenn dir ein misslungenes Tabellen Schema alles kaputt macht ist es ärgerlich.
Zitat:
Wenn ich das richtig verstanden habe, entspricht ja eval in ungefähr dem echo Befehl, mit dem Unterschied, dass PHP Variabeln direkt ausgegeben werden können. Demnach sollte also die Performance relativ gut sein.
Bitte zutreffendes ankreuzen

[ ] du hast dir das PHP Manual angesehen
[ ] du hast dir die Beschreibung von eval() dort angesehen
[ ] du hast dir die Beschreibung von echo() dort angesehen

Zitat:
Dazu muss ich sagen, dass ich pro Datei nur 1 - 4 mal den eval Befehl verwende. Jedes Template wird nur einmal geladen, in ein Array gepresst und dann pro Block einmal mit Variabeln ausgefüllt.
0 eval() bei mir.

Zitat:
Wenn ich diese Templates jetzt cache steht ja in den Templates statt dem Platzhalter <? echo $variable ?> großartig mehr ändert sich ja nicht.
negativ. PHP Scripte werden bei der Ausführung in maschinenlesbaren Code umgewandelt, der dann ne zeitlang im Arbeitsspeicher des Servers bleibt. Dieses Verhalten bringt grad bei großen Foren etwas, da der PHP Code dann nicht immer erst umgewandelt werden muss, sondern in fertiger Form aus dem Arbeitsspeicher kommt. PHP Code der mit eval ausgeführt wird, wird dort nicht zwischengespeichert, d.h. für jeden Aufruf von eval() wird der PHP Parser angeschmissen.

Zitat:
Also ob ich jetzt schreibe echo (bei mir halt eval) "alles" oder echo $irgendwas und dann echo $nochwas usw. sollte doch für die Leistungsfähigkeit der Templates keine Rolle spielen. Wenn ich da jetzt was falsch verstanden hab, verbessert micht.
grad passiert, und ich hoffe du überlegst dir ob du weiterhin eval() einsetzen willst.

__________________
Fabian Martin
Fabian Martin

Blog | Twitter | XING
  #7  
Alt 09.03.2004, 01:01
Mitglied
 
Registriert seit: 09.2003
Beiträge: 29
Beitrag gelöscht.


Geändert von printf (15.02.2008 um 14:01 Uhr).
  #8  
Alt 09.03.2004, 12:25
Benutzerbild von Acyd Burn
phpBB Lead Developer
 
Registriert seit: 09.2003
Ort: Oldenburg
Beiträge: 106
Ich möchte hier nicht meine Gedanken zu dem Thema äußern, aber zumindest darauf hinweisen, daß die Skalierbarkeit von Foren heutzutage eine große Rolle spielt. Um eine hohe Skalierbarkeit zu erreichen ist es manchmal notwendig (oder unausweichlich), daß bei "sehr" geringen Userzahlen/Beiträgen usw. es wirklich länger dauert...

Die meisten Foreninstallationen sind ja im mittleren Bereich anzusiedeln, dann gibt es noch die richtig großen Foren. Foren mit nur 10 usern und einem Beitrag pro Monat haben wohl die wenigsten.

Außerdem frage ich mich was das phpBB+ in deiner Untersuchung zu suchen hat... das hat doch nichts mehr mit Performance zu tun.

Ich hoffe das dein "Projekt" nicht in der Versenkung verschwindet, klingt interessant (wenn man deinen Aussagen trauen darf).

__________________
Meik Sievertsen
phpBB Development Team Leader
phpBB3 Development | phpBB / Projekte: mobilfunk-guenstiger | stromtarife vergleichen/wechseln
  #9  
Alt 12.03.2004, 14:43
Mitglied
 
Registriert seit: 03.2004
Beiträge: 40
Also die Entwicklung wird auf jeden Fall weitergehen. Nach langem Überlegen bleib ich allerdings bei der eval Variante, weil sie in meinen Tests zumindest einfach das schnellste ist und die Usability in den Templates einfach klasse ist.

Ich kann Kommentare rausfiltern, ausführliche Informationen dazu schreiben, den Quelltext optimieren usw. All das ist mit anderen Templatemodulen oder auch mit eigenen Varianten einfach zu umständlich und auch immer langsamer gewesen als in meiner Version. Der Unterschied zwischen template und nicht template liegt bei etwa 0.005 ms für 3 templates (header, footer, index). Also für meinen Begriffe superschnell. Das Sicherheitsrisiko ist vielleicht etwas höher, auch wenn ich nix genaues darüber gefunden hab, aber ich benutze ja auch eval nur zur Ausgabe. Der normale Besucher kann also gar keinen Code einschleusen.

Die einzige Erweiterung, die ich noch dazu dichte, ist die Funktion, dass optimierte Templates in einer extra Datei zwischengespeichert werden. Danke für die ganzen Vorschläge und Ideen.

  #10  
Alt 12.03.2004, 17:07
Mitglied
 
Registriert seit: 03.2004
Beiträge: 40
Oh oben war ein Fehler - ich meinte 0.005 SEKUNDEN - nicht ms. Öhm, getestet hab ich das Smarty-System und PHPLib. Beides hat sich aber für meine Begriffe als äusserst schwerfällig und unhandlich herausgestellt.

Die Integration über die Klasse ist zwar an sich ne feine Sache, aber "Funktionsmonster" brauch ich einfach nicht. Mein Board soll eher auf den Punkt programmiert sein. Zusätzlich hatte ich auch mal diese modifizierten Templatefunktionen vom PHPBB2 getestet. Die Integration dieser Module ist natürlich sehr aufwendig und ich hab auch nicht alle bis zum Erbrechen getestet. Von diesen 3 Lösungen hat mir eigentlich die Smarty Version am besten gefallen - zumal Sie auch die schnellste war.

  #11  
Alt 12.03.2004, 17:50
Mitglied
 
Registriert seit: 03.2004
Beiträge: 40
Für meine Zwecke ist es zu groß und zu unhandlich. Wenn ich ne Telefonnummer notiere, öffne ich auch nicht Word.

Antwort


Stichworte
-

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Würde sich ein Wechsel auf wbb2 oder vBulletin wirklich lohnen? Silmarillion Forensoftware 61 01.11.2005 17:13
CMS oder Portalsystem für mich? DJ Iltiz Blog, CMS, Wiki und Sonstige 11 19.02.2005 10:50
(Welches) CMS – oder anderes Skript? Winters Blog, CMS, Wiki und Sonstige 19 06.04.2004 21:09
THWB 2.84 (2.9) oder phpBB 2.2? Fabchan Forensoftware 15 13.01.2004 16:17
Forum und Board oder doch ein FoBo/BoFo ;) Michael Przybyla Boardunity-Talk 6 08.09.2003 19:42






1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25