Avatar billede seekasr Nybegynder
31. marts 2004 - 14:29 Der er 17 kommentarer og
1 løsning

Forskel på serveres behandling af singlequote ved sql-queries?

Hej

På nogle servere får jeg det problem, at sql-queryen fejler hvis en af de variabler, jeg giver som argument, indeholder '.
Det kunne se sådan ud:

$foo = $_POST["foo"]; // $foo indeholder nu: hej hej ' ja
$sql = "INSERT INTO table(foo) VALUES ('$foo')";
mysql_query($sql);

Denne query vil virke fint på nogle servere, fordi ' i variablen automatisk bliver ændret til \' - men på andre servere virker det ikke. Begge servere jeg her taler om kører linux, og php 4.2+.

Er det en setting man selv kan indstille? Eller bliver jeg nødt til at gå hele min kode igennem, og manuelt erstatte ' med \' ?

På forhånd tak
seekasr
Avatar billede avminarm Juniormester
31. marts 2004 - 14:39 #1
prøv at vende dig til at gøre sådan:

$foo = $_POST["foo"]; // $foo indeholder nu: hej hej ' ja
$sql = "INSERT INTO table(foo) VALUES ('".$foo."')";
mysql_query($sql);

så burde du ikke få problemer - jeg plejer at bruge $_POST['foo']; - og det virker, og jeg havde engang et rigtigt godt svar på hvorfor det skal være '' man benytter, men jeg kan ikke lige hive frem i tænkeren ;o)
Avatar billede seekasr Nybegynder
31. marts 2004 - 14:46 #2
Pointen med din metode er, at hvis der opstår problemer med ' så er der et " til at stoppe problemet - og vice versa?

Phpmyadmin anvender `` omkring tabel- og feltnavne. Er det også en løsning?

Men jeg vil stadig meget gerne have en forklaring på, hvorfor der er forskel servernes opførsel.
Avatar billede seekasr Nybegynder
31. marts 2004 - 14:51 #3
PS. Hvis man bruger $_POST['foo'], så behøver man vel ikke det andet?
Avatar billede avminarm Juniormester
31. marts 2004 - 14:58 #4
pointen med "min" metode er at man holder PHP for sig selv, når jeg afbryder en streng " og bryger et . for at "lægge" noget til - det har noget at gøre med hvordan PHP fortolker strenge og variabler
"$foo" = en streng
$foo = en variabel
Avatar billede muddi Praktikant
31. marts 2004 - 15:09 #5
Ovenstående løsning virker måske, men det er slamkode *G*

Du skal bruge http://dk.php.net/addslashes når du indsætter data og http://dk.php.net/stripslashes når du henter data ud fra databasen igen.

Det er virkelig et sikkerhedshul ikke at gøre det, da din database kan blive lagt ned fuldstændig, og i værste fald slettet!
Avatar billede muddi Praktikant
31. marts 2004 - 15:16 #6
Og du SKAL bruge det på alle de scripts du laver, hvor brugere eller andre har mulighed for at gemme data i databasen.
Forestil dig et login-system der ikke gør brug af addslashes() og stripslashes().

Der har du måske en forespørgsel som følger:

mysql_query("SELECT * FROM secret WHERE username = '$user' AND password = '$pass'");

Hvis du ikke sørger for at uskadelige gøre særlige tegn, så vil det være muligt for hvem som helst at logge ind uden password. Se bare her:

$user = "admin";
$pass = "' OR '1'='1";
mysql_query("SELECT * FROM secret WHERE username = '$user' AND password = '$pass'");

Den færdige forespørgsel der bliver sendt til MySQL bliver så
SELECT * FROM secret WHERE username = 'admin' AND password = '' OR '1'='1'

Hvilket vil logge dig ind som admin, da 1 altid vil være lig med 1!
Avatar billede seekasr Nybegynder
31. marts 2004 - 15:26 #7
Ved at læse videre fra muddi's links fandt jeg svaret. PHP directive magic_quotes_gpc sørger for at PHP automatisk kører addslashes() på alle POST, COOKIE og GET variabler.

Jeg har tjekket mine forskellige servere og har set, at det passer med, at magic_quotes_gpc er OFF de stedet hvor mine kode ikke virker, og ON hvor det virker.

Det må altså være løsningen at få magic_quotes_gpc sat til ON. Men kan man det på en server man kun har normal brugeradgang til? Og hvordan?
Avatar billede muddi Praktikant
31. marts 2004 - 15:31 #8
Du kan ændre det med en .htaccess-fil i følge manualen til php http://dk.php.net/ini_set
Avatar billede seekasr Nybegynder
31. marts 2004 - 15:40 #9
Yes, hvis det ellers er tilladt af hosten. Og det synes Cliche ikke man skal have lov til - ligesom man ikke må sætte register_globals off. De går virkeligt op i sikkerhed derinde.

Tak for hjælpen :)
Avatar billede muddi Praktikant
31. marts 2004 - 15:43 #10
Til gengæld er de så billige, at man skulle være et skarn hvis man brokker sig ;)
Avatar billede seekasr Nybegynder
31. marts 2004 - 15:50 #11
seekasr = skarn 2004!
Avatar billede muddi Praktikant
31. marts 2004 - 15:59 #12
heh heh *G*
Avatar billede avminarm Juniormester
31. marts 2004 - 22:28 #13
muddi> host host "Ovenstående løsning virker måske, men det er slamkode *G*" - her må jeg erklære mig uenig - koden er måske ikke den kønneste/mest overskuelige kode, men så vidt jeg ved er det det mest korrekte! Bortset fra det er jeg enig ;o)
Avatar billede muddi Praktikant
01. april 2004 - 11:04 #14
What... jeg skrev et mega langt indlæg, men eksperten gemte det ikke da jeg trykkede send! Det har jeg aldrig oplevet før - SKANDALE!
Avatar billede muddi Praktikant
01. april 2004 - 11:09 #15
Jeg har siddet og leget lidt med dig forslag at gøre det på, og det første input jeg gav den fik den til at fejle.

<?
$foo = "' or '1'='1";
$sql = "INSERT INTO table(foo) VALUES ('".$foo."')";
mysql_query($sql);
?>

Det eneste der blev gemt i databasen var et ét-tal! Resten af mit input forsvandt ...! Altså er det ikke muligt at gemme ' or '1'='1 i databasen på din måde!

Jeg har i øvrigt aldrig hørt om din løsning før! Til gengæld kan jeg referere til såvel MySQL's som PHP's manual.

http://www.mysql.com/doc/en/Security_guidelines.html
Følgende er taget derfra
"Many application programming interfaces provide the means of escaping special characters in data values. Properly used, this prevents application users from entering values that cause the application to generate statements that have a different effect than you intend:
Users of PHP: Use the mysql_escape_string() function, which is based on the function"

http://dk.php.net/manual/en/security.database.php

Hvis du stadig ikke er overbevist, så prøv da at kigge på googles resultatliste for 'sql injection'!
http://www.google.dk/search?sourceid=navclient&ie=UTF-8&oe=UTF-8&q=%27SQL+injection%27

Kom med nogle links til steder på nettet, hvor nogen anbefaler din måde!
Avatar billede muddi Praktikant
01. april 2004 - 11:09 #16
ps. det ER slamkode det du foreslog!
Avatar billede avminarm Juniormester
02. april 2004 - 09:27 #17
øhhh Muddi - jeg tror vi taler lidt forbi hinanden ;o) - det eneste jeg ville signalere med min lille kodeatump et at det ofte er smartest at holde PHP ude af f.eks sql queries: VALUES ('".$foo."')"; i stedet for: VALUES ('$foo')";

Jeg havede ikke liiiige tolket spørgsmålet, at der var tale om 'sql injection' - for her er der ingen tvivl om at du har TOTALT ret ;o), så skal der escapes. Men jeg kan nu ikke se at det er det som "skarn2004" spørger om ;o)
Avatar billede avminarm Juniormester
12. april 2004 - 22:32 #18
et lille "pip" - måske kan du have glæde af get_magic_quotes_gpc() - så kan du se om magic quotes er slået eller ej ;o)
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