[How To] UCP auf Ini-Basis

  • Ein paar mal nachgefragt, ein paar Ankündigungen & ich bin erster :P


    Vorab: Das hier sind nur die Basics - um Sachen wie Shops etc. müsst ihr euch selber kümmern ;)
    Ich werde hier auch nur die Funktionen vorstellen, also werde ihr hier nichts OOP sehen - nicht mal selbstgeschriebene Funktionen :whistling:


    Fangen wir direkt an, indem wir eine Session initialisieren.
    Wichtig: Die Session muss initialisiert werden, bevor das erste Zeichen ausgegeben wird - das liegt damit zusammen, dass die Session ein Cookie erstellt, was der Webserver im Header sendet - also muss es vor der ersten Ausgabe kommen ;)


    Den Anfang legt das HTML-Grundgerüst ( HTML5 ), was wir sicher alle kennen :thumbup:

    PHP
    <?php session_start(); ?><html lang="de">  <head>    <meta charset="utf-8" />    <title>Mein UCP</title>  </head>  <body>    [ Webseiteninhalt hier rein ]  </body></html>


    Fangen wir mit unserer ersten Abfrage ab, ob der Benutzer eingeloggt ist:

    PHP
    <?php  if(isset($_SESSION['logedin']) && $_SESSION['logedin'] == true)  {    // Hier ist der Benutzer eingeloggt  }  else  {    // Hier nicht  }?>


    Wenn er nicht eingeloggt ist, unterscheiden wir noch mal, ob er das Formular abgesendet hat, oder nicht:

    PHP
    <?php  if(isset($_SESSION['logedin']) && $_SESSION['logedin'] == true)  {    // Hier ist der Benutzer eingeloggt  }  else  {    // Der Benutzer ist nicht eingeloggt    if(isset($_POST['username']) && isset($_POST['password']))    {      // Das Formular ist abgesendet worden -> verarbeiten    }    else    {      // Das Formular ist nicht abgesendet      echo <<<FORMULAR        <form action="index.php" method="post">          Benutzername:<br />          <input type="text" name="username" /><br />          Passwort:<br />          <input type="password" name="password" /><br />          <input type="submit" value="Absenden" />        </form>FORMULAR;    }  }?>


    Wenn wir die Seite jetzt in einem Browser aufrufen, werden wir das Formular sehen, und beim Absenden, nichts.
    Was wir jetzt machen, wir verbinden uns auf den FTP-Server und downloaden die Benutzerdatei. Dann prüfen wir, ob sie erfolgreich gedownloaded wurde - falls ja, prüfen wir das Passwort. Ist auch das richtig, loggen wir den Benutzer ein:

    PHP
    <?php  if(isset($_SESSION['logedin']) && $_SESSION['logedin'] == true)  {    // Hier ist der Benutzer eingeloggt  }  else  {    // Der Benutzer ist nicht eingeloggt    if(isset($_POST['username']) && isset($_POST['password']))    {      // Das Formular ist abgesendet worden -> verarbeiten      // Verbinden zu dem FTP-Server "127.0.0.1" auf Port 21      $ftp = ftp_connect("127.0.0.1", 21);      // Einloggen mit dem Benutzer "bla" und dem Passwort "blub"      ftp_login($ftp, "bla", "blub");      // Wechseln in das Verzeichnis "scriptfiles/Accounts"      ftp_chdir($ftp, "scriptfiles/Accounts");      // Versuche, die Datei "benutzername.ini" zu downloaden.      // Der zweite Parameter gibt den Namen auf dem Webspace an, der dritte auf dem FTP-Server. Mit dem viertem sagen wir, dass wir die Datei in dem ASCII-Modus haben wollen.      ftp_get($ftp, 'cache/'. $_POST['username'] .'.ini.cache', $_POST['username'] .'.ini', FTP_ASCII);      // Prüfen, ob die Datei existiert. Wenn ja, download erfolgreich      if(file_exists('cache/'. $_POST['username'] .'.ini.cache'))      {        // Der Benutzer existiert - wir lesen seine Datei aus ( die wir gedownloaded haben )        // Dazu nutzen wir parse_ini_file - das geht die Datei zeilenweise durch und macht aus einer Zeile "Key=xxx" folgendes: $array['Key'] = "xxx"        $player = parse_ini_file('cache/'. $_POST['username'] .'.ini.cache');        // Jetzt prüfen wir, ob das Passwort stimmt. WICHTIG: Bei einem GF müsst ihr das PW evtl. verschlüsseln !        if($player['Key'] == $_POST['password'])        {          // Der Benutzer hat sich erfolgreich eingeloggt          echo 'Du hast dich erfolgrecih eingeloggt.';          // Jetzt setzen wir die Session-werte:          $_SESSION['logedin'] = true;          $_SESSION['user'] = $_POST['username'];        }        else        {          // Die Passwörter stimme nicht überein          echo 'Das Passwort ist falsch !';        }      }      else      {        // Der Benutzer existiert nicht        echo 'Der Loginist falsch !';      }    }    else    {      // Das Formular ist nicht abgesendet      echo <<<FORMULAR        <form action="index.php" method="post">          Benutzername:<br />          <input type="text" name="username" /><br />          Passwort:<br />          <input type="password" name="password" /><br />          <input type="submit" value="Absenden" />        </form>FORMULAR;    }  }?>


    Aus Übersichtsgründen kommt jetzt nur noch der obere Teil ;)

    PHP
    <?php  if(isset($_SESSION['logedin']) && $_SESSION['logedin'] == true)  {    // Hier ist der Benutzer eingeloggt    $player = parse_ini_file('cache/'. $_POST['username'] .'.ini.cache');    echo'Wilkommen im Controlpanel, '. $_SESSION['username'] .'<br />'; // <- erinnert ihr euch ? Die haben wir bei dem Login gesetzt ;)    echo'Du bist Level '. $player['Level'] .'<br />';  // In der Datei steht "Level=5", dann steht hier "Du bist Level 5"    if($player['ALevel'] >= 1) // Wenn das ALevel ( Godfatherisch für AdminLevel ) größer als 1 ist, das auch ausgeben      echo'Du bist Admin Level '. $player['ALevel'] .'<br />';  }  else  {    [...]


    Und hier noch mal alles zusammen:

    PHP
    <?php   session_start();  // Eine neue Session-ID bei jedem Aufruf generieren - nur beim Login geht schlecht,  //  da vorher Text ausgegeben wird und ich euch nicht mit OutputStream-Bufferring belästigen möchte  //  „false“ bedeutet, alle Variablen nicht löschen.  session_regenerate_id(false);?><html lang="de">  <head>    <meta charset="utf-8" />    <title>Mein UCP</title>  </head>  <body><?php  // Einrücken müsst ihr selber :P  if(isset($_SESSION['logedin']) && $_SESSION['logedin'] == true)  {    // Hier ist der Benutzer eingeloggt    $player = parse_ini_file('cache/'. $_POST['username'] .'.ini.cache');    echo'Wilkommen im Controlpanel, '. $_SESSION['username'] .'<br />'; // <- erinnert ihr euch ? Die haben wir bei dem Login gesetzt ;)    echo'Du bist Level '. $player['Level'] .'<br />';  // In der Datei steht "Level=5", dann steht hier "Du bist Level 5"    if($player['ALevel'] >= 1) // Wenn das ALevel ( Godfatherisch für AdminLevel ) größer als 1 ist, das auch ausgeben      echo'Du bist Admin Level '. $player['ALevel'] .'<br />';  }  else  {    // Der Benutzer ist nicht eingeloggt    if(isset($_POST['username']) && isset($_POST['password']))    {      // Das Formular ist abgesendet worden -> verarbeiten      // Verbinden zu dem FTP-Server "127.0.0.1" auf Port 21      $ftp = ftp_connect("127.0.0.1", 21);      // Einloggen mit dem Benutzer "bla" und dem Passwort "blub"      ftp_login($ftp, "bla", "blub");      // Wechseln in das Verzeichnis "scriptfiles/Accounts"      ftp_chdir($ftp, "scriptfiles/Accounts");      // Versuche, die Datei "benutzername.ini" zu downloaden.      // Der zweite Parameter gibt den Namen auf dem Webspace an, der dritte auf dem FTP-Server. Mit dem viertem sagen wir, dass wir die Datei in dem ASCII-Modus haben wollen.      ftp_get($ftp, 'cache/'. $_POST['username'] .'.ini.cache', $_POST['username'] .'.ini', FTP_ASCII);      // Prüfen, ob die Datei existiert. Wenn ja, download erfolgreich      if(file_exists('cache/'. $_POST['username'] .'.ini.cache'))      {        // Der Benutzer existiert - wir lesen seine Datei aus ( die wir gedownloaded haben )        // Dazu nutzen wir parse_ini_file - das geht die Datei zeilenweise durch und macht aus einer Zeile "Key=xxx" folgendes: $array['Key'] = "xxx"        $player = parse_ini_file('cache/'. $_POST['username'] .'.ini.cache');        // Jetzt prüfen wir, ob das Passwort stimmt. WICHTIG: Bei einem GF müsst ihr das PW evtl. verschlüsseln !        if($player['Key'] == $_POST['password'])        {          // Der Benutzer hat sich erfolgreich eingeloggt          echo 'Du hast dich erfolgrecih eingeloggt.';          // Jetzt setzen wir die Session-werte:          $_SESSION['logedin'] = true;          $_SESSION['user'] = $_POST['username'];        }        else        {          // Die Passwörter stimme nicht überein          echo 'Das Passwort ist falsch !';        }      }      else      {        // Der Benutzer existiert nicht        echo 'Der Loginist falsch !';      }    }    else    {      // Das Formular ist nicht abgesendet      echo <<<FORMULAR        <form action="index.php" method="post">          Benutzername:<br />          <input type="text" name="username" /><br />          Passwort:<br />          <input type="password" name="password" /><br />          <input type="submit" value="Absenden" />        </form>FORMULAR;    }  }?>  </body></html>


    Werde das später noch um das Updaten der Benutzerdatei erweitern :thumbup:
    Fragen und Feedback drüft ihr gerne posten, solange es sachlich + begründet(Fragen braucht ihr nicht begründen) ist und keine Beleidigungen enthält ( muss man in diesem Board leider sagen :/ )


    Neu: SFTP-Version - benötigt ssh2-lib, einfach Packet ssh2-php nachinstallieren, wenn noch nicht getan :thumbup:


    Liebe Grüße :love:


    Tion


    e1: Session regenerate id
    e2: SFTP Versiob

  • sehr gutes tutorial auch sehr gut verstanden 10/10 eine frage hätte ich kenn nur bissel mit html aus und mit php eig garnicht aber wie könnte ich dort design genau so wie bei einer html seite einfach mit css?Und könnte man
    sachen mit dem ucp bearbeiteb und boch eine frage :D könnte man auch .txt so aausleseb wie ini...


    sorry wegen der vielen fragen möchte aber
    einngröseres machen.




    via Mobil

    [tabmenu][tab='Angebote','http://cdn3.iconfinder.com/data/icons/glyph/227/Tag-48.png']

    + Die Preise liegen bei 5-100+€ Ablauf:
    + Entweder ihr addet mich in Skype (PN vorher Schreiben) oder Ihr schreibt eine PN an mich (Betreff - Euer Wunsch z.B. Filterscript)
    + So nun schreibt ihr mir was ihr alles in dem Script haben wollt ich werd euch dann sagen ob ich es hinbekomme.
    + Dann machen wir ein groben Preis aus. Ich werde das Script erstellen und es zusammen mit dem Kunden Testen.



    [tab='Kontakt','http://cdn3.iconfinder.com/data/icons/line/36/person_add-48.png']
    edmix23

    + Bitte beim Adden angeben wer ihr seit oder per PN bescheid sagen!
    [tab='Zahlungs Methoden','https://cdn3.iconfinder.com/data/icons/line/36/check_money-32.png']
    +Paypal!
    +Direkte Banküberweisung

  • endlich mal eins auf .ini basis ^^


    schönes Tutorial sehr übersichtlich bei fragen kann man dich doch bestimmt mal per pn nerven oder ? ^^



    Genau das denke ich grad auch... :D

    [tabmenu][tab='Angebote','http://cdn3.iconfinder.com/data/icons/glyph/227/Tag-48.png']

    + Die Preise liegen bei 5-100+€ Ablauf:
    + Entweder ihr addet mich in Skype (PN vorher Schreiben) oder Ihr schreibt eine PN an mich (Betreff - Euer Wunsch z.B. Filterscript)
    + So nun schreibt ihr mir was ihr alles in dem Script haben wollt ich werd euch dann sagen ob ich es hinbekomme.
    + Dann machen wir ein groben Preis aus. Ich werde das Script erstellen und es zusammen mit dem Kunden Testen.



    [tab='Kontakt','http://cdn3.iconfinder.com/data/icons/line/36/person_add-48.png']
    edmix23

    + Bitte beim Adden angeben wer ihr seit oder per PN bescheid sagen!
    [tab='Zahlungs Methoden','https://cdn3.iconfinder.com/data/icons/line/36/check_money-32.png']
    +Paypal!
    +Direkte Banküberweisung

  • EaX131: Der Code ist von mir, nur gibt es in PHP die Möglichkeit, eigene Funktionen zu schreiben - das habe ich nicht gemacht ;)


    @TheO: txt-Dateien ja, solange sie den „Key=Wert\n“-Aufbau haben
    Design mit CSS, genau
    Dateien bearbeiten kommt später ;)


    Fragen per PM erlaubt, wenn ihr es nicht übertreibt :whistling:

  • Erster :P

    Sehr schönes Tutorial. Hilft den PHP Anfängern [denke ich mal] sehr viel.

    Dazu ist es geschrieben :D
    Danke für das Feedback :thumbup: Ich denke mal, heute Abend werde ich zeigen, wie man den Account speichert :thumbup:

  • :(


    Jetzt gibt es noch mehr 08/15 Server mit einem Control Panel.


    Aber sonst: gutes Tutorial. 10/10


  • Wie bitte? Entweder habe ich keine Ahnung, oder du hast keine Ahnung, aber soweit ich weiss ist das mit dem Session-Namen Bloedsinn. Stimme dir aber voll und ganz zu, dass die session neu generiert werden muss, sobald der Login erfolgreich war - das reduziert die Gefahr eines Session-Hijacking.
    Deine Erklaerung einer Session-Hijacking ist sehr schwammig und ich bin mir nicht sicher, ob du das Prinzip korrekt verstanden hast. Unter session-hijacking versteht man bei Webservern mit PHP, dass der Angreifer dem Opfer einen Link zukommen laesst, bei dem die "PHPSESSID" gesetzt ist. Wenn der server nicht session_regenerate_id bei dem Login benutzt, dann ist es dem Angreifer moeglich die Session zu stehlen, da er die PHPSESSID kennt, welche die Login daten des Opfers nun hat (da sich dieser ueber den Link eingeloggt hat). Siehe dazu auch Wikipedia und consus.de (auf consus werden Gegenmassnahmen erlaeutert).


    Das mit dem Session-Namen ist bloedsinn - denn session Daten werden auf dem Server gespeichert. Um also die Session Daten in der Weise zu erstellen oder zu aendern, wie du es in deinem Video machst braucht man eine PHP auf dem Server (nicht irgendeinem Server, so wie du es dargestellt hast, sondern auf dem angegriffenen Server!), dass heisst es muss bereits eine gravierende Sicherheitsluecke vorhanden sein ueber die eine PHP-Datei auf den Server geschleust wird.
    Des weiteren ist der 'Session Name' ($Test['Name']) letztendlich nicht der Name der Session, sondern nur eine Variable, der Session. Die Session-Variablen werden auf dem Server gespeichert - der Nutzer hat damit nichts am Hut und wenn ich auf meinem Server eine Session mit der Variable "google ist doof" erstelle, so hat das keine Auswirkungen auf den Google server. ;)


    Werde mich gerne eines besseren Belehren lassen, sofern ich etwas falsch verstanden habe.

  • Ähm... dir ist klar, dass Sessions serverseitig gespeichert werden ?
    Also wird das "$_SESSION[logedin]" auf dem Server mit dem Controlpanel gespeichert und ist nur für die Webseite mit dem CP gültig ;)
    Das bedeutet, setzt der Server facebook.com dir die Session logedin auf true, und du gehst auf sa-mp.de ( was ebenfalls logedin nutzt ), ist der Wert auf SAMP anders, weil Facebook und SAMP auf anderen Servern liegen.
    Und es wird nicht der Inhalt von $_SESSION an den Clienten gesendet, sondern eine Session-ID - z.B: "hkgjhzgkjhgkjhgkjzgkj" - und $_SESSION wird im Cache gespeichert.

    PHP
    $_SESSION['logedin'] == true;

    Das geht nicht. PHP-Syntaxregeln ;)
    Und Session-Hijacking ist das klauen von Sessions von anderen Benutzern - das geht nur, wenn die Webseite gehackt wurde ( z.B. durch eine XSS-Lücke ;) )


    Tut mir leid, @.Steven., aber von dir hätte ich mehr Ahnung erwartet :thumbdown:
    Wie SBIKA sagte :thumbup:

  • Werde mich gerne eines besseren Belehren lassen, sofern ich etwas falsch verstanden habe.


    Du hast vollkommen recht. Session Hijacking ist ein anderes Thema. Da wird wie du schon richtig erläuterst, die Session vom User "gestohlen".


    Ich werde meinen Beitrag diesbezüglich ausbessern.



    Zum Thema "Serverdaten".


    Das stimmt natürlich, du kannst die Daten des Users zb. nicht auslesen.
    Aber man kann sich einloggen und das ist das ausschlaggebende.


    Wenn man einmal drin ist, kann man nach weiteren Fehlern (falls vorhanden) suchen.


    Ich wäre gerne bereit dir das zu demonstrieren, wenn du eine PHP Datei online stellst und mir den SessionNamen nennst.

  • Hallo ich habe schon gegoogelt und wild gesucht... Das Script funktioniert soweit,
    aber ich bekomme keinen Zugang zum Datencenter, da es kein FTP ist sonder SFTP ist.
    Und das Script versucht dauerhaft zuzugreifen funkt aber nicht... kann mir jemand helfen

  • Jup - ich gebe dir gerne den ganzen Code ;)


    PHP
    <?php
      session_start();
    
      if(isset($_SESSION['logedin']) && $_SESSION['logedin'] == true)
        echo '???';
      else
        echo'Try 2 hack me :)';
    ?>


    http://tion.bplaced.net/


    Versuche mal, den Text herauszubekommen, wo "???" steht - bis morgen, 18 Uhr, auch wenn das mehr als 3 Sekunden sind ;)


    e:

    Zitat von [LP]Tochnas

    da es kein FTP ist sonder SFTP ist.

    Ich werde das Tutorial dann auch auf SFTP erweitern ;)

  • Ich sehe gerade ich bin über meine eigene Dummheit gestolpert ;)


    Ein Kollege von mir "Dominik" hat es nun auch getestet bei mir und es funktioniert nicht.


    Es funktioniert serverseitig (auf dem selben sever, was ja auch klar ist) aber nicht extern.


    Entschuldigt bitte meine dummen Behauptungen, das Panel sei unsicher.


    Hat man mal wieder etwas dazu gelernt.

  • Ich selbst habe ein Buch für die Sicherheit der Webanwendungen... (fast nie gelesen, nur einmal im Urlaub durchgelesen (alle 200 Seiten)). Wer wissen will was Session Hijacking ist, öffnet den Expander. Ich habe direkt aus dem Buch zitiert.






    Zitat
    Spoiler anzeigen


    Session-Hijacking


    Lg Cal44

  • Ich sehe gerade ich bin über meine eigene Dummheit gestolpert ;)
    Ein Kollege von mir "Dominik" hat es nun auch getestet bei mir und es funktioniert nicht.
    Es funktioniert serverseitig (auf dem selben sever, was ja auch klar ist) aber nicht extern.
    Entschuldigt bitte meine dummen Behauptungen, das Panel sei unsicher.
    Hat man mal wieder etwas dazu gelernt.

    Einsicht ist der erste Schritt zur Besserung :thumbup:
    Ich entwickle seit 4 Jahren PHP und meine Webseiten wurden bis jetzt nur 1 mal gehackt - das hatte der Hacker allerdings schon Zugriff auf dem Server, wo die Webseite lag :thumbdown:
    Ich kenne mich mit Sicherheit aus :D


    e: Cal44 aka Mert: Danke für die Zusammenfassung :thumbup: