16. december 2003 - 23:06Der er
50 kommentarer og 1 løsning
Undgå problemer ved brug af gåseøjne samt andre tegn
Hej.
Jeg har netop siddet og rodet med noget PHP. Så opdager jeg pludselig, at der kun er en del af mit indtastede date, der er blevet gemt i min database. Dette er sket, fordi jeg bruger gåseøjne ("). Tidligere har jeg løst problemet ved at erstattet tegnet med 2*'-tegn (''), men jeg bryder mig ikke om løsningen.
Findes der ikke bedre måder at gøre det på ? Vil gerne kunne indsætte "-tegn i min database.
Kan jeg i øvrigt forvente problemer med andre tegn ?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Du kan osse tjekke din opsætning. For hvis: "magic_quotes_gpc = On" tilføjes der automatisk backslashes til variabler fra GET, POST og COOKIES variabler.
Ja, den er = 1. Så jeg må ikke bruge addslashes. Men den løsning jeg skal finde, skal være uafhængig af opsætningen på serveren. Jeg vil kunne bruge mine script nøjagtigt hvor det passer mig.
Ja, du kan selvfølgelig altid køre en stripslashes() inden addslashes(), for at fjerne evt. \ først. Ellers kan du jo tjekke indstillingen i den her stil: if (!ini_get('magic_quotes_gpc')) $str = addslashes($str);
Erik > Der er vel i realiteten intet problem med at bruge " og '. De eksisterer vel i stortset alle tegnsæt?!. Jeg skriver nu også bare æ, ø og å, i stedet for HTML koden.
Det er korrekt at det virker med æ, ø og å i de fleste (men IKKE alle) browsere. Dette er dog et yderst direkte problem, da værdien ganske enkelt afsluttes ved det første "
Men om det rent faktisk er det, der er problemet, skal jeg ikke kunne sige.
detox: men så skal du tage højde for at ' kan forekomme i teksten. Den eneste løsning er at gøre det korrekt, med htmlentities, i stedet for selvopfundne, amatøragtige løsninger.
Jeg kunne fx. have noget fra en database hvor der stå "Hun sagde "hej"". Hvis man så forestillede sig, at jeg ville redigere denne tekst, skulle jeg bruge htmlentities uden om variablen, for at få den udskrevet rigtigt. Ellers ville jeg kun få en del af teksten med.
Jeg synes da ikke magic_qoutes_gpc eller addslashes() er amatøragtige og det er ikke noget jeg har fundet på. Jeg har aldrig oplevet problemer med hverken ' eller ". Jeg har til gengæld haft problemer med htmlentities, når den viser fx &qout; på skærmen istedet for ". Jeg har ikke oplevet problemer med hverken at gemme tekster med " eller ', eller få vist disse igen.
Lad os slå én ting fast : "-tegnet gemmes uden problemer i databasen. Så lad os holde os til udskrivning af indhold fra DB'en
Hvad angår HTMLentities, hvor skal den så bruges? KUN i selve html-koden? Eller også i fx. et div-tag ?
HTML Kode : <a href=\"test.php\" title=\"".$info["link"]."\"></a>
Div-Tag : <div class=\"test\">".$info["beskrivelse"]."</div> (Her betragter jeg ikke beskrivelsen som en del af HTML koden. Så her skal jeg vel ikke bruge HTMLentities ?? Eller er det blot en god ide at gøre det alligevel?)
Tidligere har jeg brugt : nl2br(htmlentities($info["beskrivelse"])); Så kunne der heller ikke "eksekveres" HTML kode. Er dette den rigtige løsning for mig ? - Simpelthen at bruge den overalt, hvor der hentes data fra databasen.
Det er en god idé at gøre det allesteder. Har du imidlertid html-tags i din tekst dur det ikke, så der er du nødt til at antage at alt er i orden (du kan ganske enkelt ikke gøre andet).
Øh, sukos, hvorfor siger du stripslashes når du trækker ud af databasen? Hvis du siger addslashes een gang, som det antydes, er det forkert at sig stripslashes igen. Hvis du siger addslashes 2 gange, den ene gang automatisk, den anden gang direkte, så er den addslashes/ stripslashes overflødig.
Æhæ,,, i php.ini ændrer jeg intet, altså magic_quotes_gpc = On.
Hvis ikke jeg bruger addslashes, kan en bruger jo netop "manipulere" med indhold som skal gemmes i DB'en. Og bruger jeg ikke stripslashes ved output, ja så kommer de jo med.
addslashes eller mysql_escape_string bruges kun for at undgå at en " eller ' afslutter strengen, eller at der laves andre ugerninger i MySQL sætningen. Når man bagefter hiver det ud af MySQL skulle der meget gerne ikke være backslashes i teksten, og en stripslashes er ikke nødvendig...
Det er fordi du laver 2 addslashes, een pga magic_quotes, og een fordi du gør det een gang til. Den ekstra gang er overflødig, forudsat selvfølgelig du fjerner din stripslashes.
Og lidt "farlig" er den også, da nogle tegn nu fylder dobbelt, og du dermed ikke kan regne med en erklæring som varchar(10).
Bør jeg virkelig tilføje : nl2br(htmlentities($var)) over alt ?
Fx. har jeg en form, hvor jeg angiver navn, beskrivelse osv. Hvis et krav ikke er opfyldt, udskrives en fejl, og den submit'ede tekst udskrives igen i formen, så brugeren ikke mister data. Men hvis jeg bruger ovenstående funktioner, bliver der efter submit smidt \ foran alle "-tegn. Det er ikke så godt.
Nej, addslashes - direkte eller indirekte - du'r kun til databasebrug. Skal du skrive en adslashet streng ud til brugeren, skal du stripslashe den inden brug. En streng du henter fra databasen er ikke addslashet. Er den fra en form kan den være det hvis det sker automatisk, eller du selv gør det.
Den der automatiske addslash-ting (magic_quotes) er faktisk noget hø, og en ikke særlig gennemtænkt beslutning, vi desværre må leve med ;)
Ok. Man kunne så evt. komme uden om problemet ved, at erstatte \" med ". Det er nok de færreste der vil bruge en backslash og gåseøjne op ad hinanden :)
Men det er da også et problem det du nævner. Hvis brugeren skriver i en form :
- Pigen sagde "hej". - Brugeren trykker nu submit, men har glemt et felt (som skal udfyldes) - Der udskrives en fejl-besked, og værdierne som brugeren indtastede, sættes ind i input-felterne igen. Men nu lyder teksten : Pigen sagde \"hej\".
Hvis brugeren ikke opdager fejlen, submitter han nu noget, som han ikke har været med til at skrive.
Hm, jeg er lidt i tvivl nu. Vil det sige, at jeg _både_ skal bruge nl2br(htmlentities($var)) samt stripslashes ? Dvs. 3 funktioner for at få udskrevet noget fra min DB.
Og du skal selv bruge addslashes hvis du udtrækker noget fra en database, ændrer i det, og putter det tilbage igen (altså uden det har været en tur forbi en form). Hvis du ved det er tal behøv's du så ikke.
Mit problem er jo netop, at jeg ikke ved, hvornår der er \ i mine variabler. Serveren tilføjer dem selv nu og da. Er du med på min beskrivelse ang. submit af data i en form ?
Du kunne også bare svare mig på, om nedenstående er korrekt :) :
- Jeg tilføjer brugerens input nøjagtigt som han angiver det i formen (dog med \ i teksten hvis serveren selv indsætter det) - Ved udtræk bruger jeg nl2br(htmlentities($book["var"]))
Det er fint, hvis vi er enige om, at jeg bare indsætter i DB'en, og trækker ud vha. : nl2br(htmlentities($book["var"]))
Men det giver stadig et mindre problem. Jeg har tror ikke jeg har forklaret det godt nok, for vi snakker vist forbi hinanden. Så jeg viser dig det i stedet.
Lad os så i stedet antage, at det var data, som blev smidt i databasen. Så ville jeg få en masse \"'ere, hvis folk ikke selv retter det (og altså opdager det).
if (!ini_get('magic_quotes_gpc')) $str = addslashes($str);
er brugbar, hvis du vil sikre dig at din kode skal kunne køre på alle servere uanset magic_quotes_gpc indstillingen. Jeg kan til gengæld godt se problematikken, når du skal bruge variablerne fra din database i en form eller et link, skal der selvfølgelig bruges htmlentities(). MVH c",)
Jo, det er rigtigt for at putte det i databasen, såmænd. Problemet er et andet her, og det løses her med htmlentities som man skal. Jeg gider ikke have point for sådan en lang, mærkelig, diskussion ;)
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.