Pages

Sunday, August 15, 2010

PHP και Ασφάλεια - SQL Injections

Το θέμα "ασφάλεια" δεν απασχολεί μόνο την PHP, αλλά οποιαδήποτε γλώσσα προγραμματισμού.

Πρέπει πάντα να κάνουμε ελέγχους έτσι ώστε να μειώσουμε τα λάθη που θα εμφανιστούν. (Να τα εξαφανίσουμε αποκλείεται, δεν υπάρχει πρόγραμμα στο οποίο να έχουν προβλεφτεί τα πάντα)

Ειδικά στην PHP που λόγω της χρήσης της στο Internet μπορεί η εφαρμογή μας να χρησιμοποιηθεί εν δυνάμει από τους πάντες οφείλουμε να προγραμματίζουμε αμυντικά, κοινώς:
α) Θεωρούμε -και όχι αδίκως- ότι ο τελικός χρήστης είναι παντελώς ηλίθιος.
β) Δεν ξέρει να διαβάζει.
γ) Είναι 60+ χρονών και θεωρεί ακόμα ότι ο υπολογιστής είναι στα επίπεδα του Eniac.

Οπότε τι κάνουμε;
Ελέγχουμε πάντα ΤΑ ΠΑΝΤΑ.

SQL Injection:
Θεωρώ ότι ο όρος είναι αρκετά γνώριμος (ή απλά είμαι υπεραισιόδοξος).
Σε περίπτωση που δεν τον ξέρετε, το παρακάτω θα σας διαφωτίσει:

Photobucket


Υπάρχουν διάφοροι τρόποι να προστατευτεί κανείς και η PHP μας δίνει αρκετές συναρτήσεις να μας βοηθήσει.
Ουσιαστικά, αυτό που πρέπει να γίνει, είναι να γίνουν escaped όλοι οι ειδικοί χαρακτήρες έτσι ώστε o SQL server που θα εκτελέσει το ερώτημα να μη τους λάβει υπ' όψιν του ως τμήμα του ερωτήματος, αλλά ως περιεχόμενο.

Παλιότερα υπήρχε η συνάρτηση addslashes() η οποία έπαιρνε ένα string, και, όπως λέει και το όνομά της, τοποθετούσε καθέτους πριν από τους ειδικούς χαρακτήρες. 
Επίσης για να διευκολύνουν τους προγραμματιστές, έβαλαν και μια directive ονόματι magic_quotes_gpc, η οποία ουσιαστικά όταν ήταν σε λειτουργία εφάρμοζε αυτόματα την addslashes() σε όλες τις gpc ($_GET, $_POST, $_COOKIE) μεταβλητές.

Στις πιο καινούριες εκδόσεις προστέθηκε η πιο αποτελεσματική mysql_real_escape_string() με την οποία και μόνο στη σκέψη να γράφεις όλο αυτό το μακρινάρι για κάθε τιμή που θες να κάνεις ασφαλή είναι να σε πιάνει απόγνωση.
Και άντε, το γράφεις, και σπίτι σου δουλεύει καλά με το τελευταίο xampp που πέρασες, και όλα ωραία. Όταν πας να το ανεβάσεις σε έναν server που δεν έχουν ανανεώσει την php τους και άρα δεν έχουν αυτή τη νέα συνάρτηση τι κάνεις;

Ιδού τι κάνεις:

<?php
 function mysql_prep($value)
 {
   $magic_quotes_active = get_magic_quotes_gpc(); //Ελέγχουμε αν είναι ενεργά τα magic_quotes

   if(function_exists("mysql_real_escape_string"))  // Αν υπάρχει η συνάρτηση mysql_real_escape_string...
   {
    // ...τότε, αν είναι ενεργά τα magic_quotes, τα κάνουμε undo για να λειτουργήσει η (καλύτερη) mysql_real_escape_string
    if($magic_quotes_active)
    {
     $value = stripslashes($value);
    }
    $value = mysql_real_escape_string($value);
   }
   else  //αν δεν υπάρχει η mysql_real_escape_string
   {
    if(!$magic_quotes_active) // αν δεν είναι ενεργά τα magic_quotes, τότε τη χρησιμοποιούμε μόνοι μας
    {
     $value = addslashes($value);
    }
    //αν είναι ήδη ενεργά τα magic_quotes τότε έχουν ήδη χρησιμοποιθεί
   }
   return $value;
 }
?>
Enjoy.

No comments:

Post a Comment