Gå til innhold

[løst] magic_quotes_gpc og mysql_real_escape_string sammen


Anbefalte innlegg

I php.ini har jeg latt magic_quotes_gpc bli stående som default på. Når jeg så mottar data via $_POST og $_GET og i tillegg bruker mysql_real_escape_string så blir det virkelig mye "slashes".

 

Jeg bruker da: stripslashes(stripslashes()) for og "vaske" tekstkopi som skal vises på skjerm, og stripslashes() på det som skal inn i databasen.

 

Holder det kanskje og bruke en av dem? Og i tilfelle hvem burde jeg velge, og hvorfor?

 

Edit: Markert som løst

Endret av pulse
Lenke til kommentar
Videoannonse
Annonse
/*******************
 * Funksjon skrevet av Grimjoey (tror jeg).
 **********************/
function my_esc ($msg) {
if (!is_numeric ($msg)) {
	if (get_magic_quotes_gpc ()) $msg = stripslashes($msg);
	$msg = "'".mysql_real_escape_string ($msg)."'";
}
return $msg;
}
$var = my_esc( $_POST['var'] );

Lenke til kommentar

mhm, og det var jo dette jeg skrev i første post og "og stripslashes() på det som skal inn i databasen".

 

men spørsmålet sto litt lenger ned:

 

Holder det kanskje og bruke en av dem? Og i tilfelle hvem burde jeg velge, og hvorfor?

 

Spørsmålet er i forhold til topic: magic_quotes_gpc og mysql_real_escape_string sammen.

Lenke til kommentar

Magic quotes er noe forbanna drit for alle oss som faktisk vet at man må escape inndata. Siden det varierer om det er av eller på, så man må ta hensyn til det når man lager ting som skal brukes flere steder. Og enten må man escape det som skal inn i databasen, eller unescape det som skal skrives ut på siden.

 

Jeg slår det av, og bruker mysql_real_escape_string() på alt som brukes i queries. Dersom jeg ikke får slått det av pga kjip config på webhoteller hos kunder, så putter jeg en rekursiv stripslash-sak i db.php eller en annen fil som inkluderes overalt.

Lenke til kommentar

morten- og puls:

 

dere skriver begge at dere bruker stripslashes() etter mysql_real_escape_string(), hvis jeg ikke har missforstått.

 

da er det bortkastet å i det hele tatt bruke mysql_real_escape_string().

 

escapingen som blir utført av php, når magic quotes er på, er ikke beregnet for å hindre sql angrep. kun for å hindre manipulering av scriptet. mysql_real_escape_string() er derimot beregnet for å hindre sql angrep.

 

de escaper mye av de samme tegnene, men de har noen forskjeller også. det er disse forskjellene som er viktige.

 

med magic quotes på gjør php en vanlig escape først. så gjør dere en mysql_real_escape_string() på inputten. nå vil alle chars som escapes av begge dobbeltslashes og chars som kun escapes av mysql_real_escape_string() singleslashes.

 

så en stripslashes etter mysql_real_escape_string() vil effektivt fjerne det mysql_real_escape_string escapet.

 

bruk stripslashes først dersom magic quotes er på.

 

det er hva den tidligere nevnte funksjonen gjør.

 

edit:

jeg ser at morten- sin metode kan funke. hvis du looper alle inputs og stripslasher de før de brukes.

Endret av grimjoey
Lenke til kommentar

Jeg tenkte ikke på rekkefølgen da jeg skrev inlegget. Og det jeg lurte på var den -faktiske- forskjellen på dem. Ja, jeg bruker noe alla den funksjonen M4rTiN postet før jeg bruker mysql_real_escape_string.

 

Sorry om jeg forklarte meg litt dårlig, spørsmålet var ikke hvordan man skal bruke dette, men hvordan magic_quotes_gpc og mysql_real_escape_string faktisk fungerer, hva dem escaper, om dem fjerner noe, og om det holder og bruke en (hva er forskjellen på det dem faktisk gjør).

 

Edit: Leste ikke så nøye gjennom den funksjonen M4rTiN postet før jeg skrev. Det jeg mener er at jeg bruker strip_slashes() før mysql_real_escape_string.

Endret av pulse
Lenke til kommentar

addslashes (brukt av magic_quotes):

 

Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).

 

 

mysql_real_escape_string:

 

Escapes special characters in the unescaped_string , taking into account the current character set of the connection so that it is safe to place it in a mysql_query(). If binary data is to be inserted, this function must be used.

 

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

 

This function must always (with few exceptions) be used to make data safe before sending a query to MySQL.

 

eneste unntaket jeg kan komme på er hvis du skal uskadeliggjøre input som forventes å være integer kan det gjøres med $input = (int)$input;

Endret av grimjoey
Lenke til kommentar
morten- og puls:

dere skriver begge at dere bruker stripslashes() etter mysql_real_escape_string(), hvis jeg ikke har missforstått.

Du har misforstått.

 

Jeg bruker mysql_real_escape_string() på alt som skal inn i databasen, men dersom man gjør det og har magic_quotes påslått vil man få dobbel-escaping slik du sier. Derfor gjør jeg det jeg kan for å slå av magic_quotes, og hvis ikke det er mulig så fjerner jeg quotingen med stripslashes() helt i starten av scriptet.

 

En grei vane er å ha

if (get_magic_quotes_gpc()) remove_magic_quotes();

i en eller annen includefil som brukes overalt, så kan man bruke scriptene på ulike servere uten å tenke på det.

 

escapingen som blir utført av php, når magic quotes er på, er ikke beregnet for å hindre sql angrep. kun for å hindre manipulering av scriptet. mysql_real_escape_string() er derimot beregnet for å hindre sql angrep.

Manipulering av scripet? Den er der for å hindre at koden til nybegynnere klikker hvis noen skriver quotes in en tekstboks, og for å hindre SQL-angrep. Men som du sier er den ikke effektiv mot angrep, siden det er database-spesifikke tegn som også må escapes. Dermed gir funksjonen kun falsk trygghet og masse problemer.

 

Men heldigvis har utviklerne tatt til vettet på akkurat dette punktet, og magic quotes er fjernet fullstendig i PHP 6 (hurra!).

Lenke til kommentar
Manipulering av scripet? Den er der for å hindre at koden til nybegynnere klikker hvis noen skriver quotes in en tekstboks, og for å hindre SQL-angrep. Men som du sier er den ikke effektiv mot angrep, siden det er database-spesifikke tegn som også må escapes. Dermed gir funksjonen kun falsk trygghet og masse problemer

 

jeg gjorde en antagelse da jeg skrev det. fant ut litt mer etter at jeg leste på php.net. du har helt rett. det er nok en gammel funksjonalitet som henger igjen fra si php 3, som ikke er tilstrekkelig for det den er beregnet til. de har ikke forandret den for å beholde bakoverkompatibilitet. derfor kom mysql_escape_string og mysql_real_escape_string. (et par antagelser her og. korriger meg gjerne hvis det er feil.)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...