Rolf B: Warnung! Beware! Uwaga!

Beitrag lesen

Hallo MoaByter,

$_GET, $_POST werden nur zur Sicherheit umgewandelt, also wenn jemand versucht, mit einem selbstgebastelten Request den Server zu schrägen Sachen zu verleiten. Die Nachteile sind bekannt, spitze Klammern haben in einem Namen-/Adressfeld jedoch nix zu suchen. I

Kann man so sehen, aber wenn der Kontextwechsel korrekt durchgeführt wird (also die passende Escape-/Quote Funktion beim DB Zugriff und ein htmlspecialchars bei der Ausgabe auf den Browser), dann kann man basteln wie man will und es passiert nichts.

Ohne base64-Encodierung bekomme ich z.B. auch die in den Beiträgen verwendeten Smileys nicht rein.

Dann hast Du ein Encoding-Problem. Setze konsequent auf Unicode, bei

  • der Ausgabe von Text an den Browser
  • beim Speichern deiner PHP Sourcen und der Textdateien, die Du an den Browser schickst (CSS und JS)
  • beim Herstellen der DB-Verbindung
  • beim Speichern der Daten in der DB

Bei der DB musst Du darauf achten, utf8mb4 zu verwenden. Die ursprüngliche UTF8-Unterstützung von MySQL konnte nur UTF-Sequenzen aus 3 Zeichen verarbeiten, das reicht nur für die BMP (Basic Multilingual Plane, Zeichen \u0000 bis \uffff).

Was darf ich unter einem "fachlichen Object" verstehen? C# ist sehr stark Object-orientiert, PHP nicht so sehr.

Ja, in PHP kann man prozedural, hybrid oder auch massiv objektorientiert arbeiten. Du kannst bspw. eine Factory-Klasse erstellen, die sich $_GET/$_POST anschaut und das passende Controller-Objekt zurückliefert, um den Request zu verarbeiten.

// demo.php
require "autoloader.php";

$router = new RequestRouter("demo");
$controller = $router->getController($_GET, $_POST);

$controller->run($_GET, $_POST);

Der RequestRouter braucht natürlich Steuerinformationen, so dass er aus dem Namen der Seite, $_GET und $_POST ermitteln kann, welche Controllerklasse den Request verarbeiten kann. Er kann auch einen InvalidRouteController zurückliefern, wenn er keinen passenden Controller findet.

Die run Methode im Controller kann dann aus den Requestparametern die passende Aktion bestimmen und durchführen. Geht alles, muss man nur bauen (oder mit Frameworks wie Symphony fertig einbinden). Braucht natürlich dann mehr Speicher und Laufzeit - das ist normal.

Warum es bei dir auf dem Servern nicht funktioniert, kann man ohne Error Log nicht sagen.

Wenn Du keine PHP Fehler-Logdatei auf dem Server hast oder kennst, dann könntest Du mal eine Miniseite hochladen, die phpinfo() ausführt. Schau, was unter error_log konfiguriert ist. Oder frag deinen Hoster-Support, wohin PHP Errors loggt.

Wichtig ist natürlich, dass Errors überhaupt ausgegeben werden, dafür brauchst Du die richtige error_reporting Einstellung.

Wenn PHP irgendwelche Fehlermeldungen ausgibt, und sei es auch nur ein Notify, bevor Du die Header setzen willst, dann ist es zu spät. Die Header sind geschrieben und können nicht mehr ergänzt werden.

In meinen (unprofessionellen) Programmen integriere ich deshalb zumeist mit set_error_handler, set_exception_handler und register_shutdown_function ein eigenes Errorhandling, die alle Meldungen, die PHP schreibt, in ein Array schreibt statt sie zum Browser zu schicken.

Am Ende der Seite oder im Shutdown gebe ich dieses Array dann als Liste aus. Auf diese Weise kann ich die Meldungen bändigen und verhindere, dass sie mitten ins HTML gerotzt werden.

Rolf

--
sumpsi - posui - obstruxi