Diese Sessions...

meilon

Erfahrenes Mitglied
Hi,
Sorry das ich euch jetzt auch mal wegen Sessions nerven muss.
Ich habe eine Page gebaut, die bisher nur auf Sessions aufbaut - und das erfolgreich. Nur jetzt möchte ich auch feste Cookies auf dem Client speichern, damit er automatisch eingeloggt wird. Und daran haperts.

Ich habe hier auch schon anregungen gefunden, konnte ich aber bei mir nicht zum laufen bekommen.

Hier mal meine login.php
PHP:
<?
  $login= '
  <form action="index.php" method="post">
  <table border="0" width="94%"><tr>
  <td><font color="#FFFFFF">Name:</font></td>
  <td align="right"><input type="text" name="name" size="12"></td></tr>
  <tr><td><font color="#FFFFFF">Kennwort:</font></td>
  <td align="right"><input type="password" name="pwd" size="12"></td></tr>
  <tr><td>Cookie?</td>
  <td align="right"><input type="checkbox" name="cookie" value=true checked></td></tr>
  <tr><td colspan="2" align="right"><input type="submit" value="Login"></td></tr>
  <tr><td colspan="2" align="center"><br><br><a href="index.php?section=register">Register</a> - <a href="index.php?section=member&sendpass=1">Passwort vergessen</a></td></tr>
  </table>
  </form>';
  
  if (isset($_POST['name'])) {
    $sql = 'SELECT `ID` , `Nick` , `Realname` , `Rang` '
        . ' FROM `users` '
        . ' WHERE 1 AND `Nick` = \''.$_POST["name"].'\' AND `Passwort` = \''.md5 ($_POST["pwd"]).'\' LIMIT 0, 30';
    $result = mysql_query ($sql);

    if (mysql_num_rows($result) > 0)
    {
      $data = mysql_fetch_array ($result);
      $_SESSION['user_id'] = $data['ID'];
      $_SESSION['user_nickname'] = $data['Nick'];
      $_SESSION['user_nachname'] = $data['Realname'];
      $_SESSION['user_rang'] = $data['Rang'];
    }
    else
    {
      $login="<h1>Fehler</h1>Die Zugangsdaten sind falsch!<br><br><a href='index.php'>Zurück</a>";
    }

  }

  if (isset($_POST['logout'])) {
    session_unset();
    session_destroy();
  }

  if (isset($_SESSION['user_id'])) {
    $login='Willkommen '.$_SESSION['user_nickname'].'!<br>';
    $login=$login.'<br>[<a href="index.php?section=member&function=edit">Profil ändern</a>]</br>';
	
	if (round($_SESSION['user_rang']) > 50) {
      $login.='- [<a href="index.php?section=news&function=center">News Center</a>]<br>';
	  $login.='- [<a href="index.php?section=downloads&function=center">Downloads Center</a>]';
    }
	
    $login=$login.'<br><br><form action="index.php" method="post"><input type="Submit" value="Ausloggen"><input type="hidden" name="logout" value="true"></form>';
  }
  $smarty->assign('community', $login);
?>
Noch dazu zu sagen wäre, dass ich mit Smarty arbeite und nun der HTML-Code erst am Ende generiert und ausgegeben wird.
Habt ihr einen Lösungsvorschlag?

mfg
 
ALSO dazu nimmst du ein setcookie() Befehl!

Undzwar setzt du diesen dann wenn der User erfolgreich sich eingeloggt hat, (Bitte nicht ständig) lieferst nach dem Cookie ein HTML REFRESH und EXIT.

In diesen Keks speicherst du Usernamen und Passwort beispielweise durch # getrennt.
Oder du übergibst die Sessionsid, was aber dann nicht so praktisch ist.

dann kannst du den Cookie nach namen abfragen
PHP:
if (isset($_COOKIE[COOKIENAME])){

$a= $_COOKIE[COOKIENAME];
$exploder = explode('#',$a);
$prufusername = $exploder[0];
$prufpw = $exploder[1];
// WICHTIG jetzt prüfst du ob ein User mit den Daten übereinstimmt und das pw naturlich 
//auch ist dies der Fall Session fuer den User anlegen. Wenn nicht Cookie loeschen
}

Den Cookie loescht du in dem Du das Verfallsdatum auf 0 setzt. Ich schau mal nach einem Beispiel noch.

Grüsse!

PS Hier mal ein altes Beispiel
Wichtig
1. OB_START()
2. session_start()

dann

PHP:
<?php
// ##### SICHERHEITSSTUFE NR1 UNSET DER SESSION ####
unset($_SESSION[user_name],$_SESSION[user_rang],$ubrsessstamm,$ubrsessstamm2,$ubrsessstamm3,$ubrsessstamm4);
session_unset();
unset($_SESSION);
$_SESSION[user_name] = "Gast";
$_SESSION[user_id] = "0";
$_SESSION[user_rang] = 0;


// #### SICHERHEITSSTUFE NR2 PRUF OB COOKIE VORHANDEN UND OB GUELTIG ER GUELTIG IST ####
if ($_COOKIE["loger"]) {
$tehcookie = $_COOKIE["loger"];
$thecookie_daten=explode('#*#',$tehcookie);
if (count($thecookie_daten) != 3) { header("Location: delcookie.php"); EXIT; }
}







// ###################################
// ##### DER LOGIN ZUM SERVER ########
// ###################################

if ($login==1 && strlen($username) >= 3 && strlen($passwort) >= 3)
{
if ($_COOKIE["loger"]) { header("Location: delcookie.php"); EXIT; }
$result=mysql_query("SELECT * FROM user WHERE user_name='$username' LIMIT 1");
while($row=mysql_fetch_array($result)){
{
if ($passwort == $row[user_pw] && time() > $row[user_cookie_sperrzeit] && $row[user_badlogin] < 3 && $username == $row[user_name]){
$diezeit=time();
$cookie_inhalt="$username#*#$passwort#*#$diezeit";
mysql_query("UPDATE user SET cookieanlegzeit='$diezeit' WHERE user_name='$row[user_name]' LIMIT 1");
{
setcookie("loger",$cookie_inhalt,time()+60*60*24*2);
}
echo "
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
<HTML>
<HEAD>
<TITLE>ts2.net</TITLE>
<link rel=\"shortcut icon\" href=\"../ts2.ico\">
<META HTTP-EQUIV=REFRESH CONTENT='3; URL=index.php'>
<BODY><div align=\"center\"><br><br><br><br><br>
<table width=\"300\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
		<tr valign=\"top\">
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"296\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
		</tr>
		<tr valign=\"top\">
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"1\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"296\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
		</tr>
		<tr valign=\"top\">
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"1\"></td>
			<td width=\"296\">
				<table width=\"296\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
					<tr height=\"18\" valign=\"top\">
						<td bgcolor=\"#4d6277\" height=\"14\">
							<div align=\"center\">
								<font size=\"2\" face=\"arial\" color=\"white\"><b>Ein Cookie wird angelegt...</b></font></div></td>
					</tr>
					<tr height=\"1\" valign=\"top\">
						<td bgcolor=\"#F7F7F7\" height=\"1\"></td>
					</tr>
					<tr valign=\"top\">
						<td bgcolor=\"#ffcc00\">
							<div align=\"center\">
								<font size=\"1\" face=\"arial\" class=\"size1v\" color=\"#3B3B3B\">Bitte warten Sie 3 Sekunden ab, oder klicken Sie auf weiter falls ihr Browser keine automatische Umleitung unterst&uuml;tzt.<br>
									<br>
									<input type=\"button\" name=\"weiter\" onclick=\"location.href='index.php'\" value=\"weiter\" border=\"0\"></font></div>
						</td>
					</tr>	
				</table>
			</td>
			<td bgcolor=\"#f7f7f7\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
		</tr>
		<tr valign=\"top\">
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"1\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"296\"></td>
			<td bgcolor=\"#f7f7f7\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
		</tr>
		<tr valign=\"top\">
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"296\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
			<td bgcolor=\"#909dab\" width=\"1\"></td>
		</tr>
	</table></div>
<table width=\"300\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" height=\"3\">
	<tr>
		<td></td>
	</tr>
</table>
</BODY>
</HTML>
";
ob_end_flush();
EXIT;
} else { $versuch=$row[user_badlogin]; $versuch++; mysql_query("UPDATE user SET user_badlogin='$versuch' WHERE user_name='$username' LIMIT 1"); }
if ($versuch >= 3) { mysql_query("UPDATE user SET user_badlogin='0' WHERE user_name='$username' LIMIT 1"); $sperrzeit=time() + 300; mysql_query("UPDATE user SET user_cookie_sperrzeit='$sperrzeit' WHERE user_name='$username' LIMIT 1"); header("Location: delcookie.php?error=20,5"); EXIT; }
}
}
}




// ###################################
// ##### SESSION AUSLESEN     ########
// ###################################


// ### Nur prufen ob Cookie geultig ist! SCHLEIFE AUF ####

if ($_COOKIE["loger"]) {
{


// ### Iste der user mit dem COOKIE NICHT VORHANDEN COOKIE loeschen Exit ####
$thecookie = $_COOKIE["loger"];
$thecookie_daten=explode('#*#',$thecookie);
$result=mysql_query("SELECT COUNT(*) FROM user WHERE user_name='$thecookie_daten[0]' LIMIT 1");
while($row=mysql_fetch_array($result)){
if ($row[0] != 1) { header("Location: delcookie.php?error=5"); EXIT; }
}


// ### Jetzt muss user aus Cokkie vorhanden sein PRUF Pass CODE und name und ob log geperrt und ob user gesperrt
$result=mysql_query("SELECT * FROM user WHERE user_name='$thecookie_daten[0]' LIMIT 1");
while($row=mysql_fetch_array($result)){
{
if ($row[user_name] == $thecookie_daten[0] && $row[user_pw] == $thecookie_daten[1]){ $ubrsessstamm = 1; } else { $error ="4"; }
if ($row[user_cookie_sperrzeit] < time() && $row[user_badlogin] < 3) { $ubrsessstamm2 = 1; } else { $error ="20"; }
if ($row[cookieanlegzeit] == $thecookie_daten[2]) { $ubrsessstamm3 = 1; } else { $error ="21"; }
if ($row[user_enable] == 1) { $ubrsessstamm4 = 1; } else { $error ="22"; }
// #### Cookie loeschmasnahmen #####
if ($ubrsessstamm != 1 or $ubrsessstamm2 != 1 or $ubrsessstamm3 != 1 or $ubrsessstamm4 != 1){ mysql_query("UPDATE user SET user_badlogin='0' WHERE user_name='$row[user_name]' LIMIT 1"); $sperrzeit=time() + 300; mysql_query("UPDATE user SET user_cookie_sperrzeit='$sperrzeit' WHERE user_name='$row[user_name]' LIMIT 1"); header("Location: delcookie.php?error=$error"); EXIT; }
if ($ubrsessstamm == 1 && $ubrsessstamm2 == 1 && $ubrsessstamm3 == 1 && $ubrsessstamm4 == 1){ $_SESSION[user_name] = $row[user_name]; $_SESSION[user_rang] = $row[user_rang]; $_SESSION[user_pw] = $row[user_pw]; $_SESSION[user_id] = $row[user_id]; mysql_query("DELETE FROM user_online WHERE ip='$_SERVER[REMOTE_ADDR]' && username='Gast'");}
}
}
}
}


// ###################################
// ##### Gast zuweisen        ########
// ###################################

if ($logout == 1) {
mysql_query("UPDATE user SET user_badlogin='0' WHERE user_name='$_SESSION[user_name]' LIMIT 1");
setcookie("loger","",time()-36000);
{ mysql_query("DELETE FROM user_online WHERE ip='$_SERVER[REMOTE_ADDR]'");}
{ header("Location: index.php"); EXIT;}
}



?>



damit es schneller geht hier der SQL dazu

DROP TABLE IF EXISTS user;
CREATE TABLE user (
user_id int(14) unsigned NOT NULL auto_increment,
user_name varchar(25) NOT NULL default '',
user_lastlogtime int(20) NOT NULL default '0',
user_lastsite mediumtext NOT NULL,
user_rang int(1) NOT NULL default '0',
user_pw mediumtext NOT NULL,
user_ipaddr mediumtext NOT NULL,
user_browser mediumtext NOT NULL,
user_enable int(1) NOT NULL default '0',
user_avatar mediumtext NOT NULL,
user_email mediumtext NOT NULL,
user_emailzeig int(1) NOT NULL default '0',
user_sex char(1) NOT NULL default '',
user_homepage varchar(50) NOT NULL default '',
user_signatur mediumtext NOT NULL,
user_birthday varchar(12) NOT NULL default '',
user_freunde mediumtext NOT NULL,
imsperre int(1) NOT NULL default '0',
user_cookie_sperrzeit varchar(12) NOT NULL default '',
user_badlogin int(1) NOT NULL default '0',
cookieanlegzeit varchar(14) NOT NULL default '',
KEY id (user_id)
) TYPE=MyISAM AUTO_INCREMENT=276 ;


In diesem Script habe ich 2 weiter Sicherheitsmasnahmen.
1 Muss jeder Cookie die gleiche anlegzeithaben wie der login war sonst wird cookie ungültig! Auch wenn pw und username stimmen

2. Damit kein Angriff stattfinden kann wird ein Account nach dem 3ten fehlgeschlagebeb loginversuch für 5 Minuten gesperrt.
 
Zuletzt bearbeitet von einem Moderator:
Jawoll, danke. Funktioniert. Mir kam die Idee nicht, so ein Cookie zu speichern und dass dann auszulesen.
Der Sicherheitwegen speichere ich nur Userid und das md5 Passwort, so kann sich kein Trojaner auf meiner Page einloggen.
Und die genannten Sicherheitsvorkehrungen sind mir nicht so wichtig. Vielleicht bau ich das mit den 3 Fehlversuchen ein, ist ja nur n paar Zeilen Code und ein weiteres Feld in der DB.

Danke nochmal

mfg
 
Zurück