Fixing a sql injection

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Fixing a sql injection

Δημοσίευση από dva_dev » 25 Μαρ 2009 22:16

Κώδικας: Επιλογή όλων

$searchtype = $_GET['searchtype']; 
...
mysql_query ('PREPARE test FROM "SELECT * FROM πίνακας where '.$searchtype.' like ?";');
Μου φαίνεται κακή πρακτική κάτι τέτοιο. Εκθέτει στον χρήστη στοιχεία της σχεδίασης της βάσης σου που δεν τον ενδιαφέρουν και κυρίως δεν θέλεις εσύ ο ίδιος να τα γνωρίζει.

Καλύτερα να πεις κάτι τέτοιο:

Κώδικας: Επιλογή όλων

switch ($_GET['searchtype'])
{
case 0: $searchtype = "...";
case 1: $searchtype = "...";
case 2: $searchtype = "...";
case 3: $searchtype = "...";
...
};
mysql_query ('PREPARE test FROM "SELECT * FROM πίνακας where '.$searchtype.' like ?";');
Να μην χρησιμοποιείς δηλαδή αυτούσιο αυτό που παίρνεις σαν είσοδο για δημιουργία πινάκων/πεδίων/κ.λπ, ακόμα και αν ελέγχεις ότι περνάει από validation. Φυσικά εξαίρεση αποτελούν εργαλεία διαχείρισης Β.Δ., αλλά ακόμα και αυτά δεν απευθύνονται στον χρήστη αλλά στο διαχειριστή.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Fixing a sql injection

Δημοσίευση από Apostolis_38 » 27 Μαρ 2009 10:02

Δεν σε πολυκατάλαβα. Πως εκθέτεις στοιχεία στον χρήστη;
Πάντως στο συγκεκριμένο παράδειγμα το searchtype δίνει το πεδίο που έχει επιλεχθεί απο φόρμα, δηλαδή δίνει το <option> και το searchterm τα στοιχεία με τα οποία κάνει αναζήτηση ο χρήστης.
Π.χ. searchtype = company και searchterm = αποστόλης.

Σε άλλες περιπτώσεις, όπου χρειάζεται, χρησιμοποιώ τον τρόπο που αναφέρεις, αν και προτιμώ το if και το elseif.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Fixing a sql injection

Δημοσίευση από dva_dev » 27 Μαρ 2009 14:53

Αφού παίρνεις το πεδίο που θα κάνεις την αναζήτηση με $_GET, αυτό το όνομα του πεδίου υπάρχει στο url (π.χ. http://domain/search.php?searchtype=company&searchterm=αποστόλης)

Από αυτό δίνεις πληροφορίες ότι μάλλον έχεις ένα πεδίο στον πίνακα σου το οποίο ονομάζεται "company".

Με μερικές δοκιμές μπορεί να ψάξει ο χρήστης ποιά άλλα πεδία έχει ο πίνακας (η το query που χρησιμοποιείς). Θέλεις να μπορεί να το κάνει αυτό; ή να δίνεις πληροφορίες για το σχήμα και τη δομή της βάσης σου;

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Fixing a sql injection

Δημοσίευση από Apostolis_38 » 27 Μαρ 2009 16:16

Εχεις δίκιο.
Δυστυχώς.

Αν και θα βγω off topic, μια ερώτηση γιατί με έβαλες σε σκέψεις.
Το σύστημα με τις GET και POST το χρησιμοποιώ εκτενώς, που σημαίνει οτι στο address bar φαίνονται όλα τα table και fields.
Μια ιδέα που σκέφτηκα είναι να στέλνω αριθμούς και μετά με τον τρόπο που είπες να το μετατρέπω σε tables ή fields.
Δηλαδή κάπως έτσι:

Κώδικας: Επιλογή όλων

<a href = test.php?table=1&field=1>
και μετά

Κώδικας: Επιλογή όλων

if &#40;table == 1&#41;
table = "company"
elseif &#40;table ==2&#41;...
κ.λ.π. κ.λ.π.

Είναι αρκετά μπερδεψομπούτικο;
Να ψάξω για άλλο τρόπο;

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες