12. december 2007 - 21:48Der er
19 kommentarer og 2 løsninger
Sikkerhed mod SQl-injektion
Hej. Jeg har en kontaktform med nogle input-felter, som er defineret jf. nedenfor: Men sikkerheden er vist nok hullet som en si. Kan I bidrage lidt med, hvad der kan gøres.
<input type="text" name="adresse1" size="40">
Jeg smider dem i MySQL sådan her: $sql = "INSERT INTO tabelnavn SET adresse1='".$_POST['adresse1']."'"; database($sql);
Og database funktionen ser sådan her ud: function database($sql){//Funktion der laver alm databasekald og returnerer resultatet $config = ini();//Hent databaseparametre $conn = mysql_connect($config[db_serv],$config[db_user],$config[db_pass]);//Åben databaseforbindelse if (!$conn) { die('Could not connect: ' . mysql_error()); } $res = mysql_db_query($config[db_base],$sql); //Udfør forespørgsel mysql_close($conn);//Luk databaseforbindelse if (!$res) {//Tjek om det gik godt die("<b>Databasefejl:<br></b>" . mysql_error($conn) ."<b><br>MySQL-sætningen var:<br></b>". $sql);//Udskriv fejlmelding og stop udførsel } return $res;//Returner resultat af forespørgsel }
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Jeps - jeg er i gang med at kigge begge steder. Men jeg kan ikke helt gennemskue, hvordan jeg i ovenstående eksempel kan anvende "mysql_real_escape_string". Jeg leger lidt med det, men har I et nemt forslag, vil jeg da gerne se det.
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\wamp\www\hummelmosen\kontaktform.php on line 31
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\wamp\www\hummelmosen\kontaktform.php on line 31
din database-funktion er ikke så smart, da den opretter en connection for hver query... Connect til databasen én gang, og brug så den connection til samtlige queries... Syntaksen for mysql_real_escape_string er mysql_real_escape_string(unescaped_string, database_connection) - Du kan dog nok bruge mysql_escape_string i stedet (uden connection).
Du skal *ikke* bruge den alm. escape_string, kun real_escape_string (og da PHP husker den seneste connection kan du faktisk udelade connectionen, såfremt den er åben - hvilket den bør være). Hvis du bruger mysql_escape_string risikerer du problemer hvis forbindelsen bruger et multi-byte tegnsæt, da den opererer på byte-niveau, og ikke tegn-niveau.
Helt optimalt er at benytte mysqli og parameters (der har før været fejl i databasernes escaping-kode), men det er ikke altid en mulighed.
Yep, hvis du bruger andet end ISO-8859-1/Latin-1 som tegnsæt, må du ikke bruge mysql_escape_string - Hvis du gør, er den ok - Men hellere bare væn dig til at bruge mysql_real_escape_string :)
Jeg ville dele din database-funktion op i to, en der connecter og en der fyrer queries af - Eller endnu bedre - Brug en databasewrapper som f.eks. PEAR::MDB2 - http://pear.php.net/package/MDB2
Eller som pidgeot skriver, brug mysqli og prepared statements!
Jeg forstår ikke, hvorfor den åbner og lukker hele tiden. Funktionen SQL bliver da kun kaldt 1 gang?? Skal jeg opsplitte funtionen i 2, således jeg connecter med:
$config = ini();//Hent databaseparametre $conn = mysql_connect($config[db_serv],$config[db_user],$config[db_pass]);//Åben databaseforbindelse if (!$conn) { die('Could not connect: ' . mysql_error()); }
Derefter:
$res = mysql_db_query($config[db_base],$sql); //Udfør forespørgsel mysql_close($conn);//Luk databaseforbindelse if (!$res) {//Tjek om det gik godt die("<b>Databasefejl:<br></b>" . mysql_error($conn) ."<b><br>MySQL-sætningen var:<br></b>". $sql);//Udskriv fejlmelding og stop udførsel } return $res;//Returner resultat af forespørgsel }
hvorfor vil man bruge databasen til at undgå sql-injection, det kan php da selv klare, så er man også fri for at kalde fra webserver til database server hver gang.......
Mungojerrie, hvis du tænker på addslashes/magic quotes, så tager du komplet fejl. Den kan ikke bruges, da der er andre tegn der kan bruges end dem den håndterer (for ikke at tale om alle de problemer du kan få hvis du bruger et multi-byte tegnsæt til kommunikation med databasen).
Det er ikke uden grund at den anbefalede måde at skrive sikker kode på er at fjerne magic quotes og håndtere det med parameters (eller databasens escaping-funktion, om nødvendigt) - det holder ikke at bruge addslashes eller på anden måde skrive sin egen escaping, fordi du ikke har begreb om hvad der kan forårsage problemer, og næppe får skrevet kode der håndterer forskellige tegnsæt korrekt.
Derudover forsvinder magic quotes langt om længe i PHP6 - så det er heller ikke en løsning der er holdbar i længden.
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.