Veldig vanlig å sende parametre som skal brukes i SQL-setninger, via URLen, f.eks http://www.foo.invalid/index.php?articleID=43
<?php $query = "SELECT * FROM artikkler WHERE artikkelID = ".$_GET['articleID']; // Blir SELECT * FROM artikkler WHERE artikkelID = 43 ?>
Dersom vi istedet endrer URLen til:
http://www.foo.invalid/index.php?articleID=0%20OR1=1
Så ender vi opp med å utføre en spørring som dette:
http://www.foo.invalid/index.php?articleID=0%20OR1=1;DROP%20TABLE%20artikkler;
http://www.foo.invalid/index.php?articleID=0%20OR1=1%20UNION%20SELECT%20*%20FROM%20users;
eksempel
1
2
Igjen er google
1 din venn
mysql__real_escape_string() / pg_escape_string()
is_numeric();
Veldig enkelt, men sårbart for uteglemmelser.
Man kan bruke biblioteker som f.eks pears DB-klasse.
Denne har metoder som prepare()/execute()/autoexecute(), som lar en sende inn et
parameteriserte SQL-spørringer, hvor data man ønsker å sette inn i spørringen blir
sendt inn separat.
<?php $sth = $db->prepare('SELECT * FROM artikkler WHERE artikkelID = ?'); $db->execute($sth, $_GET['articleID']); ?>
Eller
PDO-extension.
<?php $stmt = $dbh->prepare("SELECT * FROM artikkler WHERE artikkelID = ?"); $stmt->execute(array($_GET['articleID'])); ?>