• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Loginbereich ohne Datenbank

Space Vampire

Senior HTML'ler
Vielleicht habt ihr lust das mal zu begutachten.
Ich hab mir da einen privaten Bereich mit doppelter absicherung geschrieben.
Es funktioniert alles so weit.
Hätte aber gerne eure Meinung zur Sicherheit des Scriptes.

Im ersten Teil wird geprüft, ob bereits das Passwort angesendet wurde oder nicht und entsprechend das Eingabefeld gezeigt, oder geprüft ob das Passwort korrekt ist.

Wenn das Passwort korrekt ist, wird zusätzlich ein zufalls-$key generiert, der vor dem Aufruf der privaten Inhalte dann überprüft wird.
dieser zufalls-$key ist die einzige erlaubte ?site=
Alle anderen URL-Anhänge werden nicht akzeptiert.

Von meiner warte aus betrachtet, scheint das ziemlich sicher zu sein. So sicher es eben ohne DB geht :)

Seht ihr irgendwo nen groben Schnitzer, oder kann man das als zureichend verbuchen?

PHP:
<?php
$passwort = "testpass";
if($_GET['site']==""){
 if (isset($_POST["go"])) {
  if ($_POST["name"] == $passwort) {
   $key = rand(1000000000000000, 9000000000000000);
   echo '<form action="login.php?site='.$key.'" method="post" style="text-align: center">';
   echo '<input type="hidden" name="key" value="'.$key.'">';
   echo '<input type="submit" name="go" value="Anmeldung Erfolgreich - Weiter">';
   echo '</form>';
  }
  else {
    echo '<p><b>Falsches Passwort!</b><br>';
    echo '<a href="login.php">Zurück zur Anmeldung</a></p>';
   }
 }
 else{
  echo 'Anmeldung<hr>';
  echo '<form action="login.php" method="post" style="text-align: center">'; 
  echo '<br>';
  echo '<br>';
  echo '<input type="Password" name="name">';
  echo '<input type="Submit" name="go" value="Einlogen">';
  echo '</form>';
 }
}
else if($_GET['site']== $_POST['key']){
echo 'PRIVATE INHALTE';
 }
else{echo 'Falscher Site-Key';}
?>
 
Werbung:
naja, mir fällt zwar kein grober schnitzer auf, aber ich würde so was auf jeden fall mit db machen.
 
Die Sicherheit hat grundsätzlich nichts damit zu tun, ob eine DB eingesetzt wird oder nicht.

Bei deinem Script sehe ich nicht so recht, worin der "Login" besteht. Kann auf diese Weise auch eine zweite interne Seite aufgerufen werden (etwa über einen Link von der ersten aus)?

Die Inhalte von $_GET und $_POST können vom Benutzer beliebig gesetzt werden. Es wäre völlig unabhängig von deinem Loginformular kein Problem, eine URL auf deinem Server anzuwählen mit einem identischen $_GET['site'] bzw. $_POST['key'].

Dieses Script ist nicht E_STRICT-sicher. Du müsstest bei der Abfrage von jedem Feld aus $_GET und $_POST vorher per isset() abfragen, ob es gesetzt ist, um es ganz sauber zu machen.

Da bietet es sich an, ganz oben im Script einmal dafür zu sorgen, dass alle benötigten Felder gesetzt sind:

PHP:
$_GET['site'] = (isset($_GET['site'])) ? $_GET['site'] : '';
$_POST['key'] = (isset($_POST['key'])) ? $_POST['key'] : '';
// ...

Günstiger könntest du mit Sessions arbeiten:

PHP:
<?php

session_start();
$_SESSION['loggedIn'] = (isset($_SESSION['loggedIn'])) ? $_SESSION['loggedIn'] : false;

// ...

if ($_POST["name"] == $passwort) {
    $_SESSION['loggedIn'] = true;
}

// ...

if ($_SESSION['loggedIn']) {
    // Zeige Inhalt
} else {
    // Zeige Login-Formular
}
 
Werbung:
Bei deinem Script sehe ich nicht so recht, worin der "Login" besteht. Kann auf diese Weise auch eine zweite interne Seite aufgerufen werden (etwa über einen Link von der ersten aus)?
Es ist wie gesagt ein sehr simpler Login, der nur zugriff auf den Bereich gewährt, den ich im Script mit PRIVATE INHALTE gekennzeichnet habe.
Dieser bereich wird nur dann ausgegeben, wenn
a.) das korrekte Passwort eingegeben wurde und
b.) der richtige zwölfstellige(!) Zufallskey als ?site= angegeben ist

Ohne Zufallskey kein Zugriff. Ohne Passwort kein Key.

Damit ist ein manueller Zugriff über die URL theoretisch nicht möglich, da man an den Generator für den Zufallskey nur mit dem korrekten Passwort gelangt und die URL den Key enthalten muss.
Aus Sicherheitsgründen sehe ich also nicht wirklich Relevanz für Sessions. Oder hab ich da nen Denkfehler?
 
hi
ich brauche einen html code für einen loginbereich
ich habe aber leider nicht die erfahrung dazu
registrieren darf man sich nicht können
ich melde sie an
nur ich habe weder einen code dafür
noch die erfahrung um sowas selber zu machen
Lukas
 
Werbung:
warum nicht?
und warum willst du einen HTML Code für einen Login - das macht man mit PHP...
 
Werbung:
Hm, ich möchte nicht zu negativ sein (zu große objektive Fehler habe ich in dem Script auch nicht gefunden[1]), aber:

- Es ist ca. 8 Jahre alt. (Kein echtes Argument, aber... na ja.)
- Es basiert auf register_globals. (Die Chancen stehen gut, dass es auf einem beliebigen Server deshalb gar nicht läuft.)
- Es nutzt teilweise Shorttags.
- Es nutzt als deprecated markierte Befehle (wenigstens session_register und session_unregister).
- Es missachtet das Eingabe-Verarbeitung-Ausgabe-Prinzip.
- Es ist in einer Kodierung gespeichert, die nicht UTF-8 ist. (Auch kein völlig objektives Argument.)

Da ließe sich vielleicht ein wenig entstauben. :)



[1] Der Vollständigkeit halber: Ich glaube, es ist möglich, sich mit einem Username anzumelden, der etwa "\n" enthält. Das dürfte die Zeilenzählung des Scripts durcheinander bringen.
 
Zuletzt bearbeitet:
Werbung:
Würde ich die Inhalte auch dann sehen, wenn ich die URL example.org/geheim.php?site=123 aufrufe und bei dem Request noch das POST-Feld "key=123" mitschicke?
Touchè *grummel*
Ich weiß schon, warum ich das hier vorführe.
Dein Einwand setzt zwar voraus, zu wissen, wie das Script funktioniert, aber dennoch: Unzureichend bleibt unzureichend. Zurück ans Zeichenbrett.
Danke für den kritischen Blick ;)
 
Grob gesehen (sollte zum Lernen und nicht zum Kopieren benutzt werden ^^):

PHP:
<?php
session_start(); // Das ganz am Anfang vom PHP-Dokument setzen! Kein Leerzeichen vor <?php, nichts!
$true_password = 'testpass'; // Richtiges Passwort
if (isset($_POST['passwort'])) { // Wurde das Formular abgesandt?
  $password = trim($_POST['password']);
  if (md5($password) === md5($true_password)) { // Sind die Hashs vom richtigen Passwort und vom eingegebenen Passwort identisch?
    $_SESSION['logged'] = true; // Dann bist du eingeloggt.
    $logged_in = true;
  } else {
    $logged_in = false; // Nein? Dann bist du ausgeloggt!
    $error = 'Das eingegebene Passwort ist falsch.';
  }
} elseif (isset($_SESSION['logged']) && $_SESSION['logged']) { // Bist du schon angemeldet?
  $logged_in = true; // Dann bist du eingeloggt.
} else {
  $logged_in = false; // Dann eben nicht.
}

if (!$logged_in) { // Wenn du nicht eingeloggt bist:
  echo '<p><b>Bitte einloggen</b>'.(isset($error)?'<br />'.$error:'').'</p>'; // Falls du ein Falsches Passwort eingegeben hast.
  echo '<form method="post" action="index.php">Passwort: <input type="password" name="password" /> <input type="submit" value="Einloggen" /></form>';
  exit(); // Beenden, hier ist Endstation.
}
// Hier ist man eingeloggt.
echo 'Du bist eingeloggt =)';
?>
 
Mit Sessions ist das ja keine große sache.
Ich will das ganze aber so sicher wie möglich ohne Sessions und ohne Datenbank machen!
Sagen wir mal, dass mein Script auf eine Klientel zugeschnitten sein soll, denen man selbst mit den einfachsten Anweisungen, wie "Beim einbinden in eine bestehende Seite muss session_start(); ganz nach oben gesetzt werden" die blanke Panik in die Knochen treibt.
Egal auf welche weise das Script eingebunden und genutzt wird. Mehr als die Angabe des Passwortes soll am Ende nicht nötig sein!
Das ist meine Intention ;)
 
Werbung:
Dann code so, dass sie das PHP-Script nicht in ihren HTML-Code einfügen müssen, was ohnehin unsauber ist.

Ansonsten nutze die Idee der cookielosen Sessions aus und erstelle get Parameter auf jedem Link der Seite, die so aussehen: seite.php?PHPSESSID=1234567890abcdef1234567890abcdef
Und die Session-Id wird dann so generiert:

$sid = md5(date("d").$_SERVER["REMOTE_ADDR"]."irgendetwas");

Dann vergleichst du, ob $_GET['PHPSESSID'] == date("d").$_SERVER["REMOTE_ADDR"]."irgendetwas"
Wenn ja, eingeloggt, wenn nein, ausgeloggt.

Hat den winzigen Nachteil, dass man um Mittenacht ausgeloggt wird.
 
Na ja, das ist auch mit Sessions und erfordert auch Code auf jeder Seite. Ich sehe nicht, was dadurch gewonnen wird (außer hässlichen URLs und dem Problem, die Session-ID überall anhängen zu müssen).
 
Werbung:
Zurück
Oben