Beiträge von cottton

    Du hast sehr viel Code geposted und irgendwo dazwischen das Problem beschrieben.
    Das ist nicht gut für Dich, denn man hat oft nicht die Zeit so viel durch zu sehen.

    =)

    Zur Fehlermeldung.

    Zitat

    Column not found: 1054 Unknown column 'rere' in 'where
    clause'' in


    Du hattest in der SQL-Query wohl eine Spalte "rere" stehen.
    Wenn ich mir den Code ansehe, sehe ich davon allerdings nichts.
    Wenn Der Fehler immernoch auftritt, dann poste mal
    die erstellte Query und den Inhalt der Variablen die darin genutzt werden.
    in etwa so:

    PHP
    // hier ist die zeile 38, in der der fehler auftrat:
     $statement = $pdo->prepare("SELECT hashid  FROM Registrierdaten WHERE benutzername = ".$user." ");
    // testausgabe:
    var_dump(
        "SELECT hashid  FROM Registrierdaten WHERE benutzername = ".$user." "
    );
    exit; // ende um nur die query zu sehen/prüfen


    Was hier allerdings noch schief läuft ist, dass Du variablen (und dann noch user input) in die SQL-Query einbaust, ohne Platzhalter zu verwenden.
    Momentane Query und das gefähriche daran:


    Siehe PDO::prepare Bsp: http://php.net/manual/de/pdo.…repare-examples


    Zeile 25 bis ... in Register-Seite

    PHP
    //Password
        $password = $_POST['password'];
        $password_wiederholung = $_POST['password_wiederholung'];
    
    
    
    
        $password_gehahst = password_hash($password_gehahst, PASSWORD_DEFAULT);


    Du erstellst hier einen PW hash aus einem (nicht vorhandenen) PW hash.
    Das soll sicherlich das passwort oder passwort-wiederholung sein:

    PHP
    //Password
        $password = $_POST['password'];
        $password_wiederholung = $_POST['password_wiederholung'];
    
    
    
    
        $password_gehahst = password_hash($password /*<<<< ----*/, PASSWORD_DEFAULT);

    HTML - vars maskieren - auch in Email HTML


    Siehe auch all den anderen HTML Code in dem Du vars verwendest.

    Email Injection
    Siehe: Feedback für meine Website und Fragen zur Sicherheit, PHP uvm.


    Tipps:
    Erstelle den Hash erst, wenn Du alle Fehler ausschließen konstest.
    Sonst erstellst Du jedes mal einen Hash, den Du nicht nutzt/weiter verwendest.
    Also erst in:

    PHP
    if(count($fehler) === 0 ){
        // jetzt erst hashen, den das kosten resourcen
        $password_gehahst = password_hash($password, PASSWORD_DEFAULT);
    }


    empty($benutzername)
    Prüfe besser auf mindest Länge. Du willst sicher keine Benutzer mit den Namen "a" oder "b" ... haben =)
    Also besser

    PHP
    if (strlen($vorname) < 4){ // bsp min length 4
        // fehler
    }


    Das Gleiche mit allen anderen Feldern. Es gibt immer minest Länge, und oft maximal Länge.

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    Wenn Du das verwendest, dann solltest Du bei jeder Aktion ($pdo->prepare..., $stmt->execute....) einen try/catch Block verwenden!


    Was machst Du hier? :

    PHP
    $check = explode( '$', $_SERVER['QUERY_STRING'] );


    oO?
    Was steckt in $check?


    Zum Login: Du solltest Dir das hier ansehen: Loginpasswort richtig hashen - password_hash() & password_verify()
    Beim Login mit passwort_verify(...) den hash des Users aus der db mit dem eingegebenen PW vergleichen.

    Normalerweise reicht schon sowas:

    PHP
    $activationHash = md5(microtime() . $email);


    Oder das hier: http://stackoverflow.com/a/876154/3411766

    PHP
    $generatedKey = sha1(mt_rand(10000,99999).time().$email);

    Du könntest auch password_hash() nutzen:

    PHP
    $activationHash = password_hash(microtime() . $email, PASSWORD_DEFAULT);


    Das wäre dann ein unique hash, der allerdings etwas zu lang werden kann.
    Außerem verbrät password_hash() einiges an resourcen - also bissl ungünstig.

    Es muss einzigartig sein.
    Und selbst wenn jemand den PHP-Code kennt, mit dem Du den hash erstellst,
    muss es sehr schwer bis nicht möglich sein den hash selbst zu erstellen.

    in Zeile 58 definierst Du erst den $bestaetigungslink.
    Demnach gibt es für Zeile 22 keinen Wert.
    Also die Var muss vor Zeile 22 definiert worden sein.

    BTW: wenn Du den Hash zur Aktivierung so erstellst, dann kann sich (theoretisch) jeder selbst einen erstellen.
    Besser ist es, einen wirklich zufälligen hash zuu erstellen und den in der db abzulegen.

    Zeile 10

    PHP
    if(!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
                        $error = 'email fail';
                    }


    Wenn ! (NICHT) filter_var(...) === false

    Doppelte Verneinung :D

    Würde aber empfehlen:

    PHP
    $emailFiltered = filter_var($email, FILTER_VALIDATE_EMAIL);
    if ($emailFiltered=== false or $emailFiltered !== $email) {
        $error = 'email fail';
    }

    Du könntest die nav (foreach) außerhalb des HTML-Teils erstellen.
    Und ein htmlspecialchars auf$nav_item.
    Sonst wüsste ich nix. Evtl bissl einrücken.

    Das ganze Netz ist voll mit dem Zeug :D

    Im Ernst - hier im Forum, oder über google findest Du relativ schnell frei nutzbaren Code.
    Dabei musst Du eigtl nur wissen, WAS Du brauchst/suchst,
    und Du musst es einigermaßen verstehen, um es in Deine Seite einbauen zu können.

    Zu den Projektseiten:
    nimm doch die Navi und kopier sie. (Oder ich hab dich fasch verstanden)

    Tipps geben ist jetzt hier schwierig, da Du ja nicht direkt fragst, was Du brauchst.
    Wenn Du zB nach einer Navi fragst, oder nach nem Footer, dann sollte das alles kein Problem sein.

    Guck Dir das Bsp nochmal an. Da fehlt das Semikolon =)
    Und das ist der Punkt bei diesem Bsp.

    Was ich damit zeigen wollte ist, dass ein Passwort (oder andere sensible Daten) in einer Var gut aufgehoben sind.
    Aber man muss aufpassen, was man mit der Var im Script macht.

    So ein Fehler sollte sehr selten vorkommen. Wichtig ist nur, dass man sowas kennt/schon mal gesehen hat/wüsste was passiert/... .
    =)

    Den Username kannst Du anzeigen lassen, wo Du willst.

    Opps, hatte ich den Link vergessen :D

    Wenn Du im Script das Passwort in Variablen steckst, dann kann im Normalfall nichts passieren.
    Der Wert - hier das Passwort - wird ja beim setzen einer Var im Normalfall nicht irgendwo hin gespeichert (außer im Speicher (RAM)).

    Es gibt aber Situationen, in denen "etwas schief gehen kann". Dann kann es sein, dass der Wert einer Var an die "Öffentlichkeit" gelangen kann.

    Bsp:
    Simples Bsp für Verkettungsfehler:


    Ausgabe:

    Code
    Hallo cottton!mySecr3tP455w0rD... something to tell ...

    Was passierte hier?
    (Siehe Comments)


    In kurz:

    Anderes Bsp: Exceptions
    (Vorraussetzung hier, dass Fatal Errors angezeigt werden. Aber auch in den Logs kann das pw auftauchen!)


    Ausgabe (weil Exception nicht aufgefangen)

    Code
    Fatal error: Uncaught exception 'Exception' with message 'OOooops!' in [...]: User->setPassword('mySecr3tP455w0r...') #1 {main} thrown in [...]


    Die PHP Fehlermeldung gibt einen Fatal Error aus, mit der Angabe WO das passiert ist.
    Dabei zeigt uns die Meldung blöderweise, dass die Funktion ::setPassword() aufgerufen wurde und der Wert "mySecr3tP455w0r..." als Parameter übergeben wurde.

    Dieser Fehler - also das ausgeben von Fatal Errors - passiert wohl öfter mal beim Verbinden zu einer db. Man sollte das also kennen und try/catch nutzen, um genau das zu vermeiden

    Erstmal: sehr schön, dass Du PHP password_hash() nutzen möchtest.

    Zitat

    Welche Hash-Algorythmen würdet ihr mir empfehlen von denen : ?


    Keinen. Lass das die PHP Funktion password_hash() machen,
    wie Du es schon richtig gemacht hast:

    PHP
    $password_gehahst = password_hash($password, PASSWORD_DEFAULT);

    Der Parameter 2 $algo in password_hash()
    gibt den verwendeten Algorithmus an.
    PASSWORD_DEFAULT legt dabei fest, dass nach PHP Standard immer der best mögliche Algo verwendet wird.
    Siehe: http://php.net/manual/en/password.constants.php

    Zitat

    Wenn ich zuerst die eingabe vom password feld im paddword speichere ist
    das password ja nicht geschützt oder ?


    Verstehe ich nicht ganz. Aber wenn Du meinst, dass zB $_POST['password'] unsicher ist,
    oder es unsicher ist, das Klartextpasswort irgendwo abzuspeichern (db, file, session(was auch ein file ist)),
    dann - JA, Klartextpasswörter dürfen nie irgendwo gespeichert werden.

    Es wird ein Hash vom Klartextpasswort gespeichert (zB db),
    und später mit dem Hash des zu verifizierenden Passwortes (zB Login) gegengeprüft.
    Dafür nutzt Du dann aber password_verify()

    Zitat

    Ich würde dann das gehahschte Password in der Datenbank speichern falls alle eingaben stimmen und noch nicht besetzt sind.


    Erst, wenn alle benötigten Felder ausgefüllt wurden - erst dann fängst Du an zu "arbeiten".
    Soll heißen: Sind alle required Fields ausgefüllt - Ja - Dann erstelle (erst) jetzt den Passworthash.
    Warum:
    Jedes hashen kosten Ressourcen. Bei password-hash() kannst Du eine "cost" mitgeben. (mehr zu "cost" auf php.net oder im oben genannten Link).
    Und Du möchtest ja nicht erst den aufwendigen Hash erstellen lassen, um in dann wieder fallen zu lassen, weil zB der Benutzername zukutz ist.

    Zitat

    Was haltet ihr von meiner Vorgangsweise? Wie würdet ihr es machen ? Mache ich es so richtig ?

    Ich sehe da nicht ganz durch.
    Das erste was ich sehe (un MIR nicht gefällt) ist:

    PHP
    $password = trim($_POST['password']);


    Der User wollte evtl am Anfang oder Ende ein Leerzeichen im PW. Du veränderst hier seine Eingabe.
    Das macht noch Sinn, wenn es um Namen geht (Username).
    Aber beim Passwort ist meine Meinung: Benutzers Passwort ist des Benutzers Passwort und wird nicht angerührt.
    Ich nenne es immer gern wieder: Sparkasse kürzt EINGEGEBENE Passwörter auf 5 order 6 zeichen, OHNE den Benutzer zu informieren. (Bei Vergabe und Login!)

    Es ist zwar viel, aber ich denke wir hatten damals im Thread "passwort richtig hashen" (Link oben) so ziemlich alles abgearbeitet.
    Einfach mal ansehen. Bei Fragen wie immer fragen.
    (Beachte auch password_verify() und password_needs_rehash())

    Du hast nur noch leere Arrays. Das heißt, die for-Schleife läuft genau 0 mal =)

    Basi hatte doch im Code-Kommentar geschrieben, dass die Arrays bei Dir vom Formular befüllt werden.

    in etwa:

    PHP
    $myText1 = $_POST["mytext1"];
    // ...

    was Basi sagt und

    1. Modulus http://php.net/manual/de/language.operators.arithmetic.php

    Zitat

    Rest von $a geteilt durch $b



    Ich finde $unteilbar und $i $k sind schlecht gewählt.
    Siehe Comments:

    Das nicht Empfehlen bezog sich auf die echos in der function.
    Es ist einfacher nachzuvollziehen (auch später für Dich selbst), wenn functions Werte zurückgeben,
    aber nicht ausgeben.

    Soll heißen: anstatt in der function echos zu nutzen, würde ich dort drin einen String erstellen und diesen zurückgeben.
    In etwa so:

    die function:

    PHP
    function myFunctionToGetSomething($x, $y, $z){
        $string = $x . ' something ' . $y . $z;
        return $string;
    }


    das eigentliche script:

    PHP
    <!-- html code ... -->
    <?php
    $something = myFunctionToGetSomething($x, $y, $z);
    echo $something;
    ?>
    <!-- html code ... -->


    Wenn Du nun in 2 Jahren Deinen Code durchgehst, weil Du etwas umbauen musst,
    dann würdest Du davon ausgehen, dass myFunctionToGetSomething Dir einen String zurückgibt.
    Den String gibst Du dann außerhalb der function aus.

    Das hier ist das Problem:

    PHP
    echo        "".$pruefung['pr_nr'] = pr_nr(clearstring($_SESSION['st_bn_nr']))."";


    Du weist $pruefung['pr_nr'] etwas zu, und echo-st es aber in der gleiche Zeile.

    Mach das nicht.
    Wenn Du das Ergebnis der Funktion noch brauchst, dann:

    PHP
    // leg erst das ergebnis in die var ...
    $pruefung['pr_nr'] = pr_nr(clearstring($_SESSION['st_bn_nr']));
    // und jetzt nutze die var:
    echo $pruefung['pr_nr'];

    Wobei Du hier wohl den Rückgabewert ($pr) gar nicht ausgeben willst.
    Also nur:

    PHP
    $pruefung['pr_nr'] = pr_nr(clearstring($_SESSION['st_bn_nr']));


    ... denn in der Funktion machst Du ja schon echo (was ich nicht empfehle).

    Du brauchst glaub ich einen edito, der Dir Fehler markiert.
    Sieh Dir mal das Bild an:html-seminar.de/woltlab/attachment/969/

    Das hier könnte funzen:

    PS: evtl kann das Forum den Code wegen der Fehler nicht richtig darstellen.