WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Bästa sättet att säkra PHP-MySQL (https://www.wn.se/forum/showthread.php?t=493)

Max 2003-10-01 01:26

Vad skulle ni säga bästa sättet att säkra koppling mellan PHP och en MySQL databas är?

1) Jag tänker dels på själva databasen/MySQL, typ sätta lösenord på root etc.
Jag har följt dessa steg http://www.analysisandsolutions.com/code/m...sic.htm#tighten men finns det något ytterligare man bör tänka på?

2) Specifikt hur gömmer man kopplingen till databasen i PHP.
Ett sätt är ju att lägga lösenord, databasnamn etc. i en include-fil, men hur skyddar man den effektivt. Jag tycker också att det känns lite olustigt att lägga ett lösenord i klartext, kan man kryptera det på något sätt (mao accepterar MySQL ngn form av krypterat lösenord).

Tacksam för alla kunskaper kring detta jag kan få ta del av.

Mvh Max

Ps: Jag använder en Win2k server.

nomicon 2003-10-01 16:21

Hejsan.

Se ALLTID, ALLTID till att kolla datan som kommer från klienterna, dvs via htmlforumlär. Om dom ska ange ett postnummer så sak det inte finnas annat än siffror från det fältet, samma med förnamn, ska inte komma med skräptecken där såsom ',%@#"¤$€"!# osv, endast a-zA-Z, ej heller siffror.

Lagra uppkopplingssträngen samt databasnamn,login,lösenord i en includefil precis som du säger, som ligger utanför din hemsidas katalog. Dvs om din hemsida ligger i
/www/minsida så lägger du med fördel den filen i /www

Se till att ange full sökvägar till allt som körs i include() / include_once()

Läs mera om mysql_escape_string

orreborre 2003-10-01 19:22

nomicon: Jag vet inte om jag missuppfattar dig nu, men Max bör lägga anvnamn och lösenordsfilen till databasen UTANFÖR www-roten. Jag uppfattade ditt inlägg som om han skulle lägga den i www-roten. Detta för att då ingen kan skriva en sökväg för att komma till denna fil. Men om du menade så kan du bortse från det jag skrev...

Annars är det som nomicon säger, kontrollera allt du ska lägga in/söka efter i databasen om användaren får fylla i textfält vid t.ex. registrering/sökning.

nomicon 2003-10-03 02:47

Tja.

Självklart menar jag att det skall ligga på en del av filsystemet som INTE kan läsas av den användare / grupp som kör Webbservern.

Martin :)

Max 2003-10-03 13:05

Tack för svaren. Då verkar jag ha gjort rätt hittills utom i ett avseende: den strikta kontrollen av inmatat data. Varför är det nödvändigt? Är det för att någon annars skulle kunna lägga in data som modifierar SQL-uttrycket jag skickar till servern?

melin 2003-10-03 13:26

extra säkerhet kan man också lägga genom att kontrollera varifrån datan skickas..

Jag har haft mycket kul på en del websidor genom att tillverka egna formulär och skicka data till deras php/asp script...

orreborre 2003-10-03 19:13

Det finns något som heter SQL-injection, viket innebär att en ond användare t.ex. fyller i en inloggning enligt följande:

Om din sqlfråga ser ut såhär:

$sql = mysql_query("SELECT * FROM user WHERE user = '$_POST[Anv]' AND pass = '$_POST[Pass]'");

Då kan en ond användare skriva:

Anv: ' OR id=1
Pass: ' OR 1=1

Detta ger:
$sql = mysql_query("SELECT * FROM user WHERE user = '' OR id=1 AND pass = '' OR 1=1");

Då blir denna person inloggad som personen med id 1, vilket ofta är en administrator.
Detta är och ett relativt snällt exempel, man kan exekvera andra kommandon.

Det finns en del säkerhetsåtgärder inbyggda i en del SQL-servrar, men man bör aldrig tillåta användare att skicka in ' i databasen, om det är en text som ska läggas in och man vill tillåta ' kan man alltid använda addslashes().

Mvh

Max 2003-10-04 03:26

Citat:

Originally posted by orreborre@Oct 3 2003, 16:13
Det finns något som heter SQL-injection, viket innebär att en ond användare t.ex. fyller i en inloggning enligt följande:

Om din sqlfråga ser ut såhär:

$sql = mysql_query("SELECT * FROM user WHERE user = '$_POST[Anv]' AND pass = '$_POST[Pass]'");

Då kan en ond användare skriva:

Anv: ' OR id=1
Pass: ' OR 1=1

Detta ger:
$sql = mysql_query("SELECT * FROM user WHERE user = '' OR id=1 AND pass = '' OR 1=1");

Det var det jag trodde. Har jag aldrig tänkt på tidigare, tack för tipset!

Max 2003-10-09 22:11

Citat:

Originally posted by nomicon@Oct 1 2003, 13:21
Se ALLTID, ALLTID till att kolla datan som kommer från klienterna, dvs via htmlforumlär. Om dom ska ange ett postnummer så sak det inte finnas annat än siffror från det fältet, samma med förnamn, ska inte komma med skräptecken där såsom ',%@#"¤$€"!# osv, endast a-zA-Z, ej heller siffror.

Läs mera om mysql_escape_string

Som jag förstår av php-manualen så borde det räcka att använda mysql_escape_string() - är det rätt uppfattat eller måste jag kolla efter skräptecken också? Vad är er erfarenhet?


Alla tider är GMT +2. Klockan är nu 05:40.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson