is deze database query veilig genoeg?
ama saril
10/12/2012 15:44:25Ok dan laatste vraagje voor duidelijkheid:
Dit hoef ik niet te escapen met PDO::quote() omdat ik gebruik maak van de prepared statement en bindparam()
Het volgende stukje zou ik wel moeten escapen met PDO::quote() als ik het zo zou doen
Begrijp ik em zo goed?
Dit hoef ik niet te escapen met PDO::quote() omdat ik gebruik maak van de prepared statement en bindparam()
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql = "SELECT naam, adres, id FROM tbl_gebruiker where id = :id;
$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->execute();
?>
$sql = "SELECT naam, adres, id FROM tbl_gebruiker where id = :id;
$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->execute();
?>
Het volgende stukje zou ik wel moeten escapen met PDO::quote() als ik het zo zou doen
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql = "SELECT naam, adres, id FROM tbl_gebruiker where id =".$_POST['id'];
$stmt = $db->prepare($sql);
$stmt->execute();
?>
$sql = "SELECT naam, adres, id FROM tbl_gebruiker where id =".$_POST['id'];
$stmt = $db->prepare($sql);
$stmt->execute();
?>
Begrijp ik em zo goed?
PHP hulp
27/12/2024 01:30:49Kris Peeters
10/12/2012 15:59:42Strikt gezien: ja.
maar ...
Wel, om te beginnen: id is geen string, maar een int.
(Ja okay, het kan eventueel anders, maar ik denk niet in dit geval)
Dat maakt de zaak sowieso anders.
Dat wordt dus
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
Integers kan je casten, met:
(int) $_POST['id']
ofwel
intval($_POST['id'])
Dat beschermt je door een getal terug te geven, wat $_POST['id'] ook moge zijn.
Als $_POST['id'] geen geldig getal is, wordt de waarde omgezet in 0; en dus niet meer gevaarlijk voor injection.
Dus:
$sql = "SELECT naam, adres, id FROM tbl_gebruiker where id =" . (int) $_POST['id'];
maar ...
Wel, om te beginnen: id is geen string, maar een int.
(Ja okay, het kan eventueel anders, maar ik denk niet in dit geval)
Dat maakt de zaak sowieso anders.
Dat wordt dus
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
Integers kan je casten, met:
(int) $_POST['id']
ofwel
intval($_POST['id'])
Dat beschermt je door een getal terug te geven, wat $_POST['id'] ook moge zijn.
Als $_POST['id'] geen geldig getal is, wordt de waarde omgezet in 0; en dus niet meer gevaarlijk voor injection.
Dus:
$sql = "SELECT naam, adres, id FROM tbl_gebruiker where id =" . (int) $_POST['id'];
Wat gebeurt er als je een parameter bind die een integer hoort te zijn geen geldig getal is?
Krijg je dan een fout?
In asp.NET krijg je dat nl wel (en hoef je geen preps te gebruiken!)
Krijg je dan een fout?
In asp.NET krijg je dat nl wel (en hoef je geen preps te gebruiken!)