Door
Daan s
op 17-10-2011 13:08
gewijzigd op 17-10-2011 13:09
3.356 views
Hi allemaal,
Ik ben momenteel met de beveiliging bezig van m'n site.
Maar ik heb even gekeken of ik mijn eigen site kon hacken, en dit was helaas mogelijk.
De pagina haalt gehele pagina's van een mysql server af, Met bijvoorbeeld deze link om op een gebruikerspagina te komen; usr/?ID=2 <Ga ik nog veranderen.
De functie GET is dus niet veilig, hij kan bijna alles van de mysql server af halen,
Dus mijn vraag was; hoe voorkom ik dit.
Maar deze code gebruik ik;
<?php
//
include 'config.php';
// MYSQL CONNECTIE
mysql_connect("$host", "$mysqlusername", "$mysqlpassword") or die(mysql_error());
mysql_select_db("$DB") or die(mysql_error());
// GET DATA FROM MYSQL TABLE
$result = mysql_query("SELECT * FROM $IDtable where ID =".$_GET['ID']."")
or die(mysql_error());
// Print
while($row = mysql_fetch_array( $result )) {
// Print out the contents of each row into a table
echo "<tr><td>";
echo $row['Source'];
Het wordt een gebruikers pagina, geselecteerd op id/naam,
Maar ik heb het een paar keer geprobeerd met de mysql_real_escape_string(). maar dan krijg ik een lege pagina.
include 'config.php';
// MYSQL CONNECTIE
mysql_connect("$host", "$mysqlusername", "$mysqlpassword") or die(mysql_error());
mysql_select_db("$DB") or die(mysql_error());
include 'config.php';
// MYSQL CONNECTIE
mysql_connect("$host", "$mysqlusername", "$mysqlpassword") or die(mysql_error());
mysql_select_db("$DB") or die(mysql_error());
Waarom controleer je niet of de waarde bij ID een getal is?
mysql_connect --> volgens mij kunnen al die variabelen buiten "
Waarom maak je $secure aan?
Meende gelezen te hebben dat variabelen buiten " zouden moeten.
Waar is een nette manier van foutafhandeling?
mysql_fetch_array --> doorgaans volstaat mysql_fetch_assoc.
Gebruik geen * maar benoem het veld wat je wilt opvragen.
$IDtable ; is het verstandig om een tabel aan een variabele toe te kennen?
probeer altijd quotes te gebruiken tussen waardens zoals:
"SELECT * FROM $IDtable where ID = '$secure'"
Zonder quotes zou de query nog steeds zo lek als een mandje zijn! Het is verplicht om quotes te gebruiken wanneer je met mysql_real_escape_string() de input wilt beveiligen. Deze functie pakt quotes en slashes aan, al het andere wordt niets mee gedaan.
$_GET['id'] = 1
$_GET['id'] = 1 or true
Geen enkele quote en komt keurig door mysql_real_escape_string() heen zonder enige aanpassing. Resultaat: De query vindt alle records en niet slechts één record.
Gebruik dus _ALTIJD_ quotes of gebruik prepared statements, die zijn nog het veiligst en meest gebruikt om SQL injection tegen te gaan. MySQL ondersteunt dit helaas alleen met de mysqli-functies en het kost je een hoop extra code. Met PostgreSQL gaat dit véél eenvoudiger, het is daardoor eenvoudiger om veilig met een database te werken wanneer je PostgreSQL gebruikt:
<?php
$connectie = pg_connect('jouw connectiegegevens');
$result = pg_query_params(
$connectie,
'SELECT * FROM tabelnaam WHERE id = $1 AND wachtwoord = $2', // query met placeholder
array($_GET['id'], $_POST['wachtwoord']) // alle input in één array
);
// fetchen en de rest van je code
?>
Maar is deze code dan wel goed beveiligd?
<?php
//
include 'config.php';
// MYSQL CONNECTIE
mysql_connect("$host", "$mysqlusername", "$mysqlpassword") or die(mysql_error());
mysql_select_db("$DB") or die(mysql_error());