$_GET beveiligen
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;
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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'];
}
echo "</table>";
?>
//
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());
while($row = mysql_fetch_array( $result )) {
// Print out the contents of each row into a table
echo "<tr><td>";
echo $row['Source'];
}
echo "</table>";
?>
Gewijzigd op 17/10/2011 13:09:33 door Daan s
De GET-waarde direct in de query zetten geeft een sql-injection lek. Beveilig dit met mysql_real_escape_string().
zitten de gebruikers pagina's achter een login of achter wat anders ?
Toevoeging op 17/10/2011 14:00:55:
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.
Hoe implementeer je het?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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
$secure = $_GET['ID'];
$secure = mysql_real_escape_string($secure);
$result = mysql_query("SELECT * FROM $IDtable where ID =$secure")
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'];
}
echo "</table>";
?>
//
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
$secure = $_GET['ID'];
$secure = mysql_real_escape_string($secure);
$result = mysql_query("SELECT * FROM $IDtable where ID =$secure")
or die(mysql_error());
while($row = mysql_fetch_array( $result )) {
// Print out the contents of each row into a table
echo "<tr><td>";
echo $row['Source'];
}
echo "</table>";
?>
Gewijzigd op 17/10/2011 14:58:25 door L D
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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
$secure = $_GET['ID'];
$secure = mysql_real_escape_string($secure);
$result = mysql_query("SELECT * FROM $IDtable where ID ='$secure'")
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'];
}
echo "</table>";
?>
//
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
$secure = $_GET['ID'];
$secure = mysql_real_escape_string($secure);
$result = mysql_query("SELECT * FROM $IDtable where ID ='$secure'")
or die(mysql_error());
while($row = mysql_fetch_array( $result )) {
// Print out the contents of each row into a table
echo "<tr><td>";
echo $row['Source'];
}
echo "</table>";
?>
Tanx
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?
Laurens dragicevic op 17/10/2011 14:57:55:
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:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?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
?>
$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
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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
$secure = $_GET['ID'];
$secure = mysql_real_escape_string($secure);
$result = mysql_query("SELECT * FROM $IDtable where ID ='$secure'")
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'];
}
echo "</table>";
//
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
$secure = $_GET['ID'];
$secure = mysql_real_escape_string($secure);
$result = mysql_query("SELECT * FROM $IDtable where ID ='$secure'")
or die(mysql_error());
while($row = mysql_fetch_array( $result )) {
// Print out the contents of each row into a table
echo "<tr><td>";
echo $row['Source'];
}
echo "</table>";
- Variabelen buiten quotes