Thread Author: emblinux
Thread ID: 2403
Thread Info
Es gibt 50 Beiträge zu diesem Thema, und es wurde 6090 mal angesehen.
Wer ist hier? 1 Gäste

 Thema drucken
Mitloggen der Fehllogins
emblinux
Im Internet gibt es einige Dienstanbieter, die mitloggen,wie oft sich jemand mit einem Account falsch eingelogt hat. So wird es z.B. bei GMX gemacht. Nach dem Login wird einem angezeigt ob und wie oft sich jemand mit deinem Account anmelden wollte und der Conter wird wieder zurückgesetzt.

Damit kann man feststellen, ob der Account versucht wird zu knacken. Also hbe ich mir gedacht, das könnte man doch vieleicht bei PHP-Fusuion auch gebrauchen, wer es denn braucht. Also habe ich mir dazu auch mal wieder ein Paar Gedanken gemacht und folgendes kam als Lösung dabei raus.

Wir brauchen ein neues Tabellenfeld in der User-Tabelle und kleinere Anpassungen an der maincore.php und der user_info_panel.php.

Zuerst legen wir mal das Tabellenfeld an. Der Datentyp des Feldes ist SMALLINT mit der Länge 2 und dem Attribute UNSIGNED. Dafür könnt ihr phpMyAdmin benutzen oder das wieder über ein Panel anlegen.

FÜr die Panelvariante geht ihr folgendermaßen vor:
1. Adminbereich -> Systemadmin -> Panels
2. Neues Panel anlegen
3. Panelnamen festlegen
4. bei Panel-Content kommt folgendes hin: dbquery("ALTER TABLE ".DB_USERS." ADD user_faillogin SMALLINT( 2 ) UNSIGNED NOT NULL");
5. Admin-Passwort eingeben und auf VORSCHAU klciken, nicht auf Speichern
6. sollte keine Fehlermeldung kommen, dann ist das Feld angelegt

Jetzt kommen wir zu den Anpassungen in der maincore.php, diese einfach mal öffnen und folgendes suchen:

Code 

if (isset($_POST['login']) && isset($_POST['user_name']) && isset($_POST['user_pass']))
  {                                                                                   
    $user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_POST['user_name']));
    $user_pass = md5($_POST['user_pass']);                                                         
    $result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='".$user_name."' AND user_password='".md5($user_pass)."' LIMIT 1");
    if (dbrows($result))                                                                                                             
      {                                                                                                                             
        $data = dbarray($result);                                                                                                   
                $cookie_value = $data['user_id'].".".$user_pass;                                                                     
                if ($data['user_status'] == 0) {                                                                                     
                        $cookie_exp = isset($_POST['remember_me']) ? time() + 3600 * 24 * 30 : time() + 3600 * 3;                   
                        header("P3P: CP='NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM'");                                           
                        setcookie(COOKIE_PREFIX."user", $cookie_value, $cookie_exp, "/", "", "0");                                   
                        redirect(BASEDIR."setuser.php?user=".$data['user_name'], true);                                             
                } elseif ($data['user_status'] == 1) {                                                                               
                        redirect(BASEDIR."setuser.php?error=1", true);                                                               
                } elseif ($data['user_status'] == 2) {                                                                               
                        redirect(BASEDIR."setuser.php?error=2", true);                                                               
                }                                                                                                                   
      }                                                                                                                             
    else                                                                                                                             
      {                                                                                                                             
        redirect(BASEDIR."setuser.php?error=3");                                                                                     
      }                                                                                                                             
  }



und ändert das in:

Code 

if (isset($_POST['login']) && isset($_POST['user_name']) && isset($_POST['user_pass']))
  {                                                                                   
    $user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_POST['user_name']));
    $user_pass = md5($_POST['user_pass']);                                                         
    $result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='".$user_name."' AND user_password='".md5($user_pass)."' LIMIT 1");
    if (dbrows($result))                                                                                                             
      {                                                                                                                             
        $data = dbarray($result);                                                                                                   
                $cookie_value = $data['user_id'].".".$user_pass;                                                                     
                if ($data['user_status'] == 0) {                                                                                     
                        $cookie_exp = isset($_POST['remember_me']) ? time() + 3600 * 24 * 30 : time() + 3600 * 3;                   
                        header("P3P: CP='NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM'");                                           
                        setcookie(COOKIE_PREFIX."user", $cookie_value, $cookie_exp, "/", "", "0");                                   
                        redirect(BASEDIR."setuser.php?user=".$data['user_name'], true);                                             
                } elseif ($data['user_status'] == 1) {                                                                               
                        redirect(BASEDIR."setuser.php?error=1", true);                                                               
                } elseif ($data['user_status'] == 2) {                                                                               
                        redirect(BASEDIR."setuser.php?error=2", true);                                                               
                }                                                                                                                   
      }                                                                                                                             
    else                                                                                                                             
      {                                                                                                                             
        //Falscher Login
        // erst mal prüfen, ob der user überhaupt existiert
        if ( dbrows(dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='".$user_name."' LIMIT 1")) == 1 )                           
          {
             //wenn user existiert, dann zähle den Wert für Fehllogin hoch
            dbquery("UPDATE ".DB_USERS." SET user_faillogin=user_faillogin+1 WHERE user_name='".$user_name."'");
          }                                                                                                                         
        redirect(BASEDIR."setuser.php?error=3");                                                                                     
      }                                                                                                                             
  }



Dann öffnet die user_info_panel.php und such nach:

Code 

$msg_count = dbcount("(message_id)", DB_MESSAGES, "message_to='".$userdata['user_id']."' AND message_read='0'AND message_folder='0'");


und fügt davor folgendes ein:

Code 

        // Wenn Fehllogins, dann Anzeige und zuruecksetzen
        if ( $userdata['user_faillogin'] > 0 )
          {
            echo "<div align='center' style='color:#ff0000; font-weight: bold;'>Es wurde ".$userdata['user_faillogin']." mal versucht sich mit deinem Account anzumelden.</div>";
            dbquery("UPDATE ".DB_USERS." SET user_faillogin=0 WHERE user_id='".$userdata['user_id']."'");
          }



So das wars auch schon. Den Text für die Ausgabe könnt ihr natürlich gerne abändern. Man kann das ganze auch wieder etwas rofessioneller machen, in dem man das in eine Variable in der entsprechenden Sprachdatei macht, aber das ist dann jedem selbst überlassen.

Auch hier gilt, ich übernehme keine Haftung für irgendwelche Schäden, die entstehen könnten. Daher macht auch hier vorher ein Backup der zu ändernden Dateien.

Für Lob und konstruktiever Kritik bin ich natürlich immer offen. Man kann das ganze jetzt auch noch dahingehend erweitern, das man bei Fehllogins die daten des vermeintlichen Angreifers in eine extra Tabelle speichert. (Datum, IP, Passwortversuche ...) Das nimmtdann aber schon ausmaße einer Infusion an, mit der man das ganze auch noch in einer Übersicht darstellen kann, um dem ganzen nachzugehen.

Wer das machen möchte kann dazu gerne diesen Hack benutzen. Ich sehe darin nur sehr wenig Sinn, diese Daten mit abzuspeichern, da es einerseits rechtliche Probleme verursachen kann und andererseits ist es fraglich, ob man an den "Angreifer" überhaubt heran kommt.

Eine Diskussion über Sinn oder Unsinn dieses Mods/Hacks möchte ich hier nicht haben.

EDIT: Wer das gerne testen möchte, kann dies wieder hier tun: http://emblinux.ath.cx/fusion7/news.php
User: tester
PW: 123456
Aber nur solange der Rechner an ist.
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
SC-Ad-Bot
 
DjMicha1985
geil geil geil ... einfach nur hammer dirk. Funzt super!
 
JC Drago
Wie immer klasse Arbeit.

Zu dem rest schweige ich wegen der nicht gewünschten Diskussion Wink
Man muss nicht alles wissen....nur wo´s steht.

_______________________________________
KEIN Support per Mail, ICQ oder PN !
 
mrburns
huhu meine frage ist wo wird mir das ganze dann angezeigt? in der db oder im user info panel? oder wo
gruss christian
 
Run
Er hat es ja schon beschrieben genauer lesen.
und laut code wird es dann im user_info_panel angezeigt
Gruß Run

Zitat emblinux schrieb:


Dann öffnet die user_info_panel.php und such nach:

Code 

$msg_count = dbcount("(message_id)", DB_MESSAGES, "message_to='".$userdata['user_id']."' AND message_read='0'AND message_folder='0'");


und fügt davor folgendes ein:

Code 

        // Wenn Fehllogins, dann Anzeige und zuruecksetzen
        if ( $userdata['user_faillogin'] > 0 )
          {
            echo "<div align='center' style='color:#ff0000; font-weight: bold;'>Es wurde ".$userdata['user_faillogin']." mal versucht sich mit deinem Account anzumelden.</div>";
            dbquery("UPDATE ".DB_USERS." SET user_faillogin=0 WHERE user_id='".$userdata['user_id']."'");
          }



So das wars auch schon. Den Text für die Ausgabe könnt ihr natürlich gerne abändern. Man kann das ganze auch wieder etwas rofessioneller machen, in dem man das in eine Variable in der entsprechenden Sprachdatei macht, aber das ist dann jedem selbst überlassen.


www.radio-af.net/images/linkus/header460x60.jpg
 
emblinux
Also in der DB kann schon mal gar nichts angezeigt werden, sondern dort können nur Daten gepseichert, gelöscht oder abgerufen werden.

In der Beschreibung erwähne ich ja, das man die Datei user_info_panel.php anpassen muss, also kann das ja nur heißen, das dort die Ausgabe erfolgt.
Wer nun kein User Info Panel benutzt, weil er einen Login im Header hat und dort auch alles angezeigt wird, na dann muss man das halt dort entsprechend einbinden.

Meine Anleitungen beziehen sich meistens auf die Standard Fusion, da ich nicht alle Modifikationen berücksichtigen kann.
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
mrburns
ok danke dann muss ich mal schauen wo ich es bei mir einbinden muss
 
DjSusnhine
Ich find das ist ne gute sache. Leider frage ich mich wie nenne ich das Tabelenfeld. Hab zwar jetzt mit dem Namen 5 eins gemacht bekomm aber nichts angezeigt im Panel. Hmm
sig.sysprofile.de/pcgh/sysp-118126.gif
 
emblinux
Kannst du nicht LESEN ?! ES steht doch alles da.

Zitat FÜr die Panelvariante geht ihr folgendermaßen vor:
1. Adminbereich -> Systemadmin -> Panels
2. Neues Panel anlegen
3. Panelnamen festlegen
4. bei Panel-Content kommt folgendes hin: dbquery("ALTER TABLE ".DB_USERS." ADD user_faillogin SMALLINT( 2 ) UNSIGNED NOT NULL");
5. Admin-Passwort eingeben und auf VORSCHAU klciken, nicht auf Speichern
6. sollte keine Fehlermeldung kommen, dann ist das Feld angelegt


Wenn du dich exakt an die Anleitung hälst, hast du keinerlei Probleme.
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
DjSusnhine
ok ok hab es überflogen. Wenn ich das feld mit panelfuktion angelegt habe sollte es in mysql doch sein wo ist es unter fusion_user ist nix drin
sig.sysprofile.de/pcgh/sysp-118126.gif
 
emblinux
Dann wirst du wohl was falsch gemacht haben. Wenn du per phpMyadmin auf die Datenbank kommst, dann leg das Feld doch manuell an.

Die Anleitung ist so simpel als auch einfach. Aber es gibt immer wieder einige, die nicht oder nicht richtig lesen können. Dieses Thema wurde schon mehr als 100 mal aufgerufen, also haben es auch schon einige davon eingebaut, und das ohne Probleme. Also muss es doch an dir liegen...?
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
DjSusnhine
Super System hat man es eingaut sieht man ob sich einer versucht hat mit dem Acc einzulogen. Gut gemacht. Das ist eine zusäztliche absicherung
Bearbeitet von DjSusnhine am 12.02.2010 um 14:16
sig.sysprofile.de/pcgh/sysp-118126.gif
 
mrburns
also ich hab das user info panel von marcusg drauf und hab code an der besagten stelle eingesetzt da ich die zeile zwei mal hab hab ich sie auch an beiden einzeln eingesetzt und auch zusammen aber ich bekomm nicht angezeigt maincore ist geändert und das tabellenfeld ist auch in der db
gruss christian

ok hat sich erledigt hatte nen kleinen fehler drin nun geht doch
Bearbeitet von mrburns am 12.02.2010 um 16:52
 
emblinux
Wie bereist gesagt, gehe ich immer vom Standard aus. Wenn du was anderes verwendest, musst du schauen wie und wo du es einbauen musst. Dabei muss man natürlich einiges beachten.

Hast du dich denn mal falsch eingelogt und danach richtig. Dann sollte dir angezeigt werden, das versucht worde 1 mal sich anzumelden, was fehlschlug.
Gleichzeitig wird der wert wieder zurückgesetzt, so dass nach einem Neuladen der Seite nichts mehr angezeigt wird. Deshalb macht es auch wenig Sinn, das an 2 Stellen einzubinden, es wird nur an einer Stelle angezeigt.

Dabei sollte schon klar sein, das der Zähler nur hochgezählt wird, wenn man den richtigen Loginnamen aber das falsche Passwort eingibt. Anders geht es auch gar nicht.
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
mrburns
ja hab wieder abgeändert das es nur bei member in der user_info_panel steht das das nur bei pw geht war klar ich hatte nur nie ne anzeige bekommen und hatte öffter das falsche pw eingegeben danach hab ich noch ne lehrzeile in der user php weggemacht und dann ging es plötzlich weiss nicht warum weil lehrzeile ja eigentlich nichts macht aber jetzt funktioniert es auf jeden fall klasse arbeit von dir und ne super idee danke
gruss christian
 
Mytelion
Nabend ich habe folgendes Prob wen ich über Panel anlegen die DB setzten möchte.

Code 

Parse error: parse error, expecting `','' or `';'' in S:\xampp\htdocs\administration\panel_editor.php(128) : eval()'d code on line 2


ich habe mir die panel_editor.php auch neu gesaugt aber immer noch der selbe fehler!

in der Besagten zeile steht das dort drinne
[geshi=php] eval($panel_content);
[/geshi]

Und so schaut es aus wen ich den db code ins Panel setzte

Code 

openside("MitloggenderFehllogins");
  echo "dbquery("ALTER TABLE ".DB_USERS." ADD user_faillogin SMALLINT( 2 ) UNSIGNED NOT NULL");";
closeside();


>>>Ich habe keine schreibfehler ich denke nur zu schnell ^^<<<
 
emblinux
Ließ dir bitte nochmal genau die Anleitung durch. Da steht nichts davon, das du das ausgeben sollst, sondern ausführen.

nicht !!!

Code 

echo "dbquery("ALTER TABLE ".DB_USERS." ADD user_faillogin SMALLINT( 2 ) UNSIGNED NOT NULL");";



sondern

Code 

dbquery("ALTER TABLE ".DB_USERS." ADD user_faillogin SMALLINT( 2 ) UNSIGNED NOT NULL");




Wer lesen kann ist klar im Vorteil.
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
Mytelion
Hmm da kommt aber der Gleiche fehler

Fehler

Code 

Parse error: parse error, expecting `','' or `';'' in S:\xampp\htdocs\administration\panel_editor.php(128) : eval()'d code on line 2



und so schaut das im panel aus

Code 

openside("name");
  echo "dbquery("ALTER TABLE ".DB_USERS." ADD user_faillogin SMALLINT( 2 ) UNSIGNED NOT NULL");
closeside();



>>>EDIT mein fehler ich habs jetzt nur noch TESt obs dann auch angezeigt wird.<<<
So ich habe jetzt 6 mal Password und 6 mal Login namen falsh angegeben aber ich bekomme keine nachricht das jemand versucht hat sich andersweitig einzuloggen!
hir mein user info panel

Code 

if (iMEMBER) {
   openside($userdata['user_name']);
        // Wenn Fehllogins, dann Anzeige und zuruecksetzen
        if ( $userdata['user_faillogin'] > 0 )
          {
            echo "<div align='center' style='color:#ff0000; font-weight: bold;'>Es wurde ".$userdata['user_faillogin']." mal versucht sich mit deinem Account anzumelden.</div>";
            dbquery("UPDATE ".DB_USERS." SET user_faillogin=0 WHERE user_id='".$userdata['user_id']."'");
          }
   $msg_count = dbcount("(message_id)", DB_MESSAGES, "message_to='".$userdata['user_id']."' AND message_read='0'AND message_folder='0'");
//So that we can calculate if inbox is full:
   $msg_settings = dbarray(dbquery("SELECT * FROM ".DB_MESSAGES_OPTIONS." WHERE user_id='0'"));
   $inbox_total = dbcount("(message_id)", DB_MESSAGES, "message_to='".$userdata['user_id']."' AND message_folder='0'"); 
   
if($newpm){
   $msg_count = dbcount("(message_id)", DB_MESSAGES, "message_to='".$userdata['user_id']."' AND message_read='0'AND message_folder='0'");
   if($msg_count){
      echo "<a href='".BASEDIR."messages.php' class='side'><img src='".UIPIMG."pm1.png' border='0' /> ".sprintf($locale['UIP_0300'], $msg_count).($msg_count == 1 ? $locale['UIP_0301'] : $locale['UIP_0302'])."</a>\n<hr>";
   }else{
      if($nonewpm){
         echo "<img src='".UIPIMG."pm0.png' />".$locale['UIP_0304']."\n<hr>";
      }
   }
   if ($msg_settings['pm_inbox'] <= $inbox_total) {
      echo " <a href='".BASEDIR."messages.php' class='side'><img src='".UIPIMG."inbox_full.png' border='0' alt='!' title='".$locale['msg_full']." [$inbox_total/".$msg_settings['pm_inbox']."]' />".$locale['msg_full']." [$inbox_total/".$msg_settings['pm_inbox']."]</a>\n<hr>";
  }
}


Bearbeitet von Mytelion am 19.03.2010 um 18:01
>>>Ich habe keine schreibfehler ich denke nur zu schnell ^^<<<
 
emblinux
hast du auch die Änderung in der maincore.php gemacht.?
Das Lernen ist wie ein Meer ohne Ufer. Konfuzius

Alles wird Gut!

KEIN Support per Mail, ICQ oder PN !
www.heiseclan.de/fusion/sig.gif

www.heiseclan.de/geosig.gif
 
Mytelion
Jup habe ich schaue hir

Code 

      closedir($dh);
      if (!defined("THEME")) {
         return false;
      }
   }
}

if (isset($_POST['login']) &&  isset($_POST['user_name']) && isset($_POST['user_pass']))
  {                                                                                   
    $user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_POST['user_name']));
    $user_pass = md5($_POST['user_pass']);                                                         
    $result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='".$user_name."' AND user_password='".md5($user_pass)."' LIMIT 1");
    if (dbrows($result))                                                                                                             
      {                                                                                                                             
        $data = dbarray($result);                                                                                                   
                $cookie_value = $data['user_id'].".".$user_pass;                                                                     
                if ($data['user_status'] == 0) {                                                                                     
                        $cookie_exp = isset($_POST['remember_me']) ? time() + 3600 * 24 * 30 : time() + 3600 * 3;                   
                        header("P3P: CP='NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM'");                                           
                        setcookie(COOKIE_PREFIX."user", $cookie_value, $cookie_exp, "/", "", "0");                                   
                        redirect(BASEDIR."setuser.php?user=".$data['user_name'], true);                                             
                } elseif ($data['user_status'] == 1) {                                                                               
                        redirect(BASEDIR."setuser.php?error=1", true);                                                               
                } elseif ($data['user_status'] == 2) {                                                                               
                        redirect(BASEDIR."setuser.php?error=2", true);                                                               
                }                                                                                                                   
      }                                                                                                                             
    else                                                                                                                             
      {                                                                                                                             
        //Falscher Login
        // erst mal prüfen, ob der user überhaupt existiert
        if ( dbrows(dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='".$user_name."' LIMIT 1")) == 1 )                           
          {
             //wenn user existiert, dann zähle den Wert für Fehllogin hoch
            dbquery("UPDATE ".DB_USERS." SET user_faillogin=user_faillogin+1 WHERE user_name='".$user_name."'");
          }                                                                                                                         
        redirect(BASEDIR."setuser.php?error=3");                                                                                     
      }                                                                                                                             
  }


if (isset($_COOKIE[COOKIE_PREFIX.'user'])) {
   $cookie_vars = explode(".", $_COOKIE[COOKIE_PREFIX.'user']);
   $cookie_1 = isnum($cookie_vars['0']) ? $cookie_vars['0'] : "0";
   $cookie_2 = (preg_check("/^[0-9a-z]{32}$/", $cookie_vars['1']) ? $cookie_vars['1'] : "");
   $result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_id='$cookie_1' AND user_password='".md5($cookie_2)."' LIMIT 1");
   unset($cookie_vars,$cookie_1,$cookie_2);
   if (dbrows($result)) {
      $userdata = dbarray($result);
      if ($userdata['user_status'] == 0) {
         if ($userdata['user_theme'] != "Default" && file_exists(THEMES.$userdata['user_theme']."/theme.php") && ($settings['userthemes'] == 1 || $userdata['user_level'] >= 102)) {
            if (!theme_exists($userdata['user_theme'])) {
               echo "<strong>".$settings['sitename']." - ".$locale['global_300'].".</strong><br /><br />\n";
               echo $locale['global_301'];
               die();
            }
         } else {
            if (!theme_exists($settings['theme'])) {
               echo "<strong>".$settings['sitename']." - ".$locale['global_300'].".</strong><br /><br />\n";
               echo $locale['global_301'];
               die();
            }
         }



>>>EDIT ich habe das User info panel von MarcusG fals es wichtig ist?!<<<
Bearbeitet von Mytelion am 19.03.2010 um 19:22
>>>Ich habe keine schreibfehler ich denke nur zu schnell ^^<<<
 

Springe ins Forum:
Datalus