Paar Fragen zur PHP-Sicherheit

x3008x

Mitglied
Hey Leute,
wie ihr wisst (oder auch nicht ;) ) habe ich ja jetzt ein video seminar "php5 mysql" gemacht...
Bin jetzt noch ein bisschen schlauer ;)

Allerdings wurde da leider keine login-funktion angesprochen...
Ich habe mal folgendes geschrieben was so auch funktioniert:
Login-Formular.html:
HTML:
<h1>Login</h1>
<form method=post action=test.php>
Name: <input type=text name=name><br>
PW: <input type=text name=pw><br><br>
<input type=submit value=Login></form>

Test.php:
PHP:
if(	$_POST['name'] != "" AND $_POST['pw'] != ""	) {
$name = $_POST['name'];
$pw = $_POST['pw'];

$LD_1 = mysql_query("SELECT uid FROM user WHERE name = '$name' AND pw = '$pw'") or die(mysql_error()); 
$LD1 = mysql_fetch_array($LD_1);
$_SESSION['id'] = $LD1['uid'];

if (isset($_SESSION['id'])) { echo "Login war erfolgreich!"; }
else { echo "Login war fehlerhaft"; }
}
elseif ( $_POST['name'] == "" OR $_POST['pw'] == "" ) { echo "Bitte alle Felder ausfüllen!";}
echo "UID:".$_SESSION['id'];
}

Als Logout wollte ich einfach nur die unset(); funktion benutzen (klappt auch!)
Also zur Sicherheit: Mein Hoster hat die exec funktion deaktiviert ("exec() has been disabled for security reasons")
Meine Fragen:
Ist das so sicher mit der SESSION ID ?
Aber was mich noch viel mehr interessiert ist: Wie verschlüssel ich das Passwort?
Ich kenne es z.B. über CMSs dass die Passwörter verschlüsselt (also ganz viele verschiedene zeichen) in die Datenbank gespeichert werden... Wie mache ich das?
Oder kann ich die Passwörter ruhig im Klartext in die Datenbank schreiben?

Hoffe ihr könnt mir ein wenig helfen... auf jeden fall schonmal danke!

EDIT: Am Anfang kommt natürlich noch die datenbank verbindung und die session_start();
EDIT2: Hatte versehentlich bei den if-abfragen name und name statt name und pw...
Rick
 
Zuletzt bearbeitet:
Auch wenn eigentlich niemand an die Datenbank rankommen sollte ist es zu empfehlen die Passwoerter nicht im Klartext zu speichern sondern als Hash. Z.B. MD5 oder SHA1.
Ich persoenlich nutze in der Regel SHA1, wobei ich den Hash vor dem Speichern gern auch noch umkehre:
PHP:
echo strrev(sha1('testpassword'));
 
Passwörter kannst du mit md5() verschlüsseln.
Im der DB sind die verschlüsselten Passwörter gespeichert. Der User gibt sein Passwort ein, du verschlüsselst der eingegebene Passwort mit dem md5-Hash und vergleichst es gegen die Datenbank.

Somit sind die Passwörter in der Datenbank sicher und du kannst sie vergleichen...
 
Hallo Dennis,
erstmal danke für die schnelle Antwort...
also der ansatz "echo strrev(sha1('testpassword')); " sieht sehr gut aus...

Also den Befehl... oder besser Funktion strrev kenn ich sogar (aus dem video seminar)
rev steht da doch glaub ich sogar für reserve oder so... muss ich nochmal nachsehen... aber sha1 zb. kenn ich jetzt nicht...
Achso hab grad nachgesehen also strrev dient also nur dazu den string umzukehren... (gute idee übrigends als zusätzliche sicherheit ;) )
und sha1 nachdem ich es getestet habe dient ja dazu das pw in einen hash zu wandeln...
kann ich so alse in die db speichern....
also wandel ich das eingegeben passwort einfach in einen umgekehrten hash um und vergleiche im endeffekt also den hash mit dem hash in der db oder?

Wäre es eigentlich rein thoeretisch möglich aus einem hash ein Passwort im klartext zu erstellen?
Ist MD5 oder SHA1 sicherer? :) (Also von der Länge her würd ich auf SHA1 tippen...)
 
Zuletzt bearbeitet:
was ich ändern würde, wrä das hier: >><input type=text name=pw><<
ich würde als "type", "password" angeben. also:
>><input type=password name=pw><<
denn so erscheinen im Formular sternchen, so kann jemand der dem anderen über die Schulter guckt, nicht gleich das Passwort sehen.
 
@ Gumbo: Das bedeutet? Ist zu unsicher? Oder wolltest du mich nur auf meine falsche Bezeichung aufmerksam machen? :)
Aber ich würd doch sagen dass ein hash einer verschlüsselung nahe kommt... und wenn ich es richtig gesehen habe benutzen gängige CMSs doch auch hashwerte... oder?

@ SGSSGene: Hehe danke^^ ja das mit den typen weiß ich ja... hatte das nur so auf die schnelle hingeschrieben ;)
 
Hash-Verfahren und Verschlüsselung sind zwei grundlegend unterschiedliche Methoden!
Während Hash-Verfahren ein unendliche Menge von Eingabewerten auf eine endliche Menge an Ausgabewerten abbilden, somit also surjektiv sind, werden bei Verschlüsselungen dieselbe unendliche Menge von Eingabewerten auf eine ebenfalls unendliche Menge von Ausgabewerten abgebildet, und das bijektiv!
Das heißt bei Hash-Verfahren gibt es zwangsläufig Kollisionen, wobei zwei unterschiedliche Eingabewerte denselben Ausgabewert (Hash-Wert) haben.
Bei Verschlüsselungen hingegen ist das nicht der Fall. Dort hat jeder Eingabewert in Kombination mit dem Schlüssel (den es bei Hash-Verfahren ja auch nicht gibt) einen eindeutigen Ausgabewert, der sich wiederum mit dem richtigen Schlüssel umkehren, also entschlüsseln lässt.
 
Und vor dem Einsetzen in den SQL-String unbedingt die POST-Parameter prüfen, Stichwort SQL Injection! In Deinem Fall wär's ein Leichtes, mit einem geeigneten Passwort-String (etwa ' OR 'haha'='haha) Dein Login zu umgehen.
 
matdacat Vielen Dank für den Hinweis!
Das wollte ich später mal machen... hab das ma eben getestet... gefährlich wie gut das klappt... aber auch total logisch!
Aber ich hab ja jetzt die hash "verschlüsselung" (für dich gumbo extra in "" geschrieben ^^) drin... somit würde der code ja eh nie so an kommen... das dürfte doch eigentlich reichen oder?
Also so meinte ich:
PHP:
$pw = strrev(sha1($_POST['pw']));
# und weiterhin:
mysql_query("SELECT uid FROM user WHERE name = '$name' AND pw = '$pw'")

EDIT: Verdammt! damit ist die $name variable trotzdem noch offen... hmmm muss ich mir mal was einfallen lassen wie ich das hinkrieg...
 
Zuletzt bearbeitet:
Zurück