SQL Injecties
Hoe kan je dit precies tegen gaan?
PostgreSQL: Gebruik de functie pg_query_params() om de query en de parameters naar de database te sturen.
MySQL: Gebruik ALTIJD!!!! de functie mysql_real_escape_string() om variabelen te beveiligen, er mag niet één variabele zonder beveiliging in een query terechtkomen.
Alternatief: Gebruik PDO en bindParam() om variabelen in de queries te zetten.
Andere databases: RTFM
Gewijzigd op 01/01/1970 01:00:00 door Angelino
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// maak een verbinding met de database en dan ergens in je code:
$query = "
SELECT
kolomnaam
FROM
tabelnaam
WHERE
id = ".mysql_real_escape_string($_GET['id']);
$result = mysql_query($query);
// etc
?>
// maak een verbinding met de database en dan ergens in je code:
$query = "
SELECT
kolomnaam
FROM
tabelnaam
WHERE
id = ".mysql_real_escape_string($_GET['id']);
$result = mysql_query($query);
// etc
?>
Variabelen mogen dus NOOOOOOOIT zonder mysql_real_escape_string() in een query komen te staan. Doe je dat wel, dan zoek je problemen en moet je niet gaan klagen wanneer een klein ettertje jouw website heeft gehackt. Daar heb je zelf om gevraagd. Eigen schuld, dikke bult.
Ps. Zet magic_quotes uit, die rotzooi zorgt voor ellende. Zie de php-handleiding hoe je dat doet. Met versie 6 zal PHP deze ellende eruit slopen, ze hebben het licht gezien.
Je kan met PDO toch ook $db->quote($var); gebruiken?
Klopt, maar daar kun je geen prepared statements mee maken. En die zijn wel zo handig en veilig.
Het script wordt toch alleen maar langer met prepared statements?
Warchief schreef op 15.01.2009 19:27:
Er bestaan betere argumenten dan alleen de lengte van een script...Ik zie het voordeel er (nog) niet van in.
Het script wordt toch alleen maar langer met prepared statements?
Het script wordt toch alleen maar langer met prepared statements?
Wat zegt de lengte van een script? Niks, noppes, nada. Wat wil je hier dan mee zeggen?
pgFrank schreef op 15.01.2009 19:10:
Er zijn natuurlijk gevallen waarin dat wel zou kunnen. Zoals wanneer je die variabelen vooraf controleert:Variabelen mogen dus NOOOOOOOIT zonder mysql_real_escape_string() in een query komen te staan.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
if(isset($_GET['id']) && ctype_digit($_GET['id']))
{
$sql = "
SELECT kolomnaam
FROM tabelnaam
WHERE id = ".$_GET['id'];
}
?>
if(isset($_GET['id']) && ctype_digit($_GET['id']))
{
$sql = "
SELECT kolomnaam
FROM tabelnaam
WHERE id = ".$_GET['id'];
}
?>
Maar goed, uitzonderingen bevestigen de regel ;-)
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit