Loginscript selbst erstellt

timroh

Cripps Pink
Registriert
08.07.09
Beiträge
148
Hallo,
Weiss jemand was mit diesem Script nicht stimmt?(Ich bin noch nicht lange in Webprogramierung zuhause)
<?php
$vorname = $_POST["vorname"];
$password = $_POST["password"];
$datei = fopen(hansmuster123.html,r);
$benutzer = array(
"Franz"
);
$passwort = array(
"Franz" => "1.1.01"
);
if($vorname==$benutzer and $password==$passwort[$vorname]);
{
echo $datei
}
?>

Die Variablen werden Mittels HTML POST versendet und funktionieren soweit einwandfrei.
Ich will eigentlich ein einfaches Loginscript erstellen.
PS: Wie ihr sehen könnt wird im if ein beliebiger Wert des Arrays benutzer abgefragt. Geht das denn so überhaupt???
 

jerry1

Idared
Registriert
07.02.05
Beiträge
28
Guten Abend,

also mir kommt dein Code ziemlich spanisch vor. Vielleicht kannst du etwas genauer erklären, was du mit deinem Code vorhast, bzw. was passieren soll? Also zB. willst du die Nutzerdaten in einer Datei speichern? Wenn ja, wozu legst du dann ein Array an mit dem du das eingegebene vergleichst?
Desweiteren sollten die Passwörter in irgendeiner verschlüsselt bzw. gehasht sein. Aber nochmal zurück zum Anfang:

ok, jetzt hab ich deinen Gedankengang kapiert. Sorry, aber da muss man erstmal draufkommen =)
Also zunächst: so macht man es eher nicht. :)

Benutzer und Passwort in der PHP Datei selbst zu speichern ist keine gute Idee.
Das prinzipielle Vorgehen ist oft folgendes:
Der Nutzer füllt ein Formular aus, und sendet es ab (so wie du es gemacht hast).
In der Auswertung der eingegebenen Daten wird nun überprüft, ob ein Benutzer existiert und ob das Passwort stimmt. (entweder man fragt eine Datenbank, oder zB eine Datei, o.ä.)
Sollte das Passwort korrekt sein, kann man nun den geschützten Inhalt anzeigen.
Das macht man meistens eher mit einem include. das ganze mit fopen zu machen ist nicht sinnvoll, vlt nichtmal möglich, hab es noch nie ausprobiert.
in deinem Fall zum Beispiel
Code:
<?php 
include('hansmuster123.html');
Wenn man nun mehrere Seiten hat, die alle geschützt sein sollen, muss man (um nicht immer wieder das Passwort überprüfen zu müssen) sich irgendwie merken, dass der Benutzer die Seiten sehen darf. Das macht man überlicherweise in Session-Variablen (kann man auch per Cookies machen).
Und wenn man soweit ist, kann man dann auf jeden geschützte Seite quasi eine Art
Code:
if($benutzerOK) {
   //geschützt
} else {
   echo "Access Denied";
}
einfügen.

Deinem bisherigen Code zu urteilen nach, ist das jetzt vermutlich etwas viel auf einmal, aber vielleicht kannst du mit den Stichworten was anfangen und dich mal dran versuchen.
Vielleicht habe ich mich aber auch komplett unverständlich ausgedrückt, dann frag einfach nach ;)

Gruß jerry1
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Code:
<?php
    $vorname = $_POST["vorname"];
    $password = $_POST["password"];
    $datei = fopen([color=red]'[/color]hansmuster123.html[color=red]'[/color], [color=red]'[/color]r[color=red]'[/color]);
    $benutzer = array(
        "Franz"
    );
    $passwort = array(
        "Franz" => "1.1.01"
    );
    if ([color=red]in_array([/color]$benutzer[color=red], $vorname)[/color] [color=red]AND[/color] $password == $passwort[$vorname]) {
        echo $datei[color=red];[/color]
    } [color=red]else {
        echo 'Kein Zugriff';
    }[/color]
?>

Ich habe dir mit Rot einmal ausgebessert, was du sicher verändern musst. Allgemein empfehle ich immer gerne http://tut.php-q.net , ist ein super gutes Tutorial. Habe es auch dort erlernt!

Dein $benutzer ist ein sogennantes Array. Wenn du einmal Mathematik gehabt hast, ist dir der Begriff Matrix sicher geläufig. Ein Array hat eine sehr ähnliche Funktionsweise. Du musst also prüfen, ob der Vorname in dieser Matrix vorhanden ist. Dies geschiecht mit in_array().

Dies ist eine nicht sehr sichere Variante, die du da aufgebaut hast, normalerweise würde man das Passwort noch verschlüsseln, aber das lasse ich mal so sein hier.
 

timroh

Cripps Pink
Registriert
08.07.09
Beiträge
148
Ich habe glaube ich in deinem Script noh ein Fehler gefunden und zwar:
<?php
$vorname = $_POST["vorname"];
$password = $_POST["password"];
$benutzer = array(
"Franz"
);
$passwort = array(
"Franz" => "1.1.01"
);
if (in_array($vorname, $benutzer) AND $password == $passwort[$vorname]) {
echo "hallo";
} else {
echo 'Kein Zugriff';
}
?>
Du hast die Beiden vertauscht.
Mfg
Tim Rohner
 

timroh

Cripps Pink
Registriert
08.07.09
Beiträge
148
Was ist eigentlich an meinem Loginscript unsicher?
Und wie kann ich es jetzt machen, dass sich PHP die Variabeln merkt und sie an eine Weitere Seite schickt? Reicht es wenn ich vor jede Seite diesen Anfang setze...
<?PHP
$datei = "<html>
hallo
</html>";
if (in_array($vorname, $benutzer) AND $password == $passwort[$vorname]) {
echo $datei;
} else {
echo 'Kein Zugriff';
}
?>
...oder muss ich jedes mal alle Arrays neu eintragen?
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
PHP oder der Apache hat einen Fehler, PHP fällt aus oder Apache meint, .php-Dateien müssen nicht mehr an den Interpreter gesendet werden.

Folge: Es könnte der Quellcode ausgegeben werden. Und in deinem Fall direkt das Passwort bzw. alle zugehörigen (gesicherten) Seiten.

Und ja, ich habe die beiden vertauscht. Unabsichtlich.
 

NightMare

Zuccalmaglios Renette
Registriert
09.11.04
Beiträge
263
Na hallo,
Ich bin mir nicht sicher ob du das genannte Tut bereits angeschaut hast.
Persönlich empfehle ich dir jedoch folgenden Aufbau für deine Seiten (nur mal als Einstieg, lässt sich beliebig ausbauen):

index.php (enthält Abfragen und baut deine Site zusammen)
./module/blabla.html

Nun kannst du in der index site nur deinen php Code schreiben. Die Abfrage nach dem Passwort und die Abfrage nach den Rechten (falls eingeloggt). Macht alles viel übersichtlicher.

Falls dein User nun Rechte hat, dann baust du dir aus einer URL die so aussieht den include zusammen: www.gaga.de/index.php?module=blabla

Nun kannst du mit der get variabel den Parameter module auslesen und diesen in deinen include einbauen.
$site_module = $_GET["module"];
include("./module/".$site_module.".html");

Mit dieser Konstellation greift der User immer auf deinen index.php zu... Dadurch brauchst du die Überprüfung nur einmal zu programmieren (der Rest wird mittels der URL immer selbst zusammengesetzt).

Betreffend Daten speichern empfehle ich dir http://ch.php.net/manual/de/book.session.php und die Stichworte session_start / ¨$_session[""] / session_destroy...

Viel Glück und bei Fragen ansonsten auch per PN...
Gruss
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Anstatt einfach $ste_module = $_GET['module"] und dann einbinden empfehle ich noch eine Abfrage durchzuführen, ob die Datei überhaupt vorhanden ist und basename() um wirklich keinen Pfad dabei zu haben. Viel sicherer!

x-trem sicher wäre noch die Eingrenzung nach erlaubten und unerlaubten Schemen, aber das wäre zu viel für den Moment.
 

funz3l

Goldparmäne
Registriert
12.11.07
Beiträge
559
Code:
$vorname = $_POST["vorname"];


sowas ist nicht besonders sicher. Alle Variabeln die von einem Benutzer kommen könnten auch manipuliert sein oder gar php code enthalten daher solltest du diese bevor du die Variabeln weiter verwendest auf jeden Fall überprüfen!
Und noch nen kleiner Tipp, verwerfe deine Variante die ist nämlich nicht wirklich schön gelöst. Mach das wie oben schon gesagt wurde lieber mit Sessions und Cookies etc. dazu gibt es jede Menge Codes und Tuts im Internet einfach mal bei Google suchen!
 

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
Und noch ein Tipp, der mir gleich ins Auge gesprungen ist:
Code:
$password==$passwort...

Das ist gefährlich hoch 10, 2 Variablen nur duch einen Buchstaben unterscheidbar zu halten!

Benenne das lieber in $possible_logins oder so um, und das sagt dann auch den Inhalt noch besser aus.

Aber es stimmt schon, lieber das Passwort verschlüsselt abspeichern, dann in ner extra Datei oder von mir aus auch direkt im Skript. Es gibt da verschiedene Möglichkeiten, zB. md5.
 

funz3l

Goldparmäne
Registriert
12.11.07
Beiträge
559
Aber es stimmt schon, lieber das Passwort verschlüsselt abspeichern, dann in ner extra Datei oder von mir aus auch direkt im Skript. Es gibt da verschiedene Möglichkeiten, zB. md5.

Sorry muss mal ein wenig Klugscheissen:
md5 ist keine Verschlüsselung sondern eine Hashfunktion und gilt heute zudem nicht mehr als sicher.
 
  • Like
Reaktionen: hillepille

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
... md5 ist keine Verschlüsselung sondern eine Hashfunktion ...
Ist mir bekannt. Ich wollte nur den TE nicht noch mehr verwirren.
Und mit unsicher meinst du, das es mittlerweile möglich sein soll, aus einem Hash-Wert das Original-Passwort wieder herzustellen? Das wäre mir neu...
 

funz3l

Goldparmäne
Registriert
12.11.07
Beiträge
559
Soweit ich weiss kann man das Originalpasswort nicht zurückrechnen jedoch gibt es einige Möglichkeiten Kollisionen zu finden irgendeine Computerzeitschrift (ich weiss gerade leider nicht welche) hat das auch mal getestet und in recht kurzer Zeit geschafft (wenn ich mich recht erinnere hat das nur ein paar Stunden gedauert) daher kann MD5 nicht mehr als sicher angesehen werden.
Zudem gibt es ja auch noch die tausenden Rainbowtabellen im Internet.
 

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
Soweit ich weiss kann man das Originalpasswort nicht zurückrechnen jedoch gibt es einige Möglichkeiten Kollisionen zu finden...
Da magst du sicher recht haben. Was ist deiner Meinung nach die sicherste Variante, in Web-Login-Anwendungen das Passwort zu verschlüsseln? (ich hab bisher die password()-Funktion von SQL verwendet...)
Zudem gibt es ja auch noch die tausenden Rainbowtabellen im Internet.
Tja, da sind halt die User gefragt, dass sie sich ordentliche Passwörter ausdenken.
 

funz3l

Goldparmäne
Registriert
12.11.07
Beiträge
559
Ich nutze immer eine Kombination aus mehreren Hashfunktionen zum Beispiel md5 und sha1 ist natürlich auch die Frage inwieweit das für das entsprechende Projekt überhaupt sinnvoll ist für den Loginbereich einer Musikgruppe muss man sicherlich nicht so großen Wert auf Sicherheit legen wie bei anderen Projekten. Eine Kombination erschwert das ganze aber schon erheblich und reicht für die meisten Sachen die man so macht vollkommen aus. Zudem ist es ja kein großer Mehraufwand.

Ich will auch md5 hier nicht schlecht machen wollte nur erwähnt haben das es nicht zwingend die Sicherste Variante ist. Wenn er wirklich selbst ein Loginscript schreiben möchte wird er ohnehin nicht drumherum kommen sich näher mit PHP auseinanderzusetzen.

Viel wichtiger finde ich allerdings das die Daten die vom Benutzer kommen überprüft werden, da kann man noch so eine schöne Hashfunktion haben wenn via Formular PHP Code eingeschleust werden kann.


Naja wieviele User denken sich vernünftige Passwörter aus? Darauf sollte man sich nicht zwingend verlassen ;)
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
md5 und sha1 nützen dir auch nichts, wenn du einen Fehler im Skript hast, der es dir erlaubt, direkt den Hash als Passwort anzugeben...
 

funz3l

Goldparmäne
Registriert
12.11.07
Beiträge
559
Gut das ist natürlich klar wenn ich dem Angreifer durch mein Script die Möglichkeit gebe Rootrechte auf derm Webserver zu erhalten dann ist alles hinfällig. Durch die Verwendung mehrerer Hashfunktionen werdne aber zumindest die Rainbowtabellen zu einem gewissen teil ausgehebelt. Bei wirklich wichtigen Sachen setze ich sowieso dann eine aufwendigere Hashfunktion ein als md5 oder sha1. Da muss man dann halt ein paar kleine Abstriche bei der Geschwindigkeit machen. Zudem dann noch ein salt verwenden das am besten permanent neu generiert wird dann wird das ganze schon relativ sicher. Natürlich setzt alles das vorraus das man auch ein sicherers Script hat aber wir brauchen ja auch nicht über die Sicherheit von Zimmertüren sprechen wenn man neben der Tür ein riesen Loch in der Wand hat.
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Was ist für dich eine "aufwendigere" Hashfunktion als md5 oder sha1? Die Kombination derer bringt ja schon eine gewaltige Sicherheit, was will man da noch mehr sichern?
 

funz3l

Goldparmäne
Registriert
12.11.07
Beiträge
559
Man könnte zum Beispiel sha256 oder auch sha512 einsetzen das ist ja schon etwas aufwendiger als sha1 oder md5.
 

lucasM

Erdapfel
Registriert
05.10.15
Beiträge
4
Ich hätte da eine Frage ich mach gerade ein Login mit php und der funktioniert nicht so wie er sollte.
Wäre gut wenn da mal einer drüber schauen kann.
Das Problem ist im Moment:
Beim Bestätigen also klick auf Login wird man nicht weitergeleitet.
Ich bedanke mich schon mal ;)

Lg Lucas

<?php
include('daten.php');
if(isset($_post['submit']))
{
$user_login = $_Post['user'];
$pass_login = $_Post['pass'];
if($user_daten == $user_login && $pass_daten == $pass_login){
echo'<meta http-equiv="refresh" content="3"; URL="erfolgreich.php" >';
echo"Login erlolgreich du wirst in 3 Sekunden weitergeleitet.";
}
else{
echo "Error.";
}
}
?>
<html>
<head>
<Title>PW Schutz
</title>
</head>
<body>
<form name="login" action="" method="post" enctype="text/html">
<input type="text" name="user" value="Benutzername" sice="20" maxlength="50" />
<br />
<input type="passwort" name="pass" value="Passwort" size="20" maxlength="50" />
<br />
<input type="submit" name="Login/Submit" value="Login" />
</form>
</body>
</html>