Prevent SQL injection - PHP & MySQL security

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

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

Απάντηση
Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από cordis » 04 Σεπ 2005 21:50

αυτό γίνετε γιατί το

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

;
του λέει τέλος εντολής.. εκτέλεσέ την.. αν είναι σωστή την εκτελεί, αν είναι λάθος πετάει μήνυμα και σταματάει. Με λίγα λόγια τρέχει όλα τα ερωτήματα έως να βρει κάποιο λάθος ερώτημα.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από iffor » 04 Σεπ 2005 21:57

Δεν διαφωνώ, αλλά δεν θα έπρεπε αφού εκτελέσει την πρώτη εντολή μετά να εκτελέσει και την δεύτερη, δηλ την delete from table;
Μιλάμε πάντα μέσω php, γιατί αν εκτελεστεί κατευθείαν από την βάση, τις εκτελεί όλες τις εντολές!
Οπότε ποιο το πρόβλημα αν πειράξει κάποιος το link και το κάνει σαν το
update.php?id=3;delete from table;--
;
Αυφού δεν θα εκτελεστεί το delete;
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Άβαταρ μέλους
bilios
Δημοσιεύσεις: 262
Εγγραφή: 29 Ιουν 2005 11:31
Τοποθεσία: Sahara..

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από bilios » 16 Ιαν 2008 10:25

vasika, opos euloga rothsan prin, an o allos den xerei thn vash sou, den einai etoimatzidikos o kodikas sou, kai apenergopoihseis ta error reports , den vlepo tropo na mporei o allos na antlhsei stoixeia gia na dhmiourghsei queries, sosta??h mou diafeugei kati?

satsilem
Δημοσιεύσεις: 39
Εγγραφή: 01 Απρ 2006 10:42
Τοποθεσία: Ναύπακτος
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από satsilem » 16 Ιαν 2008 13:44

Ένα από τα βασικά ζητήματα του Sql injection είναι ότι με την χρήση δυναμικών URL συνήθως προδίδεις και ονοματολογία που έχεις στον πίνακά σου.

Για παράδειγμα είναι πολύ πιθανό να έχεις το εξης:
www.mysite.gr/blog.php?post_id=12

Εύκολα μπορεί κάποιος να μαντέψει ότι το πιθανότερο είναι να έχεις έναν πίνακα που έχει πεδίο με την ίδια η αντίστοιχη ονομασία.

Προσωπικά η λύση που χρησιμοποιώ είναι να κόβω τελείως τις GET variables.

Αντί αυτού χρησιμοποιώ μια ψευδο -directory, μορφή στα URI που φτιάχνω.

Είναι μια όχι ιδιαίτερα δύσκολη τεχνική. Πρός το παρόν δεν μπορώ να σου το εξηγήσω πως θα το κάνεις αλλά υπόσχομαι να γράψω ένα tutorial.

Αυτό είναι το πρώτο βήμα θωράκισης....

kpagan
Δημοσιεύσεις: 7
Εγγραφή: 14 Οκτ 2007 19:36
Τοποθεσία: Αθήνα
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από kpagan » 17 Ιαν 2008 14:09

Καταρχήν δεν χρειάζεται να μαντέψει κανείς τα ονόματα των πινάκων της βάσης σου. Μπορεί και να τα βρει ακριβώς. Μη ξεχνάμε ότι ένα sql injection δεν γίνεται πάντα με ένα μόνο query (δηλ. σε ένα μόνο βήμα) αλλά σε πολλά.
Έτσι το πρώτο query θα μπορούσε πχ να είναι

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

display.php?gs_id=2;SHOW TABLES;
$sql = "SELECT * FROM game_scores WHERE gs_id=$gs_id";
Αυτό σε συνδιασμό με απρόσεκτο κώδικα θα μπορεί να δείξει τους πίνακες που υπάρχουν στη βάση.
Με μερικά άλλα queries ακόμα μπορεί να μάθει όλη τη δομή της ΒΔ σου.
Μια καλή στρατηγική είναι να ελέγχεις πάντα τις μεταβλητές που παίρνεις από τους χρήστες.
Κάποιοι τρόποι έχουν αναφερθεί ήδη και δεν θέλω να επεκταθώ άλλο σ' αυτό.
Νομίζω ότι η απλούστερη μέθοδος είναι να κάνεις πάντα escape τα quotes με τη mysql_real_escape_string.
Τα quotes δεν γίνονται αυτόματα escape όπως αναφέραν κάποια παιδιά.
Θα πρέπει να έχεις ενεργοποιημένο το magic_quotes_gpc το οποίο ναι μεν είναι On by default αλλά η ομάδα ανάπτυξης της PHP αποθαρύνει τους προγραμματιστές να βασίζονται σε αυτό το χαρακτηριστικό καθώς θα αφαιρεθεί στην PHP 6.
Ένας portable τρόπος να κάνεις escape τις μεταβλητές που παίρνεις ανεξαρτήτως αν είναι ενεργοποιημένο το magic_quotes_gpc ή το magic_quotes_sybase είναι:

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

function smartQuote($str) {
    //Note:  If magic_quotes_gpc is enabled, first apply stripslashes() to the data. Using this function on data which has already been escaped will escape the data twice.
	if(get_magic_quotes_gpc()) 
	{
		if(ini_get('magic_quotes_sybase')) 
		{
			$str = str_replace("''", "'", $str);
		} else 
		{
			$str = stripslashes($str);
		}
	} 
	
	return mysql_real_escape_string($str);
}
Επίσης μια πολύ καλή πρακτική είναι να έχεις διαφορετικό χρήστη της mysql για administrator και άλλο για απλό user.
Πχ αν έχεις ένα CMS που θες ο απλά να φαίνονται το content της σελίδας σου τότε ο mysql user χρειάζεται να έχει μόνο SELECT προνόμια και τίποτ' άλλο.
Οπότε και sql injection να σου κάνουν δε θα μπορούν να κάνουν DELETE ή UPDATE τα δεδομένα στη βάση σου.
Βέβαια αν θες ο χρήστης να συμπληρώνει και φόρμες....
αυτό είναι μεγάλη κουβέντα και πρέπει να κάνεις όλα αυτά που αναφέρθηκαν προηγουμένως
http://www.showmyip.gr
See where is your ip located on a map!!!

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από cherouvim » 17 Ιαν 2008 14:28

Σε συστήματα που το επιτρέπουν το καλύτερο είναι η χρήση PreparedStatement:

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

$db_connection = new mysqli("localhost", "user", "pass", "db");
$statement = $db_connection->prepare("SELECT thing FROM stuff WHERE id = ?");
$statement->bind_param("i", $id);
$statement->execute();
Ο driver της βάσης αναλαμβάνει να κάνει escape τις παραμέτρους του query.

Άβαταρ μέλους
lon3wolf
Δημοσιεύσεις: 76
Εγγραφή: 11 Νοέμ 2005 15:05
Τοποθεσία: 127.0.0.1
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από lon3wolf » 17 Ιαν 2008 14:44

Ακόμη και όμως αν δουλεύεις ετοιματζίδικο CMS περνώντας στον Apache το modsecurity γλιτώνεις απο αρκετά προβλήματα.
Φτάνει να κάνεις σωστή χρήση απο τα rules

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από cordis » 17 Ιαν 2008 20:46

Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από vassilism » 11 Φεβ 2008 18:35

Καλησπέρα σας.
Επειδή προσπαθώ να μάθω τρόπους για την αποφυγή SQL injection, ξεκινάω διαβάζοντας προσεκτικά αυτό το θέμα.

Υπάρχει αυτό το παράδειγμα που σου διαγράφει όλα τα περιεχόμενα ενός πίνακα:
Παράδειγμα:

έχεις στο php σου αυτόν τον κώδικα:
κώδικας:
$sql = "SELECT * FROM game_scores WHERE gs_id=$gs_id";

και το $gs_id το περνάς σαν παράμετρο στο url
display.php?gs_id=2

εάν κάποιος πάει και βάλει στο url αυτό:

display.php?gs_id=2;delete from game_scores;

σου έχει σβήσει όλα τα περιεχόμενα του πίνακα game_scores

το πιο απλό που μπορείς να κάνεις είναι να κάνεις το value int
πχ.
κώδικας:
$gs_id = intval($gs_id);
$sql = "SELECT * FROM game_scores WHERE gs_id=$gs_id";


αυτός είναι ένας από τους πολλούς τρόπους...
Έστω ότι έχω:

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

row.php?id=181
Κάνω:

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

row.php?id=181;delete from onoma_table;
Κανονικά αυτό δεν θα έπρεπε να διαγράψει αυτήν την εγγραφή?

Απάντηση

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

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

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