Beiträge von ZappelPhillip

    PHP
    $page = preg_replace('/[^a-zA-Z0-9\/_-]/', '', $_GET['page']);


    Einfach austauschen, dann sollte der Fehler weg sein
    Wenn die Seite dann immer noch nicht gefunden wird, setz unter:


    PHP
    $targetFile = __DIR__.'/contents/'.$page.'.php';


    nochmal:


    PHP
    var_dump($targetFile);


    Und schau nach, ob der Pfad auch wirklich korrekt ist, bzw, Deine Dateien dort auch gefunden werden können.

    PHP
    Du solltest mindestens prüfen, ob die Klasse existiert.
    Wenn sie existiert, dann hast du sie ja sicherlich geschrieben und sie wird die benötigte Methode besitzen.


    Ja ne, leider hab ich alle Klassen in einen Ordner geworfen, und das ist mir mittlerweile zu viel um die Klassen nun noch nach dem Muster VOLLER_PFAD_KLASSE.class.php um zu benennen und so (außerdem finde ich diese Namen immer so unübersichtlich). Wenns sein muss, ok, aber wenn ich es vermeiden kann... :D
    Und von daher könnte ja im Grunde jede Klasse aufgerufen werden, egal ob nun eine echte Seitenklasse, für die es gedacht ist oder beispielsweise die super-duper-admin-klasse. Aber das könnte ich ja mit einem try-catch-block verhindern in welchem ich auch prüfe ob die Methode getSiteContent, die ja nur in den Seiten-Klassen existieren kann, auch existiert.


    Habs eben ausprobiert und es scheint zu funktionieren... oder hab ich was relevantes vergessen in meiner Logik?


    Trenn alles ordentlich voneinander und dann bindest Du die einzelnen Seiten am Ende der index.php einfach ein.
    Damit sollte es auch keine Probleme geben, habs vor kurzem auch so in etwas verwendet und vorallem sparst Du Dir das sinnlose Output-Buffering, welches Du für Deinen Fall gar nicht benötigst, insbesondere weil Du selbst sowas wie den Status-Code 503 nie ausgibst: Das ist der Statuscode, der vom Server gesendet wird, wenn der Server überlastet/nicht erreichbar ist.


    Es hat übrigens auch kein sonderlichen Sinn in der selben Datei, in der Du die Constante definierst, abzufragen ob sie in dieser Datei existiert. Natürlich existiert sie: Ist ja die selbe Datei. Das prüfst Du nur in allen anderen Dateien, um zu schauen ob die Dateien legal von Deinem Main-Script includet wurden und nicht einfach direkt aufgerufen wurden.


    An sowas Ähnliches habe ich auch gedacht (weil man ja theoretisch alle Klassen aufrufen könnte, wenn man weiß wie sie heißen), deswegen habe ich für die Klassen die irgendwelche Inhaltsseiten darstellen sollen, immer die Methode "getSiteContent" eingebaut, die auch aufgerufen werden muss aus der "Controller"-Klasse und ohne die auch nichts läuft (versuch ich also einfach eine Klasse aufzurufen über die URL, dann gibts ne Fehlermeldung, weil diese Methode ja in den anderen Klassen nicht existiert).
    Würde das strenggenommen nicht auch reichen?
    Ansonsten ist das natürlich keine schlechte Idee, auf sowas wäre ich nicht gekommen.


    Zitat

    Holt euch CodeIgniter .. da ist diese ganze Logik schon drin..


    Ich weiß, es gibt schon viele fertige Frameworks die vieles schon mitbringen was man so braucht. Aber mir gings nicht darum nur schnell ne Homepage oder so zu bauen, sondern vorallem um den Lerneffekt. Wollte mich halt mit den ganzen Möglichkeiten, Funktionen, ... von PHP näher ajseinandersetzen um mir eigene Lösungswege zu schaffen und zu finden um das ganze besser zu verstehen. Deswegen wollte ich auf sowas erstmal verzichten, zwar würde ich damit wahrscheinlich schneller ans Ziel kommen, aber wie gesagt: Mir gehts eher ums lernen.

    Zitat

    2. Weiß nicht genau, was Dein Script macht (include $_GET ... ?),
    aber im Grunde würde ich hier auch auf Whitelists setzen.


    Nicht so ganz:


    1. Es wird die ganze Seiten-URL abgerufen und in einer Variable gespeichert (vorher werden die einzelnen Bausteine standardmäßig bei mir mit stripslashes bearbeitet)
    2. Meine feste Domain (http://example.com) wird von der zusammengebauten URL (z.B http://example.com/Seite/Willkommen) entfernt, damit nur noch /Seite/Willkommen übrig bleibt.
    3. Seite/Willkommen wird beim / getrennt und daraus ergeben sich dann die Klasse Seite und der DB-Inhalt von Willkommen
    4. Alle ungültigen Zeichen werden aus "Seite" und "Willkommen" entfernt.
    5. Es wird geprüft ob die Klassendatei existiert (wenn nicht, gibts ne Fehlerseite) und dann wird der Parameter "Willkommen" an die Klasse übergeben.
    6. Die Klasse "Seite" z.B übernimmt den Rest (holt die Daten, baut die Seite zusammen, wirft Fehler aus falls "Willkommen" nicht existiert etc)


    So eine richtige Whitelist wollte ich eigentlich nicht, weil ich mir denke, so wie ich es jetzt mache müsste es reichen?
    Und ich wollte das ganze halt möglichst "variabel" aufbauen, wenn ich also ne neue Seite einbauen will, dann will ich nur ne neue Klasse einfügen müssen und nicht in allen möglichen anderen Dateien auch noch was umschreiben.


    Zitat

    - index.php ganz am Anfang: define('MAIN', 1);
    - other_scripts.php ganz am Anfang: !defined('MAIN') AND exit('meldung ...');


    So hab ich es immer gemacht als ich nur prozedural geschrieben habe, dachte aber (und da dachte ich ja auch richtig) wenn ich alles in Klassen schreibe, dann ist das nicht mehr notwendig.


    Zitat

    Also einfach mal paar vertauenswürdige auf Deine Seite los lassen. So nach dem Motto: "versucht es mal kaputt zu machen"


    Ich seh das schon kommen, 30 Sekunden später sagt mir der erste "erledigt" :D


    Zitat

    Zum String: wenn Du Daten ausgibst, dann immer masiert.
    PHP: $secure = htmlspecialchars($inSecureData);
    JS: var secure = document.createTextNode(inSecureData);


    Das ist das erste was ich immer mache, wenn ich irgendwo was ausgebe. :D

    Hallo,


    nachdem ich mir nun ein paar nette Sachen zusammengebastelt habe die (jedenfalls auf meinem PC mit XAMPP) auch fehlerfrei laufen, wollte ich mir nun noch ein paar Informationen zum Thema Sicherheit einholen - möchte ja nicht irgendwelche unnötigen Sicherheitslücken wenn ich mal was online stelle.


    Jetzt hab ich mir schon einiges angelesen und dennoch einige Fragen um sicherzugehen, dass ich auch alles richtig verstanden habe.


    1. MySQLi und Prepared Statements.
    Ich habe mir angelesen, dass durch MySQLi in Verbindung mit den Prepared Statements keine Möglichkeit besteht irgendeinen Schädlichen Code in der Datenbankabfrage auszuführen, früher musste man alle Eingaben des Nutzers vor dem Ausführen in der DB auf etwaige böse Zeichen prüfen, jetzt sei das nicht mehr so, weil im Grunde erst die Anfrage an den Server geschickt wird (Vorbereitet) und der Server danach nur noch die Platzhalter ersetzt.
    Ist das so wirklich korrekt? Oder muss ich da doch irgendetwas beachten, irgendwelche Ausnahmefälle?


    2. Suchmaschinenfreundliche URLs
    Ich habe mir, weils schick aussieht und so nicht jeder direkt erkennt, es handelt sich um php diese schicken URLs gemacht wie example.com/Site/Welcome statt example.com/index.php?Site=Welcome. Funktioniert sogar tadellos.
    Nun las ich auch dazu, dass es dort Sicherheitslücken geben könnte (der Benutzer kann ja strenggenommen alles eingeben) "sichern" tu ich das im Moment nur wie folgt:


    Einmal mit: stripslashes (wird auf alle $_POST, $_GET, $_REQUEST, $_SERVER['REQUEST_URI'] etc. angewendet)
    und mit: preg_replace('/[^a-zA-Z0-9\/_-]/', '', $url) so das eben nur noch bestimmte Zeichen zugelassen werden, bzw. alle die ich nicht brauche/in keiner URL vorkommen werden, entfernt werden.
    Ist das ausreichend oder muss ich diesbezüglich vielleicht mehr beachten?


    3. Dateiaufruf verhindern oder nicht?
    Auf einigen Seiten habe ich gelesen, dass alle Dateien die includet werden sollen, vor direktem Aufruf geschützt werden sollen. Wie man das aber genau macht (ausser mit .htaccess) habe ich nicht rausgefunden. Außerdem weiß ich auch nicht ob das noch aktuell ist (diese Aussagen sind alle schon einige Jahre alt).
    Bei mir sieht das im Moment so aus: Es wird alles von der index.php aus geregelt, dort wird nur die Hauptklasse (die ich immer brauche) includet, alles andere befindet sich auch in eigenen Klassen-Dateien. Wenn ich so eine Klassen-Datei aufrufe, dann passiert ja im Grunde nichts (wie auch, werden ja keinerlei Paramter übergeben mit denen die Klasse arbeiten könnte). Wie sieht das also aus?


    4. Seite selber auf Sicherheitslücken testen
    Überall las ich zu dem Thema, man soll seine Seite selbst auf alle möglichen Lücken testen. Aber wie mache ich das? Ich bin ja keiner der den ganzen Tag versucht fremde Seiten lahmzulegen, hab also keine Kentniss darüber.
    Bisher fand ich nur so einen Javascript-Beispiel (n Alert) gefunden das man in der URL eingeben könnte - passiert bei mir aber nichts (Ausgabe mit var_dump() ergibt dann string(30) "Start3Cscript3Ealert27doof273C").
    Wie genau prüf ich denn also meine Anwendungen auf Sicherheitslücken selber?


    5. Ich bin auch dankbar für alle anderen Tipps, Infos, Erklärungsseiten/Videos, ...

    Code
    Wo siehst Du denn das?
    Ich seh da nix im code.


    Er hatte noch einen Beitrag (jetzt gelöscht), wo er seine Registtrations.php zeigte, dort hat er das Passwort mit htmlspecialchars bearbeitet, was er beim Login aber nicht tut.


    Code
    Selbst wenn ein Leerzeichen am Anfang/Ende ist -- es ist das, was der User wollte/eingegeben hat.


    Bei Leerzeichen bin ich persönlich anderer Meinung. Kommt ja vor, dass man versehentlich ein Leerzeichen am Anfang stehen hat und es nicht merkt, schon weiß der User sein Passwort nicht mehr. Ich würde eher drauf hinweisen, dass Leerzeichen am Anfang/Ende nicht unterstützt werden und sie entfernen. Da beugt man Problemen gleich vor und m.E dürfte es auch niemanden stören. Aber das muss wahrscheinlich jeder selbst entscheiden.

    Sind in Deinem Passwort Sonderzeichen? Wie < > & o.Ä?
    Dann wird es nicht funktionieren, weil Du beim registrieren das passwort mit htmlspecialchars bearbeitest. Entweder musst Du das auch bei der Anmeldung machen oder bei der Registrierung weglassen.
    Ansonsten, hash das passwort vielleicht nochmal neu und speicher es neu ab. Was anderes seh ich gerade nicht.

    Zitat

    Es liegt hier dran:
    && password_verify($password, $results['password'])
    Denn, wenn ich es entferne gehts aber macht ja auch kein Sinn ohne Passwort sich einzuloggen.


    1. wie hasht Du denn das Passwort? Wenn Du an die Passwörter noch einen eigenen Wert anhängst, musst Du den natürlich auch beim password_verify verwenden.
    2. Ist die Zeile password in Deiner DB auch lang genug? Wenn sie nicht lang genug ist und der Vorgang nicht abgebrochen wird, wird ein gekürzter = falscher Hashwert gespeichert. Ergo wird jeder Versuch das Passwort zu prüfen fehlschlagen.


    Zitat

    inlcude "functions.php"; in einem Script schreibe mit richtigem Pfad dann funktonieren die Funktionen nicht. Er zeigt mir immer
    Call to a member function login() on a non-object in /users/varez-data/www/homepage/log/index.php on line 15


    Wäre hilfreich, wenn Du die functions.php auch zeigst, dann könnte man Dir vielleicht sagen wo der Fehler liegt.

    Ok danke schonmal.


    Jetzt habe ich noch eine andere Frage zum Autload bzw. spl_autoload_register.
    Welchen Sinn genau soll das haben? Was ich erst darunter verstand war: Ich geb der Funktion einen Pfad unter der sie die Klassen finden kann um sie dann - wenn sie benötigt werden - automatisch zu laden.
    Stattdessen muss ich die Klasse im Grunde ja jedesmal selber laden (muss die Funktion ja aufrufen und ihr die zu ladende Klasse mitteilen). Wo ist da der Sinn? Da kann ich doch auch bei der Methode bleiben, einfach die benötigten Klassen direkt über include_once zu laden?
    Gibts das irgendwelche Gründe, Vorteile oder irgendeinen Sinn (außer 42), warum ich irgendeine Autload-Funktion nutzen sollte?
    Oder hab ich da einfach nur was falsch verstanden bei der Verwendung? :D

    Ich danke Dir vielmals. Es funktioniert klasse.


    Hab mir Dein langes Beispielscript auch eben mal angeschaut. Da ist mir aufgefallen, in Zeile 30 und 40 sind die Funktionen __construct() und __clone() leer, hat das einen tieferen Sinn? Wenn ja warum macht man das so?

    Hallo,


    seit kurzem beschäftige ich mich etwas mit PHP, nun stehe ich vor zwei Problemen und hoffe, dass mir hier jemand behilflich sein kann.


    Ich habe eine Konfigurationsdatei, wo ich allgemeine Daten speicher, diese speicher ich mittels Konstanten.
    Nun möchte ich gerne die Konfig-Datei über eine globale Klasse laden und dann ganz normal verwenden können.
    Versucht habe ich das nun so:


    PHP
    <?phpclass GlobalClass {
      public function __construct() {    $this->loadConfig();  }
      function loadConfig() {    require_once __DIR__.'config.php';  }}?>




    Da ich Smarty nutze, möchte ich diese Konstanten nun mittels Smarty ganz normal in meinem TPL nutzen.
    Leider funktioniert das nicht (wird nichts ausgegeben). Mit dieser Funktion. Wenn ich die Datei hingegen direkt im TPL include, dann geht das.


    Das zweite Problem:


    Liegt bei Smarty. Da ich die Smarty-Klasse nicht in jeder Datei neu laden will, wollte ich es ebenfalls über diese globale Klasse machen.


    Versucht habe ich es wie folgt:


    PHP
    class GlobalClass {  public static $smarty  public function __construct() {    $this->initSmartyTPL();  }  function initSmartyTPL() {    self::$smarty = new smarty;  }}?>









    PHP
    class MySite {
      public function getSite() {
      //... DB-Abfragen etc.
      GlobalClass::$smarty->assignByRef('bla', $bla);  GlobalClass::$smarty->display('MySite.tpl');
      }
    }



    Resultiert in der Fehlermeldung "Call to a Member function assignByRef() on a non-object in ..."


    Würde mich freuen, wenn mir jemand weiterhelfen könnte...