[PHP, MySQL] Fragen zu Performance und Sicherheit

DreiElf

Grünschnabel
Guten Abend zusammen,

ich entwickle gerade eine Seite und bin mir bei zwei Themen nicht sicher:
Performance und Sicherheit. Vielleicht habt Ihr ein paar Tipps für mich:

Performance
Ich entwickle lokal und nutze Apache, PHP 5 und MySQL 5. Des Weiteren habe ich als Tempalte-Engine Smarty in Verwendung.
Was ich bisher zu diesem Thema gefunden hat, hat mir nicht wirklich weitergeholfen.

  • Was ist die sinnvollste Art zu ermitteln, wie lange eine Seite zum Laden braucht? Kann man hier Details mitreporten, wie lange die einzelnen Datenbankabfragen brauchen?
  • Wie gehe ich vor, wenn ich das ganze in Produktion bringe. Woher weiß ich, welche Anforderungen ich an den Hoster/Server stellen muss (z.B. bei X Besucher pro Stunde)?
  • Gibt es eine Möglichkeit Performance-Tests durchzuführen, d.h. zu Simulieren, wenn x Besucher gleichzeitig auf der Seite sind?
  • Gibt es eine Möglichkeit sinnvoll (und auswertbar) zu loggen, wie sich die Performance in der Praxis verhält. Hierbei interessiert mich weniger die Prozessorlast sondern wie lange einzelen Abfragen bzw. Seitenaufrufe benötigen? Z.B. 14 Uhr - 0,5 sek für index.php; 18 Uhr - 1,2 sek für die index.php


Sicherheit
Gibt es eine Möglichkeit zu testen, wie sicher ein Webauftritt ist? Oder eine einfache Checkliste, anhand der ich überprüfen kann, ob ich an alles gedacht habe?
Hierbei geht es mir um bekannte, meist einfach zu identifizierbare Sicherheitsthemen, wie z.B. Cross Site Scripting u.ä.
Es geht mir hierbei nicht darum, dass z.B. ein Meister seines Faches eine halbe Stunde benötigt, um in meinen "sicheren" Bereich zu kommen.

Vielen Dank für Tipps und Hinweise, schönen Abend noch!
 
Ich entwickle lokal und nutze Apache, PHP 5 und MySQL 5. Des Weiteren habe ich als Tempalte-Engine Smarty in Verwendung.
(PHP5 && MySQL5) == 'sehr gut' ;)
Von Smarty würde ich dir abraten. Templateengines mit eigenem Interpreter und Compiler wozu? PHP ist und bleibt seit Version 0.x eine Templatesprache, die sich seit Version 3 mehr und mehr in eine komplette Scriptsprache verwandelte. Die Templatefunktionen sind jedoch bis heute überaus effizient und nett. Wenn du dennoch gerne über ein Templatesystem arbeiten möchtest, lege ich dir Zend_View ans Herz aus dem Zend Framework.

Was ist die sinnvollste Art zu ermitteln, wie lange eine Seite zum Laden braucht? Kann man hier Details mitreporten, wie lange die einzelnen Datenbankabfragen brauchen?
Umso besser du deine Daten gekapselt hast, umso leichter geht das... Der erste Teil ist leicht erledigt:
PHP:
$t1 = microtime(true);
$m1  = memory_get_usage(); // nur für unix-systeme geeignet

// ...

$t2 = microtime(true);
$m2 = memory_get_usage();

$computed = (float) ($t2 - $t1);

echo sprintf('%01.3f kB', ($m2 - $m1) / 1024) . "kB im Arbeitsspeicher\n";
echo sprintf('%01.5f µs', $computed * 1000);
Das würde dir zB den RAM-Verbrauch des gegenwärtigen Threads ausgeben und die totale Ausführungszeit...
Über [phpf]microtime[/phpf] lässt sich zu jeder Zeit eine genaue Zeitmessung durchführen, die man dann auswerten kann. Hast du zB eine Query-Klasse oder eine Datenbankklasse, kannst du in die entsprechenden Methoden zwei solche Hooks setzen, und die Differenz der Zeiten ergibt in etwa die Querylaufzeit. Ansonsten müsstest du die Querylaufzeit direkt von der DB abfangen, wenn dich die genaue Zeitspanne interessiert.

Wie gehe ich vor, wenn ich das ganze in Produktion bringe. Woher weiß ich, welche Anforderungen ich an den Hoster/Server stellen muss (z.B. bei X Besucher pro Stunde)?
Wissen kann man sowas nie genau. Grundsätzlich skaliert man mit den Erwartungen und Erfüllungen. Zu Beginn zB empfehle ich gerne einen VPS bei Host Europe, Strato, etc für 10 bis 20€ im Monat. Die haben gute Konditionen, eine gute Vorkonfiguration und vor allem massig freien Traffic. Sollte das Projekt wachsen, kann man immer noch auf einen größeren Server migrieren.

Gibt es eine Möglichkeit Performance-Tests durchzuführen, d.h. zu Simulieren, wenn x Besucher gleichzeitig auf der Seite sind?
Du kannst eine Art Bot einrichten, welcher (eventuell im Verband mit mehreren anderen) einen bestimmten Request an den Server absetzt. Ansonsten wäre eine Durchschnittsmessung ganz günstig, wie viel die Scripte immer in den RAM hauen, und wie sich das auf die Gesamtperformance auswirkt. Allzu große Sorgen muss man sich aber bei sowas erst machen, wenn es mehrere Hundert Requests pro Sekunde werden (Ich betrachte hier jedoch erst Systeme ab einem gewissen Leistungsniveau). Natürlich ist aber auch relevant, was du machen möchtest. Bilder on demand bearbeiten etwa lagert gerne mal um die 1 bis 10 Megabyte aus in PHP. Mein momentanes Projekt lagert, trotz einiger Komplexität, ~600kB aus und wird innerhalb von ~50 bis 100 Mikrosekunden compiliert und ausgegeben.

Gibt es eine Möglichkeit sinnvoll (und auswertbar) zu loggen, wie sich die Performance in der Praxis verhält. Hierbei interessiert mich weniger die Prozessorlast sondern wie lange einzelen Abfragen bzw. Seitenaufrufe benötigen? Z.B. 14 Uhr - 0,5 sek für index.php; 18 Uhr - 1,2 sek für die index.php
Eigenes LoggingScript auf Basis diverser Funktionen und einer Datenbank basteln und freuen. Kaum ein Webserver loggt so genau, wie du es gerne hättest - Mir wäre zumindest kein Server bekannt, welcher so spezielle Daten erfasst. Natürlich könntest du aber zB nen WatchDog an den Apacheserver dranhängen und schauen, ob er eventuell Abstürze oder ähnliches meldet.
Du kannst testweise mal ein PHP-Script starten, welches die CPU-Belastung hochtreibt. Hatte vorhin dazu ein eher spaßig gemeintes Gespräch mit jemandem über Endlosschleifen, aber die können hier von Vorteil sein. Währenddessen setzt du dann noch ein paar ernst gemeinte Requests ab und misst die Zeit.
PHP:
for(;;);
// oder
while(true);
// oder
include __FILE__;

Gibt es eine Möglichkeit zu testen, wie sicher ein Webauftritt ist? Oder eine einfache Checkliste, anhand der ich überprüfen kann, ob ich an alles gedacht habe?
Die Sicherheit ist die wohl individuellste Sache bei der Entwicklung einer Applikation. Jedoch gibt es diverse Grundregeln. Die wohl wichtigste: Keine Eingabe darf ungeprüft verarbeitet oder ausgegeben werden. Sogar Session-IDs aus der URL oder einem Cookie sollten ständig überprüft werden, wenn benötigt.
Variablen sollten grundsätzlich, sofern nicht vorher selbst verwertet, über entsprechende escape-Funktionen in einen Querystring übergeben werden (Vermeidet SQL-Injenctions). Usereingaben sollten bei der Ausgabe grundsätzlich auch über Ersetzungs- oder Escapefunktionen verwertet werden. Einen Fehler, den ich oft sehe, ist die sofortige Beendigung der Ausführung bei einem kleinen Fehler oder auch die exakte Ausgabe des Fehlers im Produktiveinsatz. Das ist wie eine Einladung zum Crackversuch. Fehler sollten abgefangen und so minimalistisch wie möglich ausgegeben werden. Dabei ist eine strikte Validierung der Eingaben von Vorteil. Die Funktion ctype_print zB eignet sich hervorragend zur Überprüfung auf Steuerzeigen in Benutzereingaben. Bei der kleinsten Unachtsamkeit, die eigentlich nicht hätte stattfinden können, würde ich generell vor jede weitere Aktion einen Riegel hängen. Fehlt zB ein $_POST Index, der mitgesendet werden hätte müssen, handelt es sich sehr wahrscheinlich um einen nicht legalen Zugriff.

Also einfach alles validieren und verifizieren, und jede Sprache (besonders PHP) wird dein Freund sein ;)
 
Soweit kann ich dem ganzen zustimmen und hab nur ein paar weitere Möglichkeiten zu nennen.

Apache bietet sein "ab" Tool, dem Apache Benchmark tool. Dort ist die Anzahl gleichzeitiger Verbindungen und die Anzahl der Verbindungen zum Beispiel definierbar.
Ich habe es bisher immer so behandelt, das ich test cases aufgesetzt habe, das bestimmte Bereiche (Tpl Engine, Authentication, Validation usw) getestet habe.
Ich habe mich nicht sehr tiefgehend damit beschäftigt, es gibt aber Möglichkeiten auch HTTP POSTs abzusenden. Googlen nach "apache benchmark" liefert viele Ergebnisse.

Zur Sicherheit:
Es gibt soweit mir nicht bekannt ist, nicht ein Tool oder ähnliches was die Sicherheit prüfen kann. Da hilft nur viel suchen und die Grundsätze im Kopf behalten. Generell will der User nur böses (bei 1mio User reicht es, wenn nur 1er was böses will) und daher jeden Input vom User überprüfen und per Typensicherheit auch wissen, was in Werten steht.
Datenbankabfragen natürlich absichern. Entweder einen entsprechenden DBA nutzen, der dies bietet (z.B.Prepared Statements).
Ansonsten hat Tutorials.de User Gumbo 2-3 nette Anleitungen geschrieben über Salted Hashes, Transaction IDs. Zu finden hier unter PHP Tutorials.
Ansonsten habe ich noch 3 Links, die Beispiele zeigen, wie XSS Hacks aussehen können und teilweise wie man sie erkennt, vielleicht hilft es dir.
XSS Whoes
XSS Cheat Sheet
XSS Prevention
 
Sicherheit
Gibt es eine Möglichkeit zu testen, wie sicher ein Webauftritt ist?
Chorizo-Scanner - allerdings richtig leistungsfähig ist nur die kostenpflichtige Version mit Morcilla-Extension, die findet dafür aber auch jede Sicherheitslücke.

(PHP5 && MySQL5) == 'sehr gut' ;)
Von Smarty würde ich dir abraten. Templateengines mit eigenem Interpreter und Compiler wozu? PHP ist und bleibt seit Version 0.x eine Templatesprache, die sich seit Version 3 mehr und mehr in eine komplette Scriptsprache verwandelte. Die Templatefunktionen sind jedoch bis heute überaus effizient und nett. Wenn du dennoch gerne über ein Templatesystem arbeiten möchtest, lege ich dir Zend_View ans Herz aus dem Zend Framework.
Also von einem Template-System würde ich persönlich niht abraten, da damit der Look&Feel überaus einfach gestaltet und geändert werden kann und dies gerade bei größeren Projekten. In hunderten Dateien HTML-Snippets zu ersetzen ist eine Qual, dies geht mit einem Template-System da deutlich schneller und einfacher, erkennen wird man dies auch erst, wenn man mal direkt in PHP-Dateien so viele Änderungen machen musste.
Aber das Zend-Framework ist eine weiser Vorschlag *in die Hände klatscht* da es dutzende alltägliche Problemstellungen bereits von Haus aus löst und man nur wenig Hand anlegen muss.
 
Also von einem Template-System würde ich persönlich niht abraten, da damit der Look&Feel überaus einfach gestaltet und geändert werden kann und dies gerade bei größeren Projekten. In hunderten Dateien HTML-Snippets zu ersetzen ist eine Qual, dies geht mit einem Template-System da deutlich schneller und einfacher, erkennen wird man dies auch erst, wenn man mal direkt in PHP-Dateien so viele Änderungen machen musste.
Da kann man sich sicherlich streiten, wie man möchte, und ich verstehe auch deinen Standpunkt sehr gut - Habe schließlich auch mal gerne mit Smarty und Co gearbeitet. Doch dann kam irgendwann der Bruch für mich, da die Performance unter dem Extraaufwand extrem leidet. Schließlich bin ich dann über die Beta des ZendFramework gestolpert und war sofort angetan von der View-Klasse. Sehr schnell, da PHP, und vor allem elegant und einfach. Von Haus aus hat sie schon einige Helfer dabei, und zur Not bastelt man sich diese eben selbst zurecht, was auch kein großes Problem ist, wenn man ein Mal dahinter gekommen ist ;)
So gesehen ist Zend_View in einer individualisierten Form mein Lieblings-Templatesystem, da es sehr schnell, leicht und effizient ist.
Letztenendes sei es aber jedem selbst überlassen, was er wie, wo und wann einsetzt, und was ihm gefällt.
 
Zurück