Avatar billede huk Nybegynder
30. december 2008 - 14:28 Der er 14 kommentarer og
1 løsning

Problem med validering af data i db

Hej eksperter...

Jeg er ny inden for php og MySQL og har et problem jeg håber i kan hjælpe med.
Jeg kan få forbindelse til min db men der er tilsyneladende et problem med validering af data i den.

Jeg har lavet en form hvor brugere skal kunne indtaste brugernavn og password. Koden ser således ud:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
<head>
  <title>LOGIN</title>
</head>
<body>
<form action="validation.php" method="post">
    Username: <input type="text" name="username"/><br/><br/>
    Password: <input type="password" name="password"/><br/><br/>
    <input type="submit" value ="Login" />
</form>
</body>
</html>

Dette virker....tror jeg nok:-)

Min validation.php fil ser således ud:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

<body>
<?php
//Delclare variables
$dbhost = "***********";
$dbuser = "***********";
$dbpass = "***********";

//Create connection to MySQL
$con = mysql_connect($dbhost,$dbuser,$dbpass);

//Evaluate if connection to database was established or not
if (!$con)        
    die('Could not connect: ' . mysql_error());
else
    echo "Connection established";

// Get data from form
$user = $_POST["username"];
$password = md5($_POST["password"]);

//select table
mysql_select_db($dbuser, $con);

//Search the database for a User with corresponding password
$checkuser = mysql_query("SELECT Username FROM Logins WHERE  Username='$user' AND Password = '$password'");

//Get the number of matches
$username_exist = mysql_num_rows($checkuser);

if($username_exist > 0)
    echo " User info confirmed by administartor....";
else
    echo " Invalid information";
   
mysql_close($con);
?>
</body>

</html>

Jeg smider lidt tekst på skærmen for at se hvor det går galt... og følgende blir skrevet: Connection established Invalid information

Jeg med vilje ikke postet db_imformationer.

I min database eksisterer en tabel med 2 kolonner: Username & Password begge af typen VARCHAR. Her har jeg oprettet en bruger med password, men når jeg indtaster tilsvarende information i min form får jeg ikke som forventet skrevet:
Connection established User info confirmed by administartor....
Avatar billede huk Nybegynder
30. december 2008 - 14:34 #1
Jeg har selv lidt mistanke til at det er i nedenstående linje at fejlen ligger...

$checkuser = mysql_query("SELECT Username FROM Logins WHERE  Username='$user' AND Password = '$password'");
Avatar billede huk Nybegynder
30. december 2008 - 14:35 #2
tabellen hedder Logins forresten...
Avatar billede moddi100 Seniormester
30. december 2008 - 14:52 #3
Du bør udskifte følgende

$user = $_POST["username"];

med dette:

$user = mysql_real_escape_string($_POST["username"]);

Hvis der automatisk tilføjes slashes til formdata, bør du skrive sådan her (Bør du skrive under alle omstændigheder) :D

$user = mysql_real_escape_string((get_magic_quotes_gpc() ? stripslashes($_POST["username"]) : $_POST["username"]));
Avatar billede erikjacobsen Ekspert
30. december 2008 - 14:54 #4
Du putter også i med md5? Hvor mange tegn har du afsat til de 2 felter?
Avatar billede moddi100 Seniormester
30. december 2008 - 14:54 #5
Når du opretter en bruger i databasen, husker du så også at kryptere hans password?
Avatar billede huk Nybegynder
30. december 2008 - 15:01 #6
Jeg ved ikke lige hvordan jeg krypterer endnu, men det er da planen jeg vil gøre det inden det skal bruges...
Avatar billede huk Nybegynder
30. december 2008 - 15:02 #7
Jeg har afsat hhv 25 og 15 karakterer itabellen i de 2 kolonner.

Jeg vil lige prøve at arbejde lidt videre med jeres forslag og så vender jeg tilbage
Avatar billede erikjacobsen Ekspert
30. december 2008 - 15:12 #8
En md5-streng fylder 32 tegn - 15 er for lidt. Bruger du også md5 når du opretter brugeren?
Avatar billede moddi100 Seniormester
30. december 2008 - 15:21 #9
Når du skriver

$password = md5($_POST["password"]);

krypterer du også, idet md5() er en krypteringsfunktion (eller rettere hashing, som visse individer foretrækker) :D

Sæt feltet password til 32 som erik rigtigt nok siger.

Prøv så at oprette en nye bruger. Kald ham hvad du vil, gå så til
http://www.hjemmesideskolen.dk/scripts/phppass/kryptering.php
og indtast '1234'.
På siden kommer der så en 32-cifret streng. Den gemmer du i databasen.

Prøv så at teste dit script med det valgte brugernavn og password 1234
Avatar billede huk Nybegynder
30. december 2008 - 18:02 #10
Hej igen

Undskyld jeg var lidt langsom men der kom lige noget i vejen, men nu har jeg prøvet det af.

Jeg har rettet flg:
1. $user = mysql_real_escape_string((get_magic_quotes_gpc() ? stripslashes($_POST["username"]) : $_POST["username"]));

2. Brugt md5() når jeg lægger det ind i databasen (Har bare gjort det manuelt fra PHPMyAdmin)

3. udvidet længden på passwordet til 32.

og nu virker det....

mange tak for det.

Smider i et svar tak....
Avatar billede erikjacobsen Ekspert
30. december 2008 - 18:37 #11
Ingen point til mig, tak.
Avatar billede moddi100 Seniormester
30. december 2008 - 18:39 #12
Og et svar fra mig
Avatar billede huk Nybegynder
30. december 2008 - 18:55 #13
Jeg har lige et spørgsmål til nedenstående sætning:

mysql_real_escape_string((get_magic_quotes_gpc() ? stripslashes($_POST["username"]) : $_POST

Er det samme syntax som i C++ så det er en inline if-else sætning? Det må det jo næsten være...
Avatar billede moddi100 Seniormester
30. december 2008 - 19:08 #14
Ja, lad mig forklare hvad den gør:

mysql_real_escape_string() // Escaper den angivne streng, så specialtegn ikke 'opfattes' som specialtegn, men blot som en del af teksten.

((get_magic_quotes_gpc() ? stripslashes($_POST["username"]) : $_POST)

betyder, at hvis der automatisk escapes (på en 'dårligere' måde end mysql_real_escape_string()), skal disse escapetegn (\) fjernes, før der escapes, ellers skal der bare escapes.
Avatar billede erikjacobsen Ekspert
30. december 2008 - 19:11 #15
I virkelighedens verden vil man fjerne \-erne som anført, men ikke bruge mysql_real_escape_string. I stedet vil man bruge fx http://php.net/mysqli med anvendelse af parameters.
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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