Seneste forumindlæg
Køb / Salg
 * Uofficiel Black/White liste V3
Login / opret bruger

Forum \ Programmering og webdesign \ Programmering
Denne tråd er over 6 måneder gammel

Er du sikker på, at du har noget relevant at tilføje?

sikkerhed og MySQL

Af Ny på siden Hennie | 22-12-2006 18:15 | 1584 visninger | 10 svar, hop til seneste
Jeg sidder og funderer lidt over noget sikkerhed i MySQL - jeg har nemlig købt en bog, hvori der står at hvis man har en webside med et antal brugere, så bør man ikke bruge root-kontoen til at få adgang til hele databasen. Man skal istedet oprette begrænsede kontoer til brugene - kontoer som ikke kan slette data.. Men det kan da ikke lade sig gøre for brugeren at slette data i databasen alligevel? Fordi der ikke er nogle steder i min PHP-side, der beder MySQL om at slette data. Brugerne har jo ikke direkte forbindelse til MySQL - men kun gennem php-siderne Hvorfor kan man ikke bare bruge root-kontoen til at få adgang til databasen hele tiden? hvordan kan det svække på sikkerheden? på forhånd tak :)
--
#1
poul_madsen
Elite Supporter
22-12-2006 18:19

Rapporter til Admin
Fordi nogle måske kan tilgå databasen uden om din hjemmeside og lave "farlige" ting... man burde ALDRIG bruge Root / administrator som services kontoer!
--
4200 Slagelse
#2
Hennie
Ny på siden
22-12-2006 18:30

Rapporter til Admin
udenom? jamen de kan jo ikke uploade php-sider.. og er det ikke den eneste måde at få adgang til MySQL? ..og kunne man ellers ikke bare lægge et passeword på root-kontoen? .. passwordet findes jo kun på serverens php-sider og bliver ikke sendt ud til brugerne
--
#3
L00t
Moderator
22-12-2006 18:36

Rapporter til Admin
Hennie... Hvis du har glemt at validere og escape et ID eller noget andet input, som du putter ind i en SQL forespørgsel som du kører mod databasen, så kan folk alt muligt. Hvad de kan, afhænger af hvordan du bruger MySQL fra PHP, og hvilken forespørgsel du putter det uvaliderede input ind i, men generelt er der mulighed for meget. Hvis du har en side, hvor du har glemt at sikre dit input, vil en bruger kunne køre en DROP DATABASE, og så vil du ikke have nogen database mere. Der skal være nogle specielle omstændigheder for at det kan lade sig gøre, men det er muligt. Generelt er det god sikkerhedsskik ikke at give brugere flere rettigheder end de behøver.
--
Bevar naturen - sylt et egern
#4
Hennie
Ny på siden
22-12-2006 19:20

Rapporter til Admin
#3 .. Hvis man har en kode som $data = mysql_query('SELECT * FROM tabel1 WHERE brugernavn = ".$brugernavn." AND kodeord = ".$kodeord.";') og hvis en bruger indtaster data, så at $brugernavn = "Administrator" og $kodeord = ""kodeord" OR "1" = "1"" så kommer der i sidste ende ikke til at stå $data = mysql_query('SELECT * FROM tabel1 WHERE brugernavn = "Administrator" AND kodeord = "kodeord" OR "1" = "1";') Hvis altså at serveren selv sætter backslash bagved alle specaltegn som "" ...hvis ikke det var dette du mente, ville jeg blive glad hvis nogle ville give et eksempel - ellers forstår jeg det vist ikke :-(
--
#5
psa
Junior Nørd
22-12-2006 20:12

Rapporter til Admin
<? function hopla( $x ){ # http://dk.php.net[...] RETURN htmlentities($x) } $_POST[kodeord] = hopla( $_POST[kodeord] ); ?> Oki oki det er en MEGET cheesy-kode men det burde være nok til at ødelægge nuskaljegbrugeunderligetegnogsnydedindatabase ! :O)
--
.:¦ http://wx3.dk[...] ::¦ ubuntulinux.org/ubuntuforums.org
#6
L00t
Moderator
22-12-2006 20:31

Rapporter til Admin
#4 Han kunne jo indsætte " OR "" = " SELECT * FROM tabel1 WHERE brugernavn = "Administrator" AND kodeord = "" OR "" = "" ... altså, sandt. Men jeg mente mere at han kunne afslutte SQLen med ; og skrive DROP DATABASE eller DROP TABLE bagefter. MySQL 5.0 understøtter flere queries i samme forespørgsel, så det er mere den slags som er farligt hvis brugeren har slette rettigheder. Til gengæld understøtter mysql_query() i PHP kun en forespørgsel, så i PHP sammenhæng er det ikke så farligt. På et sitet i ASP, som her på HOL, kunne det være farligt f.eks.
--
Bevar naturen - sylt et egern
#7
Hennie
Ny på siden
22-12-2006 21:07

Rapporter til Admin
#6 tak! det klarede en hel del op i mit hoved, :) men der er stadig én ting som jeg tror i ikke har tænkt på.. når brugeren indtaster noget i en <form> og sender det - så sætter PHP automatisk \ foran alle specialtegn, der kunne lave rod i koderne. - så hvis man indtaster " OR "" = " bliver det til \" OR \"\" = \" ...også burde det jo ikke kunne ske? Jeg lavede lige denne side til at teste det. http://80.196.233.177[...] siden indeholder kun disse koder: <html> <body> <script language="PHP"> if (isset($_POST[inpt])) echo $_POST[inpt]; </script> <form method="post" action"test.php"> <input type="text" name="inpt"> <input type="submit" value="OK"> </form> </body> </html>
--
#8
Nubi
Maxi Nørd
22-12-2006 21:20

Rapporter til Admin
#7 > Så skal gutten der vil ødelægge din side jo bare tage højde for dette. Men det er ikke så meget et spørgsmål om hvordan man ødelægger tingene, for det kan ALTID lade sig gøre, hvis bare personen der vil ødelægge det er dygtig nok. Derfor er det god stil at give brugeren så få rettigheder som muligt Det svarer lidt til at give auto værkstedet din husnøgle også, uden at fortælle ham din adresse (og så bruge dette som baggrund for det er sikkert). Hvis han vil skal nok finde din adresse og så har han fuld adgang til at gøre hvad han vil.
--
http://steffenskov.homepage.dk[...]
#9
L00t
Semi Nørd
25-12-2006 13:41

Rapporter til Admin
#7 Det er noget din webserver er sat op til. Det er ikke slået til som default. Funktionen hedder magic quotes, og benyttes typisk på webhoteller for at øge sikkerheden - men man må aldrig forlade sig på at den altid er slået til.
--
Bevar naturen - sylt et egern
#10
kawsper
Gigabruger
25-12-2006 14:00

Rapporter til Admin
Jeg har ellers ofte brugt denne til mine sider: function quote_smart($value) { // Stripslashes if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Quote if not integer if (!is_numeric($value)) { $value = mysql_real_escape_string($value); } return $value; // Make a safe query // query = sprintf("SELECT * FROM hygg_user_core WHERE username=%s AND password=%s", // quote_smart($_GET['username']), // quote_smart($_GET['password'])); } Idag bruger jeg PDO til MySQL interaktion i PHP, men den kræver at modulet PDO er compilet ind på det sted som du har webhost på. I PDO kan man styre og fortælle hvilket data der kommer ind, så det skulle være sikkert for injection i teorien. Lidt kode fra et nyt projekt hvor jeg har leget lidt med PDO: $query = $db->prepare("INSERT INTO gallerier (navn, ejer) VALUES (:galleryname, :sid)"); $query->bindParam(':galleryname', $name, PDO::PARAM_STR); $query->bindParam(':sid', $id, PDO::PARAM_INT); $name = $_POST['galleryName']; $id = $_SESSION['sID']; $query->execute(); PDO::PARAM_STR angiver en string, og PDO::PARAM_INT angiver at input er en integer. Det er ret smart. Hvis du vil læse mere: http://php.net[...]
--
HyggeNet.org - IRC-Netværk for hyggens skyld irc://irc.hyggenet.org:6668/partyline

Opret svar til indlægget: sikkerhed og MySQL

Grundet øget spam aktivitet fra gæstebrugere, er det desværre ikke længere muligt, at oprette svar som gæst.

Hvis du ønsker at deltage i debatten, skal du oprette en brugerprofil.

Opret bruger | Login
NYHEDSBREV
Afstemning