Avatar billede bumle90 Nybegynder
31. juli 2004 - 11:32 Der 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
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:00 #1
Og forresten, de der magic_quotes_gpc hvordan virker de helt præcist?
Avatar billede detox Nybegynder
31. juli 2004 - 12:07 #2
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 \.
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:12 #3
Men altså den er sat på, og det har absolut ingen indvirkning
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:13 #4
get_magic_quotes_gpc() er = 1
jeg har også prøvet med get_magic_quotes_runtime() = 1
og det hjælper stadig ikke
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:13 #5
Skal man gøre noget ekstra?
Avatar billede detox Nybegynder
31. juli 2004 - 12:14 #6
Har du prøvet at udprinte sql forespørgslen, så tror jeg du vil se at den er escapet. Du kan nemlig ikke se det når først den ligger i databasen.
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:15 #7
Hvis nu følgende er sat i databasen : O\'Reilly
Så skal backslash da fjernes igen når det hentes ud af databasen?
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:16 #8
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
Avatar billede bumle90 Nybegynder
31. juli 2004 - 12:22 #9
Mangler jeg noget?
Avatar billede detox Nybegynder
31. juli 2004 - 12:45 #10
Prøv dette eks og se hvad det giver:

<?php
if (isset($_POST['submit']) && $_POST['submit'] == 'Send') {
    if (!get_magic_quotes_gpc()) $test = addslashes($_POST['test']);
    else $test = $_POST['test'];
    echo $test;
} else {
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<input type="text" name="test" />
<input type="submit" name="submit" value="Send" >
</form>
<?php
}?>
Avatar billede swaxi Nybegynder
31. juli 2004 - 13:03 #11
>Hvis nu følgende er sat i databasen : O\'Reilly
>Så skal backslash da fjernes igen når det hentes ud af databasen?

nej, det skal de faktisk ikke.
Avatar billede bumle90 Nybegynder
01. august 2004 - 01:56 #12
hmm er det ik´ke bare fordi html ignorerer \ ?
Der er vel stadig indehold \ i sætningen når man hiver det ud, hvis det var der da man satte det ind??
Avatar billede swaxi Nybegynder
01. august 2004 - 19:54 #13
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.
Avatar billede 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.

Se eventuelt min artikel: http://www.eksperten.dk/artikler/190 som netop handler om slashes.
Avatar billede bumle90 Nybegynder
24. august 2004 - 18:09 #15
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.
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