Thomasrn Juniormester
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{
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.
Thomasrn Juniormester
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)
jakobdo Ekspert
02. februar 2018 - 13:40 #3
Hvad får du af fejl ?
Thomasrn Juniormester
02. februar 2018 - 14:19 #4
Den skriver bare index.php?login=error3 i browseren
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 ?
Thomasrn Juniormester
02. februar 2018 - 17:03 #6
$password kom fra databasen
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".
Thomasrn Juniormester
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();
}
ejvindh Seniormester
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]
jakobdo Ekspert
05. februar 2018 - 13:05 #10
Vi ved stadig ikke hvordan funktionen:

password_verify() virker.
ejvindh Seniormester
06. februar 2018 - 10:29 #11
#10: Tror du ikke bare det er denne: http://php.net/manual/en/function.password-verify.php ?
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
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.
Thomasrn Juniormester
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()
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.
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.
Thomasrn Juniormester
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
acore Ekspert
26. februar 2018 - 20:09 #18
Hmmm - er du virkelig sikker på det?
Thomasrn Juniormester
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
acore Ekspert
26. februar 2018 - 20:48 #20
Og hvad hvis password er forkert? Gætter på at det også giver login
acore Ekspert
26. februar 2018 - 20:49 #21
Hvis jeg har ret, så genlæs #15
Thomasrn Juniormester
26. februar 2018 - 21:39 #22
har du sgu ret i
Thomasrn Juniormester
09. marts 2018 - 08:38 #23
ved du hvad fejlen er? For har tjekket igennem og kan ikke finde fejlen
acore Ekspert
09. marts 2018 - 19:44 #24
Ikke sikker, men mit bedste gæt er i #15
Thomasrn Juniormester
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");
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.
Thomasrn Juniormester
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
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.
Thomasrn Juniormester
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
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
Thomasrn Juniormester
13. marts 2018 - 12:31 #31
P1[123456]
P2[$2y$10$LU5Eznk6SkuYb]

p1 indtastede kode og p2 må være den hashed
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.
Thomasrn Juniormester
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?
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?
Thomasrn Juniormester
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 />";
acore Ekspert
13. marts 2018 - 13:51 #36
Sorry, men jeg forstår ikke, hvad du mener med det
Thomasrn Juniormester
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']);
Thomasrn Juniormester
13. marts 2018 - 14:50 #38
felt formatet burde være rigtigt varchar (20) det du  mener ikke?
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.
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)
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

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





Premium
Mere end 1.000 CPR-numre på danske universitetsstuderende lå offentligt tilgængeligt i mere end tre år
En fejlplacering af to filer har betydet at CPR-numre på mere end 1.000 studerende har ligget offentligt tilgængeligt på nettet i mere end tre år.
Computerworld
Gratis wifi på vej i 15 danske byer: Disse danske byer bliver del af europæisk wifi-initiativ
Femten danske byer er blevet udvalgt til at deltage i et EU-initiativ, der betyder, at borger og turister i byerne i løbet af de kommende år vil få adgang til gratis wifi.
CIO
Tag med på Computerworlds store lederkonference og mød de danske top-CIO'er, som bygger de nye it-afdelinger
Anvendelsen af digital teknologi og organiseringen af it-afdelinger er under radikal transformation. På konferencen Digitaliseringsledelse 2.0 kan du møde de CIO'er fra Bankdata, Adform og Rockwool, som står i spidsen for teknologi-adoptionen.
Job & Karriere
Efter blodrødt regnskab: Nu fyrer Atea 20 medarbejdere i Danmark
Atea fyrer nu 20 medarbejdere. Det sker som en direkte konsekvens af, at den danske forretning er under pres, oplyser selskabets direktør.
White paper
6 gode råd til et succesfuldt virtuelt møde
Den traditionelle måde at tænke arbejdsplads på er under forandring. Nye teknologier skyder frem og gør hverdagen nemmere og mere dynamisk. Eksempelvis er mængden af fjernarbejdspladser steget med 115% de seneste 10 år, og det stiller krav til måden at holde møder på. Med et virtuelt møderum kan møder faciliteres online, og alle parter sparer tid fordi det er mere fleksibelt og ikke betinget af at alle møder op fysisk. I dette whitepaper kigger vi på hvad der skal til for at mestre denne disciplin og giver dig 6 gode råd.