Avatar billede Thomasrn Seniormester
02. februar 2018 - 11:09 Der er 40 kommentarer

if (empty($email) || empty($password)){

er i gang med at lave en login side med noget email password osv.
man skal kunne logge ind med Email og password og når jeg udfylder email og password går den til siden localhost/index.php?login=error1
forstår ikke ved ikke om de er de 2 || der er fejlen søger gerne en løstning på forhånd tak

<?php

session_start();

if (isset($_POST['submit'])) {

    include 'dbh.inc.php';

    $email = mysqli_real_escape_string($conn, $_POST['email']);
    $passwprd = mysqli_real_escape_string($conn, $_POST['password']);

    //Error handlers
    //Check if inputs are empty
    if (empty($email) || empty($password)){
        header("Location: ../index.php?login=error1");
        exit();   

    }else {
        $sql = "SELECT * FROM bruger WHERE email='$email'";
        $result = mysqli_query($conn, $sql);
        $resultCheck = mysqli_num_rows($result);
        if ($resultCheck < 1) {
            header("Location: ../index.php?login=error2");
            exit();
        } else{
Avatar billede jakobdo Ekspert
02. februar 2018 - 11:18 #1
$passwprd <====

Prøv at ret til $password

Og generelt ville jeg hellere lave:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT * FROM bruger WHERE email=? AND password=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("ss", $_POST['email'], $_POST['password']);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($id);

    /* fetch value */
    $stmt->fetch();

    $_SESSION['user_logged_in'] = true;

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>

og så håndtere om brugeren logges ind eller ej.
Om email eller password er "tomt" er jo som sådan lige meget.
Det kan du håndtere direkte i din html formular og sikre der ikke postes inden begge felter er indtastet.
Avatar billede Thomasrn Seniormester
02. februar 2018 - 11:47 #2
det er bare nu har jeg skrevet hele koden og følger en tutorial til at prøve at få lidt af det ind under huden.
dog stødt på et problem igen der skulle være en fejl i denne del af koden håber dog ikke det var en taste fejl som sidste synes jeg har tjekket den igennem

//De-hashing the password
                $hashedpasswordCheck = password_verify($password, $row [' password']);
                if ($hashedpasswordCheck == false) {
                    header("Location: ../index.php?login=error3");
                    exit();
                } elseif ($hashedpasswordCheck == true)
Avatar billede jakobdo Ekspert
02. februar 2018 - 13:40 #3
Hvad får du af fejl ?
Avatar billede Thomasrn Seniormester
02. februar 2018 - 14:19 #4
Den skriver bare index.php?login=error3 i browseren
Avatar billede jakobdo Ekspert
02. februar 2018 - 14:38 #5
Så kunne det vel tyde på du har fejl i password_verify eller hvor kommer $password fra ?
Avatar billede Thomasrn Seniormester
02. februar 2018 - 17:03 #6
$password kom fra databasen
Avatar billede jakobdo Ekspert
02. februar 2018 - 17:05 #7
Du må vise mig hele koden.
Det med at gætte, gør jeg ikke kan finde fejlen.
Så skal du have hjælp, skal du vise "alt".
Avatar billede Thomasrn Seniormester
02. februar 2018 - 18:03 #8
Min login.inc.php

<?php

session_start();

if (isset($_POST['submit'])) {

    include 'dbh.inc.php';

    $email = mysqli_real_escape_string($conn, $_POST['email']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);

    //Error handlers
    //Check if inputs are empty
    if (empty($email) || empty($password)){
        header("Location: ../index.php?login=error1");
        exit();   

    }else {
        $sql = "SELECT * FROM bruger WHERE email='$email'";
        $result = mysqli_query($conn, $sql);
        $resultCheck = mysqli_num_rows($result);
        if ($resultCheck < 1) {
            header("Location: ../index.php?login=error2");
            exit();
        } else{
            if ($row = mysqli_fetch_assoc($result)) {
                //De-hashing the password
                $hashedpasswordCheck = password_verify($password, $row [' password']);
                if ($hashedpasswordCheck == false) {
                    header("Location: ../index.php?login=error3");
                    exit();
                } elseif ($hashedpasswordCheck == true) {
                    //log in the user here
                    $_SESSION['id'] = $row ['id'];
                    $_SESSION['klubnavn'] = $row ['klubnavn'];
                    $_SESSION['managernavn'] = $row ['managernavn'];
                    $_SESSION['email'] = $row ['email'];
                    header("Location: ../index.php?login=success");
                    exit();
                }
            }
        }
    }
} else {
    header("Location: ../index.php?login=error4");
    exit();
}
Avatar billede ejvindh Ekspert
05. februar 2018 - 12:27 #9
Som jakobdo skrev: Hvis browseren navigerer videre til index.php?login=error3, så er dit problem, at $hashedpasswordCheck = false, dvs. at den ikke genkender det indtastede password:

[code]
if ($hashedpasswordCheck == false) {
                    header("Location: ../index.php?login=error3");
                    exit();
}
[/code]
Avatar billede jakobdo Ekspert
05. februar 2018 - 13:05 #10
Vi ved stadig ikke hvordan funktionen:

password_verify() virker.
Avatar billede ejvindh Ekspert
06. februar 2018 - 10:29 #11
#10: Tror du ikke bare det er denne: http://php.net/manual/en/function.password-verify.php ?
Avatar billede jakobdo Ekspert
06. februar 2018 - 11:12 #12
Jo, jeg troede det var egen funktion. Pinligt. :)
Men ja, koden fejler og ender i error=3, så det er svært at gøre mere
Avatar billede acore Ekspert
06. februar 2018 - 12:57 #13
I linien

$row [' password']);

er der en dum blank før password. Prøv at slette den.
Avatar billede Thomasrn Seniormester
06. februar 2018 - 17:47 #14
prøvet at fjerne det mellemrum gav ingen resultat crasher stadig ved koden:


                $hashedpasswordCheck = password_verify($password, $row ['password']);
                if ($hashedpasswordCheck == false) {
                    header("Location: ../index.php?login=error3");
                    exit()
Avatar billede acore Ekspert
07. februar 2018 - 00:29 #15
Har du også kald til mysql_real_escape_string før dit kald til password_hash() andetsteds?

Eller måske snarere: Prøv at undlade mysqli_real_escape_string kaldet for $password.
Avatar billede Zochko Juniormester
16. februar 2018 - 20:39 #16
Jeg har lige kopieret koden:
  $hashedpasswordCheck = password_verify($password, $row ['password']);
                if ($hashedpasswordCheck == false) {
                    header("Location: ../index.php?login=error3");
                    exit()
over i en editor.

Der er også et mellemrum her: $row ['password'] (mellem $row og [ )

Se lige om det ikke løser problematikken.
Avatar billede Thomasrn Seniormester
26. februar 2018 - 19:26 #17
$hashedpasswordCheck = password_verify($password, $row[' password']);
                if ($hashedpasswordCheck == false) {
                    header("Location: ../index.php?login=error3");
                    exit();

fandt fejlen ved password_verify skulle være !password_verify
Avatar billede acore Ekspert
26. februar 2018 - 20:09 #18
Hmmm - er du virkelig sikker på det?
Avatar billede Thomasrn Seniormester
26. februar 2018 - 20:34 #19
det er hvad jeg har ændret og nu går den forbi de error sider og til succes siden
Avatar billede acore Ekspert
26. februar 2018 - 20:48 #20
Og hvad hvis password er forkert? Gætter på at det også giver login
Avatar billede acore Ekspert
26. februar 2018 - 20:49 #21
Hvis jeg har ret, så genlæs #15
Avatar billede Thomasrn Seniormester
26. februar 2018 - 21:39 #22
har du sgu ret i
Avatar billede Thomasrn Seniormester
09. marts 2018 - 08:38 #23
ved du hvad fejlen er? For har tjekket igennem og kan ikke finde fejlen
Avatar billede acore Ekspert
09. marts 2018 - 19:44 #24
Ikke sikker, men mit bedste gæt er i #15
Avatar billede Thomasrn Seniormester
13. marts 2018 - 08:11 #25
ifølge min kode skulle fejl først komme et sted i denne kode:


//De-hashing the password
$hashedpasswordCheck = !password_verify($password, $row    ['password']);
if ($hashedpasswordCheck == false){
        header("Location: ../index.php?login=error3");
Avatar billede acore Ekspert
13. marts 2018 - 08:58 #26
Du kan have ret i, at det er her, du opdager fejlen, men jeg tror den opstår før det.

Din fejl må betyde, at password_verify(...) returnerer FALSE både når du angiver det rigtige password (jf din oprindelige post) og når du angiver det forkerte password (jf #22).

Det får mig til at tro, at der er noget "galt" med et af argumenterne til password_verify(...), således at funktionen meddeler dig, at password og hash ikke passer sammen uanset om de burde gøre det eller ej.

Jeg kan se af din kode, at du behandler det indtastede password med linien

mysqli_real_escape_string($conn, $_POST['password']);

Det andet argument til password_verify(...) kommer fra

$row ['password']);

og skal indeholde hash-værdien af brugerens password. Vi har ikke den kode, der viser hvordan det behandles før det ender i din database, men det jeg spørger til i #15 er, om du også kalder mysql_real_escape_string før dit kald til password_hash() i den kode. For hvis ikke du gør det, så vil password_verify ikke virke. Der kan også være andet galt. Evt kan du vide den del af koden også.

Men til at begynde med - prøv at rette

$password = mysqli_real_escape_string($conn, $_POST['password']);

til

$passwprd = $_POST['password'];

Hvis det virker, så har du forklaringen.
Avatar billede Thomasrn Seniormester
13. marts 2018 - 11:17 #27
hele koden ser således ud pt

<?php

session_start();

if (isset($_POST['submit'])) {

    include 'dbh.inc.php';

    $email = mysqli_real_escape_string($conn, $_POST['email']);
    $password = ($_POST['password']);
    //Error handlers
    //Check if inputs are empty
    if (empty($email) || empty($password)) {
        header("Location: ../index.php?login=error1");
        exit();   
    }else {
        $sql = "SELECT * FROM bruger WHERE email='$email'";
        $result = mysqli_query($conn, $sql);
        $resultCheck = mysqli_num_rows($result);
        if ($resultCheck < 1) {
            header("Location: ../index.php?login=error2");
            exit();
        } else{
            if ($row = mysqli_fetch_assoc($result)){
                //De-hashing the password
                $hashedpasswordCheck = !password_verify($password, $row['password']);
                if ($hashedpasswordCheck == false){
                    header("Location: ../index.php?login=error3");
                    exit();
                } elseif ($hashedpasswordCheck == true) {
                    //log in the user here
                    $_SESSION['id'] = $row ['id'];
                    $_SESSION['klubnavn'] = $row ['klubnavn'];
                    $_SESSION['managernavn'] = $row ['managernavn'];
                    $_SESSION['email'] = $row ['email'];
                    header("Location: ../index.php?login=success");
                    exit();
                }
            }
        }
    }
} else {
    header("Location: ../index.php?login=error4");
    exit();
}


bruger kommer ind lige meget hvad man skriver som kode
Avatar billede acore Ekspert
13. marts 2018 - 11:44 #28
Prøv i den kode at rette

$hashedpasswordCheck = !password_verify($password, $row['password']);

til

echo("P1[".$password."]<br />P2[".$row['password']."]<br />");
$hashedpasswordCheck = password_verify($password, $row['password']);

Fortæl her, hvad der udskrives i et eksempel, hvor passwordet er rigtigt angivet. Det vil bringe os et skridt videre.
Avatar billede Thomasrn Seniormester
13. marts 2018 - 12:23 #29
der kommer ikke noget tekst browseren skifter bare til: http://localhost/index.php?login=error3
lige om den er rigtig eller forkert
Avatar billede acore Ekspert
13. marts 2018 - 12:26 #30
Mystisk - den burde ikke kunne redirecte, når du har skrevet noget ud.

Prøv at slette linien

header("Location: ../index.php?login=error3");

og kør igen
Avatar billede Thomasrn Seniormester
13. marts 2018 - 12:31 #31
P1[123456]
P2[$2y$10$LU5Eznk6SkuYb]

p1 indtastede kode og p2 må være den hashed
Avatar billede acore Ekspert
13. marts 2018 - 12:54 #32
Korrekt. Hvilken hash har du brugt?

Med

<?php
$password = "123456";
$dinhash =  "$2y$10$LU5Eznk6SkuYb";
$rigtighash = password_hash($password, PASSWORD_DEFAULT);

echo "Rigtig hash:".$rigtighash."<br />";

echo "DIN: ".(password_verify($password, $dinhash)? "TRUE": "FALSE")."<br />";
echo "RIGTIG: ".(password_verify($password, $rigtighash)? "TRUE": "FALSE")."<br />";
?>

får jeg outputttet

Rigtig hash:$2y$10$Ji8cQd02kUFgbQrdKtygXupreygynwGCZZoUJsFkonQEsmGxw6kZS
DIN: FALSE
RIGTIG: TRUE

Dvs - hvis du bruger default hash, så er det gemte hash forkert.

Og så er vi tilbage ved, at vi mangler at se den kode, hvor du gemmer det hashede password i databasen.
Avatar billede Thomasrn Seniormester
13. marts 2018 - 12:58 #33
//Hashing the password
                $hashedpassword = password_hash($password, PASSWORD_DEFAULT);
                //insert the user into the database
                $sql = "INSERT INTO bruger (email, password, managernavn, klubnavn)
                VALUES ('$email', '$hashedpassword', '$managernavn', '$klubnavn');";
                mysqli_query($conn, $sql);
                header("Location: ../signup.php?signup=success");
                exit();

den du mener?
Avatar billede acore Ekspert
13. marts 2018 - 13:35 #34
Yes - men et eller andet kikser. Kan du se i databasen om det er det rigtige hash, der står? Det er ikke noget med at feltformatet er forkert?
Avatar billede Thomasrn Seniormester
13. marts 2018 - 13:41 #35
da jeg skrev denne kode:

echo("P1[".$password."]<br />P2[".$row['password']."]<br />");
$hashedpasswordCheck = password_verify($password, $row['password']);

fik jeg det rigtige hashed
men ikke med denne kode:
$password = "123456";
$dinhash =  "$2y$10$LU5Eznk6SkuYb";
$rigtighash = password_hash($password, PASSWORD_DEFAULT);

echo "Rigtig hash:".$rigtighash."<br />";

echo "DIN: ".(password_verify($password, $dinhash)? "TRUE": "FALSE")."<br />";
echo "RIGTIG: ".(password_verify($password, $rigtighash)? "TRUE": "FALSE")."<br />";
Avatar billede acore Ekspert
13. marts 2018 - 13:51 #36
Sorry, men jeg forstår ikke, hvad du mener med det
Avatar billede Thomasrn Seniormester
13. marts 2018 - 13:54 #37
alt den jeg logger ind på er hashed password $2y$10$LU5Eznk6SkuYb og får jeg også når jeg bruger denne kode :

echo("P1[".$password."]<br />P2[".$row['password']."]<br />");
$hashedpasswordCheck = password_verify($password, $row['password']);
Avatar billede Thomasrn Seniormester
13. marts 2018 - 14:50 #38
felt formatet burde være rigtigt varchar (20) det du  mener ikke?
Avatar billede acore Ekspert
13. marts 2018 - 17:54 #39
Felt format ser ok ud. Men jeg håber, at du kan se, at noget er galt:

Når du hasher "123456" med koden fra #32 får du "$2y$10$Ji8cQd02kUFgbQrdKtygXupreygynwGCZZoUJsFkonQEsmGxw6kZS".

Når du hasher "123456" med koden i #33 får du "$2y$10$LU5Eznk6SkuYb".

De skal give det samme! Prøv at skifte hash ud manuelt i databasen, og se at det virker. Så ved du at fejlen ikke ligger i login koden eller i databasen.
Avatar billede olsensweb.dk Ekspert
14. marts 2018 - 04:54 #40
#38
>felt formatet burde være rigtigt varchar (20) det du  mener ikke?

det felt er da for småt til en hash!!

ref http://php.net/manual/en/function.password-hash.php

PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).
PASSWORD_BCRYPT - Use the CRYPT_BLOWFISH algorithm to create the hash. This will produce a standard crypt() compatible hash using the "$2y$" identifier. The result will always be a 60 character string, or FALSE on failure.
PASSWORD_ARGON2I - Use the Argon2 hashing algorithm to create the hash.

pt er default algorithm bcrypt, så lige pt skal dit varchar (20) lavas om til min varchar (60)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester