Prevent SQL injection - PHP & MySQL security

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

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

Απάντηση
Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από ThyClub » 23 Φεβ 2004 23:39

Θα θελα να μάθω τρόπους για την αποφυγή SQL injection με php.

Έψαξα google αλλά τα αποτελέσματα δεν με ικανοποιούν πλήρως. Θέλω ενα παράδειγμα SQL injection και τον τρόπο αποφυγής του.

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

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από cordis » 23 Φεβ 2004 23:52

Παράδειγμα:

έχεις στο 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";
αυτός είναι ένας από τους πολλούς τρόπους... ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από Rapid-eraser » 23 Φεβ 2004 23:57

gevikotera afto pou prepei va kaveis eivai va elegxeis tis metablites sou apo pou ir8av kai av prepei va eivai apo ekei pou eivai tote av eivai stnv sosti morfi tous.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

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

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από cordis » 24 Φεβ 2004 00:18

Το καλύτερο που μπορείς να κάνεις είναι να μη χρησιμοποιείς ποτέ τις μεταβλητές με τα αρχικά τους ονόματα, αλλά να τις τοποθετείς στην αρχή του php σε άλλες καθαρές περνώντας τες πρώτα από κάποιον parser (function) που θα αναλαμβάνει να τις 'καθαρίσει'...

πχ. στο functions.php του phpbb22 υπάρχει αυτή η function:

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

function request_var($var_name, $default)
{
	if (!isset($_REQUEST[$var_name]))
	{
		return $default;
	}
	else
	{
		$var = $_REQUEST[$var_name];
		$type = gettype($default);

		if (is_array($var))
		{
			foreach ($var as $k => $v)
			{
				if (is_array($v))
				{
					foreach ($v as $_k => $_v)
					{
						set_var($var[$k][$_k], $_v, $type);
					}
				}
				else
				{
					set_var($var[$k], $v, $type);
				}
			}
		}
		else
		{
			set_var($var, $var, $type);
		}

		return $var;
	}
}
στο viewforum.php στην αρχή του έχουμε:

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

$forum_id	= request_var('f', 0);
και πιο κάτω...

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

	$sql = 'SELECT *
		FROM ' . FORUMS_TABLE . '
		WHERE forum_id = ' . $forum_id;
η παράμετρος στο viewforum.php περνάει με f=2, αλλά μέσα του χρησιμοποιεί την $forum_id η οποία περιέχει τα δεδομένα που ήρθαν από την f, αλλά επεξεργασμένα από την function request_var
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

AlexanderTheGr
Δημοσιεύσεις: 153
Εγγραφή: 11 Ιούλ 2003 04:22
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από AlexanderTheGr » 24 Φεβ 2004 04:18

Μια άλλη λυση εκτος απο την intval() είναι να εσωκλειεις τις ολες μεταβλητές σε μονες αποστρόφους στην SQL εντολή

Δηλ

αντι για αυτό

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

$sql = "SELECT * FROM game_scores WHERE gs_id=$gs_id";
αυτό

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

$sql = "SELECT * FROM game_scores WHERE gs_id='".$gs_id."'";

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από softius » 24 Φεβ 2004 10:07

AlexanderTheGr έγραψε:Μια άλλη λυση εκτος απο την intval() είναι να εσωκλειεις τις ολες μεταβλητές σε μονες αποστρόφους στην SQL εντολή
Ούτε κι αυτό είναι αρκετό - τουλάχιστον χωρίς επεξεργασία.

Για παράδειγμα:

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

$gs_id = 2';delete from game_scores;--
Αυτό θα οδηγήσει στο

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

SELECT * FROM game_scores WHERE gs_id='2'; DELETE FROM game_scores;--';
και μη ξεχνάς οτιδήποτε μετά τα -- είναι σχόλια και αγνοούνται

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από softius » 24 Φεβ 2004 10:18

Αυτό το έγγραφο δεν αναφέρει τρόπους λύσης του προβλήματος, αλλά το τι μπορεί να συμβεί αν διαβάζεις ότι να 'ναι χωρίς να το ελέγχεις.

http://www.nextgenss.com/papers/advance ... ection.pdf

AlexanderTheGr
Δημοσιεύσεις: 153
Εγγραφή: 11 Ιούλ 2003 04:22
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από AlexanderTheGr » 24 Φεβ 2004 18:51

softius έγραψε:
AlexanderTheGr έγραψε:Μια άλλη λυση εκτος απο την intval() είναι να εσωκλειεις τις ολες μεταβλητές σε μονες αποστρόφους στην SQL εντολή
Ούτε κι αυτό είναι αρκετό - τουλάχιστον χωρίς επεξεργασία.

Για παράδειγμα:

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

$gs_id = 2';delete from game_scores;--
Αυτό θα οδηγήσει στο

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

SELECT * FROM game_scores WHERE gs_id='2'; DELETE FROM game_scores;--';
και μη ξεχνάς οτιδήποτε μετά τα -- είναι σχόλια και αγνοούνται
Οχι διότι ι απόστροφος slashαρετε αυτόματα μεσα στο query μεσω τις PHP

δηλ το

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

$gs_id = 2';delete from game_scores;-- 
γινεται ετσι με στο SQL ερώτημα

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

SELECT * FROM game_scores WHERE gs_id='2\'; DELETE FROM game_scores;--';
Ετσι αυτο το ερωτημα ειναι ακινδυνο

Το αθρο που παρεθεσες αναφέρται για τον SQL Server. Ενα μειονεκτημα του SQL Server (Κατα την δικία μου γνώμη) είναι οταν ενα πεδίο σε έναν πίνακα το έχεις δηλώσει σαν αριθμιτικό τοτε στο SQL ερώτημα δεν μπορείς να βαλεις αποστρόφους ανάμεσα στις τιμες που αναφέρονται σε αυτο το πεδίο. Οσες μεταβλητές εσωκλειονται σε αποστροφους τοτε ο SQL Server τις λαμβανει ως αλφαριθμικές και έτσι θα δημιουργήθει σφάλμα αν το κάνεις.

Δηλ στον SQL Server ειναι λαθος να γράψεις:

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

SELECT * FROM game_scores WHERE gs_id='2' 
Το σωστό είναι

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

SELECT * FROM game_scores WHERE gs_id=2 
Εναντιθέση με την mySQL που σου επιτρέπει να εσωκλειεις αριθμιτικές τιμες μεσα σε αποστρόφους. Ετσι με την MYSQL τα πράγματα γινονται πιο απλα.

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από ThyClub » 24 Φεβ 2004 22:38

:D :D :D :D

Σας ευχαριστώ όλους. Λέω να φτιάξω μια function σαν αυτή του phpbb και να την βάλω στην αρχή κάθε σελίδας. Ή μάλλον στην αρχή του index.php αφού όλες οι άλλες γίνονται include.
το πιο απλό που μπορείς να κάνεις είναι να κάνεις το value int
πχ.
κώδικας:
$gs_id = intval($gs_id);
$sql = "SELECT * FROM game_scores WHERE gs_id=$gs_id";
Και αν θέλω να περάσω μεταβλητή με περιεχόμενο σαν αυτό:
ndex.php?page=news&title=today
:question: :question:

Άβαταρ μέλους
greek_manager
Honorary Member
Δημοσιεύσεις: 1243
Εγγραφή: 21 Οκτ 2002 19:01
Τοποθεσία: Back to Greece
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από greek_manager » 25 Φεβ 2004 01:37

Αυτό είναι 2 παράμετροι ;)
aka thkouk
Football Manager - H ελληνική κοινότητα
παιχνιδια στρατηγικης - Παίξε Δωρεάν

Άβαταρ μέλους
greek_manager
Honorary Member
Δημοσιεύσεις: 1243
Εγγραφή: 21 Οκτ 2002 19:01
Τοποθεσία: Back to Greece
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από greek_manager » 25 Φεβ 2004 01:44

A και φυσικά μια συνάρτηση σαν αυτή που πόσταρε ο Σκλάβος (του phpbb) τις διαβάζει όλες, όσες και να είναι
aka thkouk
Football Manager - H ελληνική κοινότητα
παιχνιδια στρατηγικης - Παίξε Δωρεάν

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από Rapid-eraser » 25 Φεβ 2004 13:47

basika dev xriazete va avoisixite toso poli gia ta sqli afou o kodikas sas dev eivai open (dev tov mirazete stov kosmos opos px to nuke) gia va mporei o opoios dipote va katsei va dimiourgisei tetoia problimata
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από ThyClub » 25 Φεβ 2004 15:12

Έλα όμως που στην περίπτωσή μου είναι open. ZeusCMS

Άβαταρ μέλους
vcore
Δημοσιεύσεις: 354
Εγγραφή: 20 Δεκ 2003 01:19
Τοποθεσία: Crete
Επικοινωνία:

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από vcore » 28 Μαρ 2005 16:54

cordis έγραψε:Παράδειγμα:

έχεις στο 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";
αυτός είναι ένας από τους πολλούς τρόπους... ;)
Και που ξέρει ο χρήστης πως λένε τον πίνακα σου ώστε να σου κάνει inject? :pint:
Easy CMS
------------
Το να ζητάς βοήθεια δεν σημαίνει ότι είσαι εξαρτημένος.

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

Prevent SQL injection - PHP & MySQL security

Δημοσίευση από cordis » 28 Μαρ 2005 17:11

1ον. Στέλνοντας ένα string στο $gs_id πιθανώς θα σου βγάλει μήνυμα λάθους με όλο το SQL statement, οπότε όλα τα άλλα είναι εύκολα... ;)

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

Απάντηση

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

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

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