Avatar billede Bjarne Novice
30. juli 2006 - 20:13 Der er 13 kommentarer og
1 løsning

Korrekt behandling af data til database

God aften

Jeg har lidt problemer ifb. med behandling af data til en database. Jeg bruger følgende funktion når jeg indsætter:

function SmartQuote($val) {
if(get_magic_quotes_gpc() == TRUE) {
$val = stripslashes($val);
                }
               
if(!is_numeric($val)) {
$val = addslashes($val);
}
               
return $val;
}

Og stripslashes når jeg hiver data ud igen. Det fjerner selvfølgelig de \ som bliver sat når der indsættes data. Men den fjerner også de \ som faktisk er lavet af brugeren. Hvordan laver jeg det, så man kan bruge \ uden det går ud over sikkerheden?
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 20:50 #1
Du skal ikke lave stripslashes ved udtræk - aldrig.
Avatar billede kokoko Nybegynder
30. juli 2006 - 20:52 #2
Det er ikke anbefalet at bruge addslashes(). Brug istedet en database specifik funktion til dette hvis en sådan findes. Jeg antager du bruger mySQL som database og der kan du fx. bruge mysql_real_escape_string().

Slashes bliver ikke indsat i databasen men gør bare at en streng bliver indsat korrekt. Derfor skal du ikke bruge stripslashes() når du hiver dataene ud af databasen igen.
Avatar billede Bjarne Novice
30. juli 2006 - 21:03 #3
Okay - ergo hvis jeg omskriver funktionen:

function SmartQuote($val) {
if(get_magic_quotes_gpc() == TRUE) {
$val = stripslashes($val);
                }
             
if(!is_numeric($val)) {
$val = mysql_real_escape_string($val);
}
             
return $val;
}

+ undlader stripslashes ved udtræk

Vil det så virke, så man kan skrive \ ?
Er databasen sikret ordentligt mod SQL-injections?
Avatar billede kokoko Nybegynder
30. juli 2006 - 21:23 #4
Ja det vil virke med \...

Ja den er vel sikret mod SQL-injections. Du bør dog sikre dig at en integer nu også er en integer. Dette kan du bruge intval() til. Samt noget lignende ved andre typer.

Et andet problem er så HTML-injections (Eller hvad det nu kaldes). Der kan du bruge htmlentities(mysql_real_escape_string($val), ENT_NOQUOTES) istedet for at kalde htmlentities når du tager dataene ud af databasen.
Avatar billede Bjarne Novice
30. juli 2006 - 21:31 #5
Okay - vil du uddybe "sikre sig at en integer er en integer"?
Avatar billede kokoko Nybegynder
30. juli 2006 - 21:39 #6
Hvis du har en form hvor du forventer at et felt indeholder et heltal (fx et postnummer), så bør du også sikre dig at det er præcis hvad der er tastet ind, ellers vel der ske en fejl når SQL statement bliver udført. intval() gør det at den returnere en heltals værdi af en streng.

Dette har selvfølgelig ikke noget med SQL injections at gøre, men blot for at minimere fejl.
Avatar billede Bjarne Novice
31. juli 2006 - 00:16 #7
okay, smid et svar
Avatar billede plx Nybegynder
31. juli 2006 - 00:22 #8
At en submitted integer ikke indeholder en integer, kan vel stadigvæk et sql injektion angreb. De er faktisk ret typiske

Det bør vel være mysql_real_escape_string som pakker htmlentities ind, og ikke omvendt
Avatar billede kokoko Nybegynder
31. juli 2006 - 08:35 #9
plx: det er selvfølgelig rigtig at heltal også kan benyttes til sql injection hvis indhold ikke escapes. Og jo der bør byttes om på de to funktioner.
Avatar billede Bjarne Novice
31. juli 2006 - 12:12 #10
Jeg bruger stripslashes når magic_quotes_gpc er on - vil det ikke fjerne de \ brugeren laver?

function SmartQuote($val) {
if(get_magic_quotes_gpc() == TRUE) {
$val = stripslashes($val);
                }
           
if(!is_numeric($val)) {
$val = mysql_real_escape_string(htmlentities($val));
}
           
return $val;
}
Avatar billede erikjacobsen Ekspert
31. juli 2006 - 12:49 #11
Nej, for dem er der allerede af automatikken sat en \ foran: \\, så det efter stripslashes bliver til \ igen.
Avatar billede kokoko Nybegynder
31. juli 2006 - 12:56 #12
Hvis du har problemer med at den fjerner \ som brugeren har indtastet kan det være fordi du kører stripslashes() to gange.
Avatar billede Slettet bruger
31. juli 2006 - 16:37 #13
Rettelse til indlæg af erikjacobsen 30/07-2006 20:50:48:

Jo, hvis magic_quotes_runtime er slået til, så sætter maskineriet automatisk \ i udtræk lige som magic_quotes_gpc gør ved udefrakommende data.

Så hvis den er slået til, skal man bruge stripslashes ved udtræk.
Avatar billede Bjarne Novice
31. juli 2006 - 18:17 #14
Tak for hjælpen alle. Hvis der er flere som ønsker point: Smid et svar :)
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