Avatar billede cow2 Nybegynder
22. november 2006 - 12:29 Der er 21 kommentarer

Problemer med at indsætte i database med tegn

Efter vi har skiftet til en nyere version af MySQL/PHP har jeg problemer med at tilføje til databasen:

hvis

$navn = "Peter's";

mysql_query("INSERT INTO kunde (navn) VALUES ('$navn')");

så går der ged i den, og det er vel fordi $navn indeholder et ', hvad kan jeg gører for at undgå dette ?
Avatar billede showsource Seniormester
22. november 2006 - 12:30 #1
Du bør altid bruge mysql_real_escape_string() så undgår du injections
Avatar billede showsource Seniormester
22. november 2006 - 12:31 #2
Avatar billede cow2 Nybegynder
22. november 2006 - 12:35 #3
kan du ikke prøve at sætte det sammen med min kode så jeg se hvordan det virker i praksis ;) ?
Avatar billede showsource Seniormester
22. november 2006 - 12:37 #4
Johh, nu bruger det selv i en funktion, men vil mene:
mysql_query("INSERT INTO kunde (navn) VALUES ('". mysql_real_escape_string($navn) ."')");
Avatar billede showsource Seniormester
22. november 2006 - 12:39 #5
Den funktion jeg bruger, "hentet" fra linket til php.net

function safe_query($var, $seek = false) {

    if(get_magic_quotes_gpc()) {
    $var = stripslashes($var);
    }

    if($seek != true) {

        if(!is_numeric($var)) {
        $var = "'". mysql_real_escape_string($var) ."'";
        }

    }else{

    $var = "'%". mysql_real_escape_string($var) ."%'";

    }

    return $var;
}

Lavet for også at kunne bruge den som søgning i DB

mysql_query("INSERT INTO kunde (navn) VALUES (". safe_query($navn) .")");
Avatar billede cow2 Nybegynder
22. november 2006 - 12:40 #6
Det var lidt voldsomt det må kunne laves kortere :)
Avatar billede showsource Seniormester
22. november 2006 - 12:43 #7
næhh, ikke rigtigt.
Men ok, du kan fjerne muligheden for at søge.

function safe_query($var) {

    if(get_magic_quotes_gpc()) {
    $var = stripslashes($var);
    }

        if(!is_numeric($var)) {
        $var = "'". mysql_real_escape_string($var) ."'";
        }

    return $var;
}
Avatar billede showsource Seniormester
22. november 2006 - 12:45 #8
if(get_magic_quotes_gpc()) { // Tjekker om PHP er sat til at escape "farlige tegn"

if(!is_numeric($var)) { // Tjekker om det er et tal. I så fald behøves der ikke ' omkring $var i query
Avatar billede cow2 Nybegynder
22. november 2006 - 12:51 #9
jamen kan man ikke bare lave noget streng replace, for at fjerne de tegn som MySQL ikke kan klare....Jeg skal kun bruge det når jeg indsætter noget i databasen...

Jeg har mange variabler der bliver indsat så bliver det jo til meget kode!
Avatar billede showsource Seniormester
22. november 2006 - 12:53 #10
Jamen vil du gemme tegn som ' og " eller vil du bare fjerne dem?
Avatar billede cow2 Nybegynder
22. november 2006 - 13:05 #11
det skal stædig være der, men det skal jo være sådan at mysql ikke går kold over dem ?
Avatar billede kinderaeg Nybegynder
22. november 2006 - 13:06 #12
mysql_real_escape_string($navn) er jo også en form for replace, og hvis du bruger safe_query-funktionen, skal du jo også kun oprette funktionen en gang, og så ellers bare kalde den, fra de andre sider (li'som hvis du ville sætte en replace ind)
Avatar billede cow2 Nybegynder
22. november 2006 - 13:12 #13
altså man kan ikke kun bruge denne:

$navn = mysql_real_escape_string($navn);
Avatar billede kinderaeg Nybegynder
22. november 2006 - 13:33 #14
Det kan du sagtens, med mindre ikke allerede har en connection til databasen åben (og det går jeg ud fra du har, når du vil foretage et db-kald). Det er et opslag i databasen, der foretages, og såfremt der er adgang dertil (via en connection), kan du sagtens køre ovenstående, men hvis du har førsøgt ovenstående i en selvstændig test-fil uden en db-connection åben, vil du få en fejl
Avatar billede cow2 Nybegynder
22. november 2006 - 13:44 #15
ok men hvorfor er det så at i siger jeg ikke kan nøjes med at bruge ovenstående ?
Avatar billede cow2 Nybegynder
22. november 2006 - 14:05 #16
og er det kun ' og " som den ikke kan tage ?
Avatar billede cow2 Nybegynder
22. november 2006 - 14:31 #17
altså med $navn = mysql_real_escape_string($navn); bliver Peter's lavet om til Peter\'s

så den virker jo fint, er det så ikke nok at bruge den ?
Avatar billede cow2 Nybegynder
22. november 2006 - 14:35 #18
virker også fint hvis man ikke har connect til database osv... ?
Avatar billede kinderaeg Nybegynder
22. november 2006 - 16:39 #19
Funktionen safe_query er bare en lidt mere avanceret version, der først går ind og tjekker om magic-quotes er sat op på severen og derefter forholdersig til at det er in insert eller search og til sidst, ud fra om variablen er et tal, undlader at sætte '' omkring. Det er for så vidt unødvendigt, og kun noget der kan gøre din programmering lettere fremover, ikke hvis du skal ændre alle dine koder i forhold til det ;)

Og for at svare på dit spørgsmål, jo, du kan sagtens nøjes med $navn = mysql_real_escape_string($navn);, såfremt du ved, at din server ikke anvender magic-quotes :)
Avatar billede cow2 Nybegynder
22. november 2006 - 16:57 #20
ok, det virkede på den gamle server, men på den nye gør det ikke så der må magic-quotes være slået fra, hvis man så kommer over på en server hvor det er slået til går der så ged i det når man bruger mysql_real_escape_string ?


Er det noget sikkerhedsmæssigt at man slå magic quotes fra på serveren ?
Avatar billede kinderaeg Nybegynder
22. november 2006 - 22:24 #21
Ikke som sådan, men det er jo ikke altid nødvendigt at anvende escapes i strenge, og så skal du jo arbejde den anden vej, og så er der selvfølgelig et performance-hensyn.

http://dk.php.net/manual/en/security.magicquotes.whynot.php
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