Rolf B: Wie Bestellnummer in Online-Shop in Log-Datei schreiben

Beitrag lesen

Hallo Andreas,

im Moment tendiere ich dazu, Dir zu empfehlen, einen Programmierer kommen zu lassen, der das für Dich erledigt. Über's Forum wird es nämlich langsam uferlos. Du hast über deine Kenntnisse jetzt mitgeteilt:

  • keine Programmierkenntnisse (versteh ich das richtig - in gar keiner Sprache?)
  • geringe Kenntnisse über Server-Administration (immerhin weißt Du was htaccess ist...)
  • und vermutlich hast Du keinen Server, der 100% Dir gehört, sondern ein gehostetes Web

Dazu kommt, dass wir hier in einem Zweig der Diskussion sind, die eigentlich fruchtlos ist, weil Du damit nicht an Dein Ziel gelangst. Du brauchst einen separaten Web-Request, der von der Danke-Seite ausgelöst wird. Dafür brauchst Du eine ganz eigene PHP Seite, die den Log-Eintrag schreibt, und in der JTL-Dankeseite musst Du ein <img> einbauen, das eine passende URL abruft.

Aber ich erzähle trotzdem mal was. Dabei muss ich allerdings einräumen, dass ich ein Windows-Programmierer bin, also jemand, über den richtige Programmierer nur spotten können (die haben alle Linux). Deswegen weiß ich nicht, wie der Apache auf einem Linux-Gerät gestartet wird. Ich habe aber schon ein paar Webs für meinen Arbeitgeber mit aufgebaut (mit IIS unter Windows) und orientiere mich an den best practices, die mir dabei vorgegeben werden. Unter Windows ist es so, dass man dem Webserver nicht die Rechte des Systemadministrators („root“ in Linux) erteilt, sondern dass man ihn unter einem speziellen technischen Benutzer startet, der gerade die nötigsten Rechte hat. Dadurch werden potenzielle Risiken minimiert, falls jemand ein Sicherheitsloch findet und damit den Serverprozess kapert. Der Apache wird das unter Linux ähnlich halten. Alles andere wäre fahrlässig.

Zugriffsrechte bei Webservern sind mehrschichtig. Die oberste Schicht ist das, was im Apache festgelegt wird (also in .htaccess und vielleicht noch anderen Dateien). Damit begrenzt der Apache Zugriffe auf Dateien und Verzeichnisse. Die nächte Schicht liegt in Berechtigungsprüfungen der Anwendung, basierend auf dem angemeldeten Benutzer. Die dritte Schicht ist das Dateisystem des Servers, auf dem Apache läuft. Rechte im Dateisystem sind unter Windows auf Benutzer bezogen - ob man sie unter Linux auch für Programme einräumen kann, weiß ich nicht.

Irgendwo muss man verhindern, dass böse Requests dein Web schreddern oder die Kontrolle über den Server übernehmen. Das auf der untersten Schicht - im Dateisystem - zu tun, macht meistens etwas Aufwand, ist aber eigentlich unverzichtbar. Ein Ordner, der per WebRequest erreichbar ist, sollte für den Apache im Dateisystem komplett schreibgeschützt sein (heißt: Wenn beschreibbare Temp-Ordner gebraucht werden, müssen die per htaccess vor direkten Webzugriffen geschützt sein). Es gibt Graubereiche, wenn User Dateien hochladen können die nachher per Web erreichbar sein können, aber das haben wir hier nicht.

Nun zum Begriff „root“ - bevor wir uns da missverstehen. „root“ hat drei Bedeutungen. (1) der Linux-Systemuser mit den höchsten Rechten, (2) der Ordner "/" im Dateisystem des Servers (Filesystem-Root), (3) der Ordner auf dem Server, den ich erreiche, wenn ich http://www.example.org aufrufe (Web-Root).

Der „root“ User darf alles, und deshalb ist es fahrlässig, den Apache als root zu starten. Wenn Du Webspace gemietet hast, hast Du darauf gar keinen Einfluss. Der Hoster definiert, in welchem Ordner deine Dateien liegen, und wird dafür sorgen, dass der Apache nirgendwo anders hin zugreifen kann, wenn er für Dich arbeitet.

Ein Filesystem-Root gibt's nur einmal, und da gehören nur Ordner hin und vielleicht ein paar Dateien, die das Betriebssystem da unbedingt haben will. Ein Apache hat da oben GAR nichts verloren. Dafür sorgt der Hoster (siehe oben).

Ein Web-Root gibt es pro definierter Web-Anwendung. Eine einfache gehostete Umgebung bietet Dir genau eine Web-Anwendung (die Adresse deiner Homepage halt). Dein Hoster stellt für jeden Kunden eine Web-Anwendung bereit, jeder hat sein eigenes Web-Root. Dort solltest Du aber keine Log-Dateien ablegen. Dein Hoster verbietet es dem Apache vielleicht nicht, aber für Logs machst Du besser einen Unterordner, auf den Du per .htaccess den Zugriff über http verbieten kannst.

Wie kommst Du nun zu diesem Verzeichnis hin? Die PHP Doku ist etwas schwammig, was das "aktuelle Verzeichnis" bei Ausführung eines PHP Scripts angeht. Eigentlich sollte das aktuelle Verzeichnis das sein, in dem das Einstiegs-Script für den aktuelle Request steht. Wenn also dein Web-Root für http://www.example.org auf dem Server der Ordner /web/andreas ist, dann startet http://www.example.org/danke.php das PHP-Script /web/andreas/danke.php und das aktuelle Verzeichnis ist /web/andreas. Wenn DIESES Script nun die Datei "log/bestellungen" öffnen will, öffnet es /web/andreas/log/bestellungen. Das ist der einfache Fall.

Sollte danke.php aber in einem Unterverzeichnis liegen (z.B. in JTL), dann ist die URL http://www.example.org/JTL/danke.php und das aktuelle Verzeichnis ist /web/andreas/JTL. Um jetzt auf den gleichen Log-Ordner wie eben zuzugreifen, müsste man ../log/bestellungen öffnen. D.h. du codierst deine Dateisystemstruktur in deine Programme, und das tut man nicht. Weil man dann nicht mal eben seine Installation umstrukturieren.

Hier hilft in PHP den Eintrag DOCUMENT_ROOT des $_SERVER Superglobal. Man könnte deine Funktion also so erweitern:

function writeToLog($text)
{
   $path = implode(DIRECTORY_SEPARATOR, [$_SERVER["DOCUMENT_ROOT"], "log", "bestellungen"]);
   $log = fopen($path, "a");
   if ($log !== FALSE) {
      fwrite($log, date("d.m.Y H:i:s") . " - $text\n");
      fclose($log);
   }
}

Die implode-Funktion setzt einen String aus Teilen zusammen und fügt dazwischen ein Trennzeichen ein.

Rolf

--
sumpsi - posui - clusi