Loginscript durchlässig

karton

Grünschnabel
Hallo zusammen und bitte um Hilfe!

Ich hab mir mühsam - als blutiger Anfänger - aus einigen Befehlen und aus Vorlagen ein Login-Script zusammengebastelt, welches "fast" funktionert.

Es geht darum, dass auf der zu schützenden Seite nur das Passwort relevant ist. Die Besucher sehen beim Loginformular nur 1 Eingabefeld. User gibt es keinen. Dieses Passwort wird dann mit den in der Datenbank gespeicherten Codes (ohne MD5 Verschlüsselung) verglichen und lässt bei Übereinstimmung den Zugriff zu oder eben nicht. (Nur zum Verständnis der Hintergrund der ganzen Sache: Es ist wie ein Aktionscode, den die Nutzer da eingeben. Den Code erhalten sie in meinem Lokal. Auf der geschützten Seite sind dann diverse Goodies zum runterladen.)


Alles funktioniert. Falsche Code - kein Zugriff. Richtiger Code - Zugriff gewährt.
Jedoch: Wenn man gar keinen Code eingibt, landet man dennoch auf der geschützten Seite.
Wieso das ? Kann mir da irgendjemand von Euch Profis bitte mal weiterhelfen ? Und erklären, was da zu tun ist ?

Hier das Login-Script:
PHP:
<?php
session_start();
?>

<?php
//Abschalten der nervigen NOTICE Meldung...
error_reporting(E_ALL & ~ E_NOTICE);

//DB Verbindung herstellen
$verbindung = mysql_connect("datenbankserver", "dbusername" , "dbpasswort")
or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
mysql_select_db("datenbankname") or die ("Datenbank konnte nicht ausgewählt werden");

//$username = $_POST["username"];
//$passwort = md5($_POST["password"]); Nur Passwortabfrage und ohne MD5
$passwort = $_POST["password"];

//$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
$abfrage = "SELECT passwort FROM login WHERE passwort LIKE '$passwort' LIMIT 1";

$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if($row->passwort == $passwort)
    {
    $_SESSION["username"] = $passwort;
	echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>";
    }
else
    {
    //echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";
    header('Location: http://www.google.at');
}
?>

Von da an gehts dann auf die geschütze Seiten, in denen ich folgendes ganz am Anfang eingefügt habe:

PHP:
<?php
session_start();
?>

<?php
error_reporting(E_ALL & ~ E_NOTICE);
if(!isset($_SESSION["username"]))
   {
   echo "Bitte erst <a href=\"login.html\">einloggen</a>";
   exit;
   }
?>

Und wie beende ich nun die Session ?
Eigenes Script welches über einen Button aufgerufen wird ?
Oder muss das auf irgendeine Seite ?

Ihr seht - ich bin echt blutiger aber sehr interessierter Anfänger und bitte echt um Hilfe.
Danke schon mal!
 
Versuch mal das:

PHP:
<?php
session_start();
?>

<?php
//Abschalten der nervigen NOTICE Meldung...
//error_reporting(E_ALL & ~ E_NOTICE);
// Fehler und Warnungen haben einen Sinn!
error_reporting(E_ALL|E_STRICT);

//DB Verbindung herstellen
$verbindung = mysql_connect("datenbankserver", "dbusername" , "dbpasswort")
or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
mysql_select_db("datenbankname") or die ("Datenbank konnte nicht ausgewählt werden");

//$username = $_POST["username"];
//$passwort = md5($_POST["password"]); Nur Passwortabfrage und ohne MD5
$passwort = isset($_POST["password"]) ? mysql_real_escape_string($_POST['password']) : '';

if($password)
{
  //$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
  $abfrage = "SELECT passwort FROM login WHERE passwort LIKE '$passwort' LIMIT 1";

  $ergebnis = mysql_query($abfrage);
  $row = mysql_fetch_object($ergebnis);

  if($row->passwort == $passwort)
    {
    $_SESSION["username"] = $passwort;
    echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>";
    die(); // Hier arbeiten wir nicht mehr weiter...
    }
}
//echo "Benutzername und/oder Passwort waren falsch bzw überhaupt nicht gesendet. <a href=\"login.html\">Login</a>";
header('Location: http://www.google.at');
?>
 
Also ich kann dir ein Konstrukt beschreiben, wenn ichs programmieren soll brauch ich bisschen mehr Zeit als zwei Minuten. ;)

Man nehme eine Seite, z.B. index.php
Diese enthält ein Formular für den Login! Das Formular sendet einen zur Datei index2.php
Diese Datei enthält zuerst eine session_start, wie du bereits richtig erkannt hast! (evnt. noch session_name dazu)
Weiter gehts dann damit, dass du - wenn der Login erfolgreich ist, also das Passwort stimmt - eine $_SESSION['username'] vergibst.

Das alles passiert noch im oberen - unsichtbaren - Teil der index2.php!
Nun gehen wir zum HTML-Teil über.

PHP:
if(isset($_SESSION['username']))
{
   echo "<p>Geschützter Inhalt.</p>";
} else {
   echo "<p>Zutritt verwehrt. Möglicherweise falsche Zugangsdaten!</p>";
}

Theoretisch hast du es eh nicht schlecht gemacht, aber halt noch ein wenig wirr meiner Meinung nach.
Wenn du bisschen Zeit hast, schreib ich kurz ein Beispiel.


index.php
PHP:
<?PHP
session_start();
session_name('lokal');
?>

<html>
<head>
   <title>Login</title>
</head>
<body>
   <form name="login" method="post" action="index2.php">
      <input type="password" name="userpw" />
      <input type="submit" name="submit" value="Anmelden" />
   </form>
</body>
</html>


index2.php
PHP:
<?PHP
session_start();
session_name('lokal');
if(isset($_POST['submit']))
{
   if(isset($_POST['userpw']))
   {
       $sql = mysql_connect('localhost','user','pass');
       $sqlCmd = "SELECT passwort FROM login WHERE passwort LIKE '".$passwort."' LIMIT 1";
       $sqlQry = mysql_query($sqlCmd,$sql);
       if(mysql_num_rows($sqlQry) != 0)
       {
           $_SESSION['username'] = $_POST['userpw'];
       }
   }
   if(isset($_SESSION['username']))
   {
   ?>
   <html>
      <head>
         <title>Geschützter Bereich</title>
      </head>
      <body>
          <p>Hier ist alles geschützt!</p>
      </body>
   </html>
<?PHP
    }
} else {
   echo "Erst Anmelden: <a href=\"index.php\">Hier entlang</a>";
}
?>

ungetestet, sollte aber funktionieren!
 
Zuletzt bearbeitet:
Sein Problem ist, dass er den $_POST['password'] nicht geprüft hat. Damit wurde ein leeres Passwort an die Datenbank übergeben. Dort bekommt er (hoffentlich) ein leeres Resultset zurück. Dann prüft er die Rückgabe von $row nicht sondern prüft eine nicht existente Property gegen ein leeres Passwort, was im Zweifelsfall true ergibt.

Fazit: Man muss alle Fehlerquellen prüfen!
 
Hi,

die Session beenden kannst du in dem du z.B. eine logout.php erstellst mit folgendem Inhalt:

PHP:
	if($_SESSION['signed_in'] == true) {
	
		$_SESSION['signed_in'] = NULL;
		$_SESSION['password'] = NULL;

		$_SESSION = array();
		session_destroy();

	mysql_close($datenbank);

Mfg
Andy
 
Hallo zusammen!

Vielen Dank für Eure Hilfe!
Ich habe mein abgeändertes Script von saftmeister verwendet
Dazu musste ich nur noch eine Variable ausbessern - hab lang dran herumgesucht - als Anfänger ist das eben nicht so leicht, sich auf Fehlersuche zu begeben. Bin aber irgendwie dahintergekommen, dass die if-Abfrage der Variable $password eigentlich §passwort lauten müsste und jetzt gehts.

Danke nochmal an alle !


PHP:
//$username = $_POST["username"];
//$passwort = md5($_POST["password"]); Nur Passwortabfrage und ohne MD5
$passwort = isset($_POST["password"]) ? mysql_real_escape_string($_POST['password']) : '';
 
//if($password) Diese Variable hab ich umgeändert auf $passwort
if($passwort) 

{
  //$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
  $abfrage = "SELECT passwort FROM login WHERE passwort LIKE '$passwort' LIMIT 1";
 
Upps! :-) war gar nicht beabsichtigt. Aber gut, wenigstens hast du dabei was gelernt. Das ist der Grund, warum man error_reporting() beim testen auf die höchste verfügbare Stufe stellt. Warnungen einfach zu ignorieren kann nicht gut sein ;-) Wie im echten Leben :-D

War jedenfalls keine Absicht, der Buchstaben-Dreher. Ich hoffe, meine Erklärung hat dir ein wenig weiter geholfen? Hilfe zur Selbsthilfe lautet meine Devise.
 
Ja absolut richtig. Ich bin auch der Meinung dass man am meisten lernt wenn man selbst herumbasteln muss. Fertige Scripts gibts ja zuhauf aber das ist nicht meins. Will ja verstehen was da passiert - zumindest ansatzweise ;-)

Thanks!
 
Zurück