# [OOP] Meine Anti-Brutoforce Login-Klasse für euch!!



## firstlord18 (28. Oktober 2005)

Hallo,

 naja, ich habe mir vorgenommen, OOP zu lernen. Kurzerhand habe ich eine Login Funktion geschrieben! Das Zip-Archiv ist im Anhang! Kritik, Bugreports, Verbesserungsvorschläge etc, bitte hier!

  Hier der Readme-Ausschnitt aus login_class.php:


```
/********************************************************
  *
  * 
  * Login_class.php Version 1.3
  * (28.10.2005)
  * 
  * Known Bugs:
  *    -  non
  *   
  * ToDO:
  *    -  Nichts. Aber nicht zögern, mir zu schreiben
  *       falls Ihr Wünsche etc habt!
  *
  ********************************************************
  * 
  * Dieses Script darf frei kopiert und modifiziert
  * werden! Der Hinweiß auf den Autor darf nicht
  * entfernt werden! 
  *
  ********************************************************
  *
  * 
  * Features:
  *    -  einfache Installation
  *    -  Supervisor, welcher direkt in dieser Datei
  *       angepasst werden kann! Hat immer Zugriff 
  *         als Admin!
  *    -  Benutzung von Sesseions und/oder Cookies
  *       zur Authentifizierung!
  *    -  Debugging ein- bzw ausstellbar!
  *    -  Cookie-lebensdauer festlegbar!
  *      -  Cookiename einstellbar!
  *    -  Maximale Anzahl an fehlgeschlagenen
  *         Logins in einer bestimmten Zeitspanne 
  *       einstellbar!
  *      -  Einfach Verwendung (Siehe Anwendungsbeispiele!)
  *    -  Bei jedem Aufruf einer Secret Area wird 
  *       überprüft, ob der User das Recht hat, die Page
  *       zu sehen!
  *    -  Bestimmte Bereiche festlegbar, welche nur 
  *       Admins sehen dürfen!
  *    -  Falls ein User ohne Authentifizierung eine
  *       geschützte Seite aufruft, wird das Login
  *       Formular auf dieser Seite angezeigt und
  *       er ist danach auch direkt auf dieser Seite!
  *    -  Anti-Hacker Schutz mit Simulierung einer
  *       variablen Antwortzeit des Servers, um Massen-
  *       requests zu blocken!
  *
  ********************************************************
  *
  * Installation:
  *    -  Die Variablen unter diesem Kommentar anpassen!
  *    -  Es werden nur 2 MySQL tabellen benötigt. Die 
  *       install.php ausführen (es werden nun die Tabellen 
  *       angelegt), und danach unbedingt LÖSCHEN!
  *    -  Als Supervisor einloggen (Daten können in dieser
  *       Datei geändert werden ($cfg['user'],$cfg['pass']))
  *       und neue User/Admins erstellen!
  *
  ********************************************************
  *
  * Verwendung:
  *    -  Bitte die Datei login_class.php am Anfang der 
  *       Seite einbinden! z.b. require_once('login_class.php');
  *    -  In eine Seite mit geschütztem Inhalt folgendes einfügen,
  *       um den User zu überprüfen! Falls die Überprüfung
  *       fehlschlägt, wird das Formular angezeigt:
  *
  *             ********** CODE: ***********
  *             if( !($auth->may_person_view()) ) {
  *                $auth->show_redirect_form();
  *                exit();
  *            }
  * 
  *     -  Bitte die Datei admin.php in das Verzeichnis
  *        der zu schützenden Seite kopieren!
  *     -  Falls man Admin Rechte hat, bekommt man ein Link
  *        zu admin.php angezeigt, wo ma User erstellen
  *        und löschen kann! 
  *       -  Admin Bereiche lassen sich wie folgt schützen:
  *
  *           ********** CODE: ***********
  *            if( $auth->secureAdmin() ) {
  *                // ...Admin Bereich
  *            }    
  *
  *      -  Der Logout wird wie folgt aufgerufen:
  *             $auth->doLogout(); 
  *
  *      -  Also nochmal ein ganzes Beispiel:
  *
  *          <?php
  *            include('login_class.php');            
  *                    
  *            if( !($auth->may_person_view()) ) {
  *                $auth->show_redirect_form();
  *                exit();
  *            }    
  *
  *          // Ab hier fängt der Bereich an,
  *          // den eingeloggte User/ Admins sehen:
  *
  *            if($_GET["kill"] == "yes")
  *                $auth->doLogout();
  *                
  *            echo "Hallo User!";        
  *
  *            if( $auth->secureAdmin() ) {
  *                // Diesen Bereich zwischen den
  *              // geschweiften Klammern sehen nur
  *              // Admins!
  *            
  *            }
  *            
  *            // Das hier sehen nun auch wieder die
  *          // Normalen User:
  *
  *          // Link zum Logout!
  *          echo "<br><a href='?kill=yes'>logout!</a>";
  *            ?>
  *
  ********************************************************
  *
  * Bei Fragen, Kritik, Lob, Verbesserungsvorschlägen,
  * Bugreports etc, bitte entweder eine Email an mich
  * oder im ICQ melden, oder auf asd vorbeischauen!
  *
  * Und nun viel Spaß bei der Benutzung!
  *
  ********************************************************/
```
 *EDIT:* NEUE VERSION 1.2:

```
<?php
  /********************************************************
  * CHANGELOG:
  *    v1.1 to v1.2:
  *    -  Man kann festlegen, ob man Notices angezeigt 
  *       haben möchte, oder nicht!
  *    -  Überprüfung auf install.php, sodass das Script
  *       nicht läuft, wenn man diese nicht gelöscht hat!
  *    -  Die install-Funktion wurde aus der Klasse entfernt
  *       und ist nur noch in der install.php enthalten
  *    -  Bugfix im SQL der Fkt db_install() wurde behoben!
  *    -  Alle Notices entfernt!
  *
  *********************************************************/
 ?>
```
 *EDITENDE*

*Edit²*
 Neue version 1.3, Changelog:

```
/********************************************************
  * CHANGELOG:
  *    v1.2 to v1.3:
  *    -  Bei Cookiebasiertem Login werden die Daten nun 
  *       in nur einem Cookie gespeichert! Dazu werden sie
  *       zu einem String zusammengefügt, getrennt durch einen
  *       Seperator!
  *    -  Cookie-String-Seperator lässt sich einstellen.
  *    -  Pfad, in dem Cookie gilt, lässt sich nun auch
  *       bei den $cfg - Variablen anpassen!
  *    -  kleinen Bugfix. PHPSESSID-Cookie wird nun nur
  *       gelöscht, falls Sessions aktiviert sind!
  *    -  Weitere Notices behoben!
  *
  *********************************************************/
 ?>
```
 *Editende!*


  Ich hoffe, es gefällt euch!
  Und für mein erstes Projekt find ich das ganz ordentlich!

  mfg
  björn


  p.s.: ich habe von keinem einzigen anderen Login Script abgeschaut


----------



## Dr Dau (28. Oktober 2005)

Hallo!

Und warum machst Du nicht gleich ein Tutorial daraus?
Hier in der PHP Ecke wird es sicherlich bald unter den vielen anderen Threads untergehen.

Gruss Dr Dau


----------



## firstlord18 (28. Oktober 2005)

Hm, wenn einfach ein paar hier Lob, Kritik und Bugreports postren, dann geht das sicher nicht allzuschnell unter.
 Naja Tutorial, ich weiß nicht!
 Das ist denk ich etwas zu schwer, denn oft weiß ich garnicht, wie ich genau ausdrücken soll, was un wie ich etwas meine!
 Gibt es hier nicht auch ne Codeschnipsel Sectiopn, wo sowas nicht so schnell untergeht?


----------



## Dr Dau (28. Oktober 2005)

firstlord18 hat gesagt.:
			
		

> .....Gibt es hier nicht auch ne Codeschnipsel Sectiopn, wo sowas nicht so schnell untergeht?.....


Ja, in der Tutorial Ecke.
Aber als "Codeschnipsel" dürfte es wohl "etwas" zu umfangreich sein. 
Du musst ja nicht unbedingt alles Schritt für Schritt erklären, es sollte auch genügen wenn Du an der einen oder anderen Stelle ein Kommentar einfügst, wo steht was in dem Abschnitt den überhaupt geschieht.
Schaue dir doch mal die anderen Tutorials an..... als kleine Anregung.


----------



## FipsTheThief (28. Oktober 2005)

Edit lesen bildet , so 3. Anlauf hab eben den Eintrag gefunden wo ich die Namen angebe zu Beginn, dennoch finde ich die Fehlermeldung die einen zu Beginn um die Ohren fliegt etwas unschön.


----------



## firstlord18 (28. Oktober 2005)

naja, hast du eventuell meine readme gelesen?
 da steht doch, dass man sich als erstes mit dem Supervisor Username und Passwort (welches im Script selbst oben angepasst wird) einloggt, und dann neue User erstellt! Man muss garnix an der DB machen.
   Außerdem kannste ja auch einstellen, dass du gerne 100 failed Logins erlaubst, dann kannste wieder einloggen!
   Nur eben die Readme ma bissi lesen!

  edit zu deinem nachtrag: Waurm am Install Script arbeiten? es legt einfach keinen User an, ganz einfach!
*
 edit zu deinem edit*: welche fehlermeldung? wenn du einfach nur die install ausfürhst, und dich danach mit dem supervisor user & Passwort einloggst, dann kommt doch keine Fehlermeldung!? Beschreibe bitte ganuer, was du meinst!


----------



## Dr Dau (28. Oktober 2005)

Ich habe das Script jetzt nicht getestet.
Kommentare sind aber ja schon genug drin.
Wenn Du es als Tutorial veröffentlichst, solltest Du evtl. noch dazu schreiben dass es Fehler enthalten könnte und nur als "experimentel" anzusehen ist.
Auch solltest Du dazu schreiben was für Voraussetzungen gestellt werden..... MySQL Version, PHP Version, Rootrechte auf die Datenbank (?) und ob bestimmte Einstellungen in der php.ini vorgenommen werden müssen.
Wenn ich es richtig sehe, ist es nicht nur einfach ein Login, sondern auch einer Userverwaltung..... Du solltest also evtl. noch näher drauf eingehen welchen Verwendungszweck das Script hat.


----------



## FipsTheThief (28. Oktober 2005)

Jop nun klappte es , nur die Fehlermeldungen sind nervig , naja sind keine Fehlermeldungen im dem Sinne sonderen eher ne Notiz das ein Index nicht existiert.

Aber davon fliegen mir ein haufen um die Ohren :

```
/* admin.php */

Notice: Undefined index: loginuser in C:\www\login_class\login_class.php on line 753

Notice: Undefined index: loginpass in C:\www\login_class\login_class.php on line 753

Notice: Undefined index: user in C:\www\login_class\login_class.php on line 759

Notice: Undefined index: pass in C:\www\login_class\login_class.php on line 759

Notice: Undefined index: checkit in C:\www\login_class\login_class.php on line 493

Notice: Undefined variable: logged_in in C:\www\login_class\login_class.php on line 522
```

dann noch :

wenn ich eingeloggt bin.

```
Notice: Undefined index: kill in C:\www\login_class\admin.php on line 9

Notice: Undefined index: action in C:\www\login_class\admin.php on line 15

Notice: Undefined index: action in C:\www\login_class\admin.php on line 32
```

Diese kommen bei jedem Formular , letzteres also das wenn ich im Adminbereich bin kommt nicht sobald ich mich über die Beispiel Seite einlogge.Wenn ich den Admin Bereich öffne dann erscheint es dort ebenfalls.

Des Undefind index: kill steht irgendwie ewig und geht gar nicht weg.

Schönheitsfehler würde ich sagen und es macht sich nicht unbedingt gut wenn sowas in der Homepage aufploppt.Kann man zwar locker mit einen @ Zeichen unterdrücken aber man sollte es ja vermeiden  das Zeichen zu nehmen.

Erweiterungen würde ich noch die Wahl des automatischen Logins vorschlagen , so das der User wählen kann ob er das nächste mal automatisch eingeloggt werden möchte.So wie mir scheint geschiet das momentan automatisch.

Noch ein Punkt bei den Cookies , warum speicherst du 2 Cookies ab einer würde vollkommen reichen indem du das passwort und den Namen zusammenfügst als Text.
Oder aber du speicherst es in ein Array und behandelst es dann mit serialize. Zum auslesen dann einfach unserialize nutzen wieder und dann die Array Daten lesen.

So genug kritisiert , alles in allem schon ne recht starke Leistung


----------



## firstlord18 (28. Oktober 2005)

aber er spuckt nur Notizen aus, wenn du error_reporting auf E_all stellst, doer?

 Naja, das mit dem autologin ist eigentlich so gewünscht ...

 und das mit den Cookies, stimmt, ich werde das mit serialize machen


----------



## FipsTheThief (28. Oktober 2005)

Naja du musst einfach mal davon ausgehen , das ich nun zum Beispiel an einen anderen Rechner bin , also ich bin auf der Arbeit hab gerade mal Pause und logge mich da ein dann wäre es nicht so schön wenn ich das nächste mal gleich eingeloggt werde. 

Da hätte ich schon gerne die Wahl oki man kann die Cookies löschen was mit dem Opera  eigentlich sehr gut geht ,  aber schöner wäre die Wahl. So das Tüpfelchen auf dem i , sozusagen das Sahnehäubchen 

Ja ich habe Error Reporting All an  Aber das hat mein Webspace auch also muss ich da mit dem gleichen rechnen und dort kann ich nicht in der php.ini rumfummeln 

Immer davon ausgehen den dümmsten Anzunehmenden User vor sich zu haben der das Login 3 mal versaut so wie ich


----------



## firstlord18 (28. Oktober 2005)

hm, mist. Leider weiß ich nicht, wie man diese Notizen wegbekommt :/ Vllt statt sachen wie $_GET["kill"] == "yes" eher isset($_GET["kill"]) nutzen ...


----------



## FipsTheThief (28. Oktober 2005)

naja einfach schaun ob es gesetzt ist 

if(isset($_GET['kill']){
  ...
}else{
...}

oder halt @$_GET['kill'] <- wobei das nicht der elgante Weg ist auch wenn es kürzer ist


----------



## firstlord18 (28. Oktober 2005)

*Re: [OOP] Meine Anti-Brutoforce Userverwaltungs-Klasse für euch!! [Neue Version!]*

Ok, habe oben die neue Version eingefügt! Sie bietet einige neue Konfigurationsmöglichkeiten, alles wird in einem Cookie gespeichert, sie ist sichere, da die install.php gelöscht werden muss etc. ...

  Changelog:

  NEUE VERSION 1.2:

```
<?php
   /********************************************************
   * CHANGELOG:
   *	v1.1 to v1.2:
   *	-  Man kann festlegen, ob man Notices angezeigt 
   *	   haben möchte, oder nicht!
   *	-  Überprüfung auf install.php, sodass das Script
   *	   nicht läuft, wenn man diese nicht gelöscht hat!
   *	-  Die install-Funktion wurde aus der Klasse entfernt
   *	   und ist nur noch in der install.php enthalten
   *	-  Bugfix im SQL der Fkt db_install() wurde behoben!
   *	-  Alle Notices entfernt!
   *
   *********************************************************/
  ?>
```
 


  Neue version 1.3, Changelog:

```
/********************************************************
   * CHANGELOG:
   *	v1.2 to v1.3:
   *	-  Bei Cookiebasiertem Login werden die Daten nun 
   *	   in nur einem Cookie gespeichert! Dazu werden sie
   *	   zu einem String zusammengefügt, getrennt durch einen
   *	   Seperator!
   *	-  Cookie-String-Seperator lässt sich einstellen.
   *	-  Pfad, in dem Cookie gilt, lässt sich nun auch
   *	   bei den $cfg - Variablen anpassen!
   *	-  kleinen Bugfix. PHPSESSID-Cookie wird nun nur
   *	   gelöscht, falls Sessions aktiviert sind!
   *	-  Weitere Notices behoben!
   *
   *********************************************************/
  ?>
```


----------



## Dennis Wronka (29. Oktober 2005)

Ich hab grad mal einen kurzen Blick in den Code geworfen und bin eigentlich auch dafuer, dass Du das hier als Tutorial verewigen solltest.
So ein Thread geht einfach irgendwann unter, und ich denke, dass Deine Klasse fuer einige User durchaus interessant sein koennte.

Wie Dr Dau schon erwaehnt hat muss ja nicht alles haarklein beschrieben und auf jeden einzelnen Befehl eingegangen werden.
Das mach ich auch nicht. Ich erklaer in der Regel den Zweck und kurz die Funktion einzelner, zusammengehoeriger Abschnitte.
Das macht meines Erachtens nach auch mehr Sinn, denn in so einem Tutorial sollen ja nicht die Grundlagen von PHP vermittelt werden, sondern darauf aufgebaut werden.
Das ist zumindest meine Ansicht.
Wuerde ich alle zum Tutorial gehoerigen Grundlagen noch mit in's Tutorial packen wuerde das oft den Rahmen dermassen sprengen, dass das Tutorial wegen Ueberlaenge 2 Zigarettenpausen beinhalten muesste.  So ueberlange Tutorials koennen ja auch durchaus abschreckend wirken.

Du kannst ja die Kommentare aus der login_class.php nutzen. Vielleicht strickst Du noch ein paar Worte drumherum, und fertig ist das Tutorial.
Ich denk mal, das sollte kein wirklich grosses Problem darstellen.


----------



## firstlord18 (29. Oktober 2005)

ja, ok, ich werde wahrscheinlich ein tut draus basteln. Aber erst werde ich das ganze noch ein bischen verbessern


----------



## firstlord18 (29. Oktober 2005)

Das Tutorial ist vollbracht:
http://www.tutorials.de/forum/showthread.php?p=1180560#post1180560


----------



## Dr Dau (29. Oktober 2005)

Dass dauert noch bis es veröffentlicht wird..... zur Zeit kannst nur Du es sehen. 
Da bin ich bei meinem erstem Codeschnippsel auch drauf reingefallen.


----------

