Avatar billede kavlar Novice
20. april 2009 - 10:47 Der er 9 kommentarer og
1 løsning

Select query - virker kun med absolut værdi - Hvad gør jeg galt?

Hej eksperter,

Jeg har en MySQL database med nogle brugerdata. Jeg forsøger at lave et login, hvor jeg tester om password og brugernavn er korret. Men når jeg forsøger at teste via en variable, får jeg fejl, mens det virker, når jeg taster den absolutte værdi af koden.
Neden for er min php-kode:

DENNE KODE VIRKER IKKE!
<?php
$kode = "kodeord";
$user = "bruger";
include("dbconnect.php");
mysql_select_db("Database", $conn);
$result = mysql_query("SELECT * FROM Bruger WHERE kode = $kode AND User = $user") or die
(mysql_error() . mysql_errno());
$no_rows = mysql_num_rows($result);
echo $no_rows
?>


DENNE KODE VIRKER!
<?php
$kode = "kodeord";
$user = "bruger";
include("dbconnect.php");
mysql_select_db("Database", $conn);
$result = mysql_query("SELECT * FROM Bruger WHERE kode = 'kodeord' AND user = $user") or die
(mysql_error() . mysql_errno());
$no_rows = mysql_num_rows($result);
echo $no_rows
?>


Jeg får følgende meddelelse:  [i]Unknown column 'kodeord' in 'where clause'1054[/]

Kan I se, hvad det er jeg gør galt. Feltet kode er defineret som varchar(20) i MySQL databasen

På forhånd tak for hjælpen
Avatar billede jakobdo Ekspert
20. april 2009 - 11:00 #1
Du skal rette linjen:

$result = mysql_query("SELECT * FROM Bruger WHERE kode = $kode AND User = $user") or die
(mysql_error() . mysql_errno());

til:

$result = mysql_query("SELECT * FROM Bruger WHERE kode = '$kode' AND User = '$user'") or die
(mysql_error() . mysql_errno());
Avatar billede majbom Novice
20. april 2009 - 11:08 #2
du bør dog enten ændre din query eller benytte mysqli for at undgå mysql-injections.

hvis du ændrer querien, så du henter navn og kode fra db hvor navnet mtacher og derefter tjekker om koderne stemmer overens, kan man ikke omgå det så nemt, som man kan i din nuværende metode.
Avatar billede kavlar Novice
20. april 2009 - 11:43 #3
Jackobdo's svar løser problemet. Men jeg tror ikke du har postet det som et "svar".

splazz - Jeg er ikke helt sikker på, hvad du mener. Jeg er noget uerfaren med php. Mysqli, er det en anden metode til at forbinde til databasen med? Hvad er formålet/fordelen?
Avatar billede jakobdo Ekspert
20. april 2009 - 11:46 #4
Svar!
Avatar billede majbom Novice
20. april 2009 - 12:27 #5
mysqli i en nyere måde at "snakke" med databasen på. den gør det på en måde, hvor sql-injections ikke er muligt.

det jeg mener er at i stedet for:

"SELECT * FROM Bruger WHERE user='$user' AND kode='$kode'"

skal du kun:

"SELECT * FROM Bruger WHERE user='$user'"

og så derefter tjekke om den indtastede kode stemmer med den der netop blev hentet fra db'en
Avatar billede jakobdo Ekspert
20. april 2009 - 12:55 #6
splazz: Hvad er forskellen på:

"SELECT * FROM Bruger WHERE user='$user' AND kode='$kode'"

skal du kun:

"SELECT * FROM Bruger WHERE user='$user'"

og så derefter tjekke om den indtastede kode stemmer med den der netop blev hentet fra db'en

Jeg ville jo altid selv lave:

"SELECT * FROM Bruger WHERE user='$user' AND kode='$kode' LIMIT 1"
Avatar billede jakobdo Ekspert
20. april 2009 - 14:12 #7
Takker for point.
Avatar billede majbom Novice
20. april 2009 - 14:34 #8
-> jakob - med den rigtige sql-injection kan du sagtens få fin query til at returne en række og hvis man ud fra det opretter en session, er det jo ikke noget problem.

hvis man derimod gør det på min måde og senere tjekker passwordet mod det der er hentet i query'en og først i tilfælde af at de to matcher giver adgang til de beskyttede sider, er det lidt sværere at komme ind.

ret mig endelig hvis jeg tager fejl. der er sikkert en måde at bryde den på også :)
Avatar billede jakobdo Ekspert
20. april 2009 - 14:38 #9
Du har selvfølgelig ret i din løsning er et ekstra niveau af sikkerhed.
Men hvis man sikrer sit input i første omgang, så er min løsning vel ok.

brugernavn = a-z0-9 og måske det samme med kodeord.
Så burde en sql injection jo ikke være mulig, da jeg formoder det mindst kræver en ' eller hex/octal værdien for den.
Avatar billede majbom Novice
20. april 2009 - 15:25 #10
ja det er selvfølgelig rigtigt.

men med en combo af de to ting, bliver det svært :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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