31. juli 2004 - 11:32Der er
14 kommentarer og 1 løsning
Database "sql-injection" sikkerheds opbygning
Jeg er kommet til at sande at jeg nok istedet for at skulle lave et funktionskald til encode på alle data der skal i databasen og decoding til alle data der skal ud(dvs. fjerne/erstatte plinger osv) nok bliver nødt til at lave en form for centraliseret løsning. Jeg tænkte noget i retning af at lave wrapperfunktioner til mine mysql_fetch kald. Men jeg sidder nu og grunder over hvordan jeg gør dette mest optimalt. Hvordan jeg smartest får helt data+sql-streng over til funktionen osv. Det skal jo helst være således at man bare skal kalde wrapsql($sql); eller noget lignende.
Da jeg ved at dette er et generelt problem stiller jeg dette spørgsmål for at få lidt råd fra andre folk der har lavet tilsvarende. Mange tak Bumle90
magic_quotes_gpc sørger for at escape strenge fra GET, POST og COOKIE variabler, så med den sat er det ikke nødvendigt selv at gøre det. Det skulle aldrig være nødvendigt at fjerne backslashes fra noget der er hentet i databasen. I så fald er der sat for mange backslashes på. Du kan tjekke om den er sat med: get_magic_quotes_gpc() og i så fald undlade at tilføje ekstra \.
Jeg har printet sessionsvariablen ud hvori jeg har lagt værdien af det der er posted fra html-formen. Og desuden kommer der sql-fejl hvis jeg skriver ' i feltet i html-formen
nej det er netop pointen. du skal ikke føle dig dum, hvis du er forvirret, er der noget, der kan drive folk til vanvid, så er det string-encoding.
hvis du skal have data fra ind i din db, sender du eks. følgende linie til db-serveren : UPDATE foo SET bar=futhark db-serveren læser og fortolker dette som følgende : For alle poster i tabellen foo, skal værdien bar sættes til futhark
Det går fint, men hvis du nu ville indsætte noget tekst, der kunne fortolkes som en sql-kommando, så får du et problem. db-serveren er ikke smart nok til, at forstå hvad der er tekst som skal indsættes, og hvad der er kommando. derfor omslutter du teksten med gåseøjne. Antag følgende : UPDATE foo SET bar='futhark and hieroglyphs'
db-serveren læser dette og forstår det som forrige eksempel. men hvis vi ikke satte gåseøjnene rundt om futhark and hieroglyphs, ville db-serveren ikke forstå sætningen, eftersom AND er en ord med en særlig betydning.
så langt er du jo nok med. problemet opstår nu ved, at gåseøjnene kan redde os fra alt undtagen sig selv. hvis du skulle lave en sætning, der indeholder gåseøjne, ville du have problemer. Antag følgende : UPDATE foo SET bar='futhark and 'hieroglyphs''
Hvad du mener er selvfølgeligt at følgende sætning skal indsættes i databasen : futhark and 'hieroglyphs'
Dette forstår db-serveren imidlertid ikke. I stedet læser den tre strings. Nemlig : futhark and hieroglyphs og til sidst en string, der indeholder ingenting.
De kloge folk, der har opfundet alt dette hejs, fandt imidlertid på noget smart. De besluttede at db-serveren læser alt mellem to gåseøjne som en string (samme som før), men der er een undtalgelse fra denne regel. Hvis der sættes en backslash foran et gåseøjen, skal det opfattes som en del af stringen, mens skråstregen selv skal ignoreres. Derfor kan du gøre følgende : UPDATE foo SET bar='futhark and \'hieroglyphs\''
og db-serveren vil tolke stringen som bestående af futhark and 'hieroglyphs'
bemærk at det er denne tekst, der indsættes i databasen. enkodningen tjener kun til formål at "beskytte" data ved indsættelse i databasen.
Når data trækkes ud af db igen tager php sig automatisk af, at beskytte data. derfor skal får du data ud som de ligger i databasen. og du skal derfor IKKE bruge eks. stripslashes() på resultatet.
jeg håber det gør tingene lidt klarere for dig. hvis du mistede tråden undervejs, så prøv lige, at læse min post en ekstra gang - det gælder om at holde tungen lige i munden.
Synes godt om
Slettet bruger
04. august 2004 - 00:29#14
som tilføjelse til swaxis glimrende forklaring vil jeg lige nævne, at når get_magic_quotes_runtime() = 1 så vil der automatisk blive indsat nye backslashes i det, du henter fra databasen, for at man ikke behøver lave dem selv, hvis man skal sætte ind i database igen. Hvis det er tilfældet, Skal du bruge stripslashes, når du udskriver tekst.
Undskyld den bratte afslutning, men jeg har lidt for mange løse ender...Blir nødt til at lukke for nogle af alle mine spg. Tak for hjællpen. Hvis der er lagt svar får disse point, eller er jeg nødt til at tage dem selv for at lukke alle de her spg. Mvh.
Synes godt om
Ny brugerNybegynder
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.