Passwort Verschlüsselt abspeichern | Fragen zu md5()

Hallo Leutz,

Während meines Urlaubs habe ich ich mir mal ein PHP Buch reingezogen, und habe nun ein paar Fragen bezüglich der Sicherheit und Verschlüsselung in PHP.

  1. :qst:

In dem Buch sind mehrere Verschlüsselungsmethoden beschrieben, allerdings nur die Funktionsnamen (z.B.: md5(), crc32(), str_rot13() )
Wie wende ich die aber jetzt an, wenn ich z.B. ein Benutzerpasswort verschlüsselt in einer Datenbank ablegen will?
Wie ichs Verschlüssle ist klar, aber da ist nirgendwo eine Entschlüsselung beschrieben,
wenn ich das Passwort z.B.: im Adminportal anzeigen lassen möchte, oder es beim Login mit dem eingegeben pw zu vergleichen.
Entschuldigt die dummen Fragen, liegt zu 30% am Buch, der Rest an mir :ps:

  1. :qst:

Was muss ich sonst noch beachten bezüglich Formularen? Ich kenne z.B. noch htmlspecialchars(), oder Reguläre Ausdrücke, um eine Zeichenkette zu prüfen (mit ereg())

  1. :qst:

Ich habe hier (http://tut.php-quake.net/de/sessions.html) was von session hijacking gelesen. Was tut man am besten dagegen?

Schöne Grüsse und vielen dank für die Anfänger-Hilfe :smiley:

jw-lighting

Moin,

  1. Der Witz an solchen Verschlüsselung ist, dass es Einweg-Verschlüsselungen sind, d.h. eine Entschlüsselung ist gar nicht vorgesehen und auch nicht nötig.

Im Adminportal hat ein Nutzerkennwort eh nichts zu suchen als Anzeige und ein Überschreiben kann man allemal realisieren ohne das Nutzerkenntwort zu kennen.

Bei einem Login ist es relativ simpel. Bei der Anmeldung durchläuft das Nutzerkennwort ja eine Verschlüsselungsfunktion und wird dann in der Datenbank abgelegt. Beim Login wird jetzt der Wert aus der Datenbank verglichen mit dem Wert, den der Nutzer beim Loginbereich ins Formular getippt hat und der die gleiche Verschlüsselungsfunktion durchlaufen hat.

Oder mal kurz ausgedrückt: md5(“Ich bin das Passwort”) === {md5-Hash von “Ich bin das Passwort”, DB-Wert}

  1. Das kann man dir so nicht beantworten, da das Ganze immer vom jeweiligen Verwendungszweck abhängt. Grundsätzlich gilt aber, dass man Nutzerdaten prüfen soll/muss, um keine Sicherheitsprobleme zu kriegen, d.h. bei E-Mail-Angaben auf die richtige Syntax achten, usw.

Natürlich sollten so etwas htmlspecialchars() & Co zum Einsatz kommen, wenn z.B. eine Datenbank mit im Spiel ist.

Eine allumfassende Antwort auf deine Frage gibt es allerdings trotzdem nicht :wink: Man muss halt immer versuchen, wie jemand zu denken, der dem System schaden will und dann überlegen, wie man das am besten löst.

  1. Zu der Frage wurde sich auch schon im QuakeNet-Tutorial geäußert. Der Verweis dort auf Wikipedia lässt sich für die Präventionsmaßnahmen so zusammen fassen (für die engl. faulen):
    a) lange Zeichenkette/Zahlen als Session_ID benutzen.
    b) die Session_ID nach einem erfolgreichem Login neu generieren.
    c) Daten, die ausgetauscht werden, verschlüsseln.
    d) IP-Adresse mit der letzten gespeicherten IP-Adresse vergleichen. (hoher Aufwand, hilft aber auch nicht gegen Leute, die die gleiche IP benutzen)
    e) da die Session-Werte meistens in einem Cookie abgelegt werden, kann man auch den Cookie-Wert andauernd überschreiben und ändern.

Ich schätze, dass sollte erstmal langen …

MfG
myPages

Ja, das hat schon sehr geholfen.

Warum der das dann nicht ins Buch schreibt, ist mir schleierhaft o.0 :unamused: :smiley:

Zu. 2:

Wie kann ich z.B.: überprüfen, ob die Daten, die mein Script verarbeitet, auch von meiner Website kommen?? (also z.b. welche im $_POST-Array)

Noch 2 andere Fragen:

was muss ich auf bplaced bezüglich mail() beachten?? (Anzahl max. usw…)
unterstützt bplaced SQLite??

thanks schonmal!

Möglich wäre den $_SERVER[‘HTTP_REFERER’] zu überprüfen. Darauf würde ich mich aber nicht verlassen, da der Referer leicht manipulierbar ist.

mail() hier auf bplaced erlaubt nur die ersten 4 Parameter. Der 5. Parameter wurde deaktiviert.
Generell sind 100 mails pro tag erlaub, wenn ich mich nicht irre.

Ich denke schon, habs hier schon ein paar mal gelesen, aber nie probiert (weiß ehrlich gesagt nicht mal, um was es sich genau dabei dreht).

mfg Balmung

ok,
vielen dank für die info.

gibt es andere methoden als den http-referer, oder muss ich das risiko eingehen, das andre sites meine php-scripte verlinken (in formularen z.b.)

gibt es sowas wie nen tut, wo man all solche fragen mit db´s und php zu bplaced beantwortet kriegt?

ach ja:
SQLite ist ne datenbank in einer datei, hat vor und nachteile.
die befehle sind sehr ähnlich zu mysql.
vorteil wäre, das man keine begrenzung mehr in der anzahl an datenbanken hätte :p
deshalb frag ich. :ps:
gogle einfach mal nach, wenns dich interessiert. wenn du mit mysql klar kommmst, ist das kein grosser lernfaktor und unterschied.

und:
was muss ich bei mysql_connect eingeben? als jetzt speziell für bplaced? krieg das iwie nich auf die reihe :ps:

[quote=„jw-lighting“]
gibt es andere methoden als den http-referer, oder muss ich das risiko eingehen, das andre sites meine php-scripte verlinken (in formularen z.b.)[/quote]
Das sollte egal sein. das einzige was fremde seiten machen könnte ist das formular bereitstellen und dann an deine Seite vershicken. Aber ändert ja nichts an der Tatsache, dass die Leute auf deine Seite dann gelangen, und nur du allein entscheides was mit den daten geschieht. Ist also auch ne art Werbung… ^^
Kann man nicht großartig verhindern.

Die beste PHP-Referenz (keine Tuts eher ein nachschlagewerk) ist meiner Meinung nach http://php.net/

[quote=„jw-lighting“]SQLite ist ne datenbank in einer datei, hat vor und nachteile.
die befehle sind sehr ähnlich zu mysql.
vorteil wäre, das man keine begrenzung mehr in der anzahl an datenbanken hätte :p[/quote]
MySQL speichert ja auch in Dateien, nur nutzt man MySQL über eine netzwerk verbindung üblicherweise… also isses tatsächlich so wie ich es vermutet hab.
Mehr als eine Datenbank brauch man nicht. Wenn man die Tabellen mit Präfixen pro Projekt versieht, dann sollte es kein Problem geben.

in zwei schritten

Verbindung aufbauen:
$dz = mysql_connect(„localhost“, „mysqlnutzername“, „mysqlpasswort“);

Datenbank auswählen:
mysql_select_db(„datenbankname“, $dz);

Falls du mal vergisst in welcher reihenfolge was angegeben werden muss, hier die meisten (wahrscheinlich sogar alle) MySQL-Befehle:
php.net/mysql

mfg Balmung

ok, ich meinte jetzt vehr so speziell auf bplaced bezogen :wink:
php.net kenn ich :ps:

beim datenbanknamen muss ich mein benutzernamen, bzw. den benutzernamen_‚datenbankname‘ angeben, oder?

und der tabellen name (bsp-tabelle login), ist der dann einfach login, oder ‚benutzername‘.login, wie ich nach ansicht der sql befehle im mysqladmin vermute?

[quote=„jw-lighting“]ok, ich meinte jetzt vehr so speziell auf bplaced bezogen :wink:
php.net kenn ich :ps:[/quote]
Keine Ahnung, hat bplaced eine wiki oder so? wäre vielleicht mal ganz sinnvoll :slight_smile:

das was in deinem User Control Panel steht… wenn du eine Datenbank erstellst wird die doch mit aufgelistet oder? in der Spalte „Datenbank“ steht immer der volle Datenbankname der zu verwenden ist.

Der Tabellenname alleine reicht aus. Habs jedenfalls nie anders gemacht.
Nur wenn man verschiedene Spalten in mehreren Tabellen ansprechen will, also alles eine Ebene tiefer, zum Beispiel bei einem JOIN, dann nutzt man meistens tabelle.spalte
Und es ist nicht das Apostroph: ’
was in der SQL Syntax bei Tabellennamen und Spalten verwendet wird,
sondern das Gravis: `

erst bei Text-eingaben nutzt man das Apostroph
Beispiel:

`tabelle`.`spalte`='text'

:wink:

mfg Balmung

ups, vllt funzt es wegen der sql synatx manchmal nicht :morgen: !coffee

danke

:bp: