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
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
--
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
#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 :-(
--
<?
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 #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
#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>
--
#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[...] #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
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