Ik las net op internet over SQL Injecties.
Hoe kan je dit precies tegen gaan?
Welke database gebruik je?

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
Ik gebruik een mysql database heb je mss ook een voorbeeld? Bvb
Zie de vele vele tutorials..

<?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
?>
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.
Ik zie het voordeel er (nog) niet van in.
Het script wordt toch alleen maar langer met prepared statements?
Warchief schreef op 15.01.2009 19:27
Ik zie het voordeel er (nog) niet van in.
Het script wordt toch alleen maar langer met prepared statements?
Er bestaan betere argumenten dan alleen de lengte van een script...

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
Variabelen mogen dus NOOOOOOOIT zonder mysql_real_escape_string() in een query komen te staan.
Er zijn natuurlijk gevallen waarin dat wel zou kunnen. Zoals wanneer je die variabelen vooraf controleert:
<?php
if(isset($_GET['id']) && ctype_digit($_GET['id']))
{
$sql = "
SELECT kolomnaam
FROM tabelnaam
WHERE id = ".$_GET['id'];
}
?>
Maar goed, uitzonderingen bevestigen de regel ;-)

Reageren