Προβλήματα ερωτημάτων στο PDO της PHP
Όπως θα πρέπει ήδη να γνωρίζετε, τα SQL ερωτήματα είναι ευάλωτα σε SQL injections. Η επέκταση PDO έχει σχεδιαστεί για να καταπολεμά τα injections, αλλά από μόνη της, από προεπιλογή, δεν το κάνει.
Ας δούμε το πρόβλημα με ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε το ακόλουθο ερώτημα, στο οποίο εισάγεται μια μεταβλητή:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Ας υποθέσουμε ότι η μεταβλητή μας προέρχεται από κάπου εξωτερικά, για παράδειγμα, από μια παράμετρο GET. Για απλότητα, ωστόσο, ας ορίσουμε απλώς την τιμή της χειροκίνητα. Αναμένουμε κάποια αριθμητική τιμή, για παράδειγμα, την ακόλουθη:
<?php
$id = 1;
?>
Ένας κακόβουλος χάκερ, ωστόσο, μπορεί να μεταδώσει
την ακόλουθη τιμή (υποθέτουμε ότι έχουμε
ένα πεδίο role):
<?php
$id = '-1 OR role="admin"';
?>
Συνεπώς, εμείς θέλαμε το ακόλουθο ερώτημα:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Αλλά λάβαμε το ακόλουθο, το οποίο ανακτά τον διαχειριστή του site:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Για να αποφύγουμε μια τέτοια κατάσταση, το PDO προβλέπει έναν ειδικό μηχανισμό, ο οποίος ονομάζεται prepared statements. Αυτά θα τα αναλύσουμε στο επόμενο μάθημα.
Σκόπιμα πραγματοποιήστε μια SQL injection στη βάση δεδομένων σας.