Ως διεθνής τυπική δήλωση ερωτήματος βάσης δεδομένων, οι δηλώσεις SQL έχουν χρησιμοποιηθεί ευρέως σε διάφορα περιβάλλοντα προγραμματισμού. Ως ώριμο και σταθερό σύστημα, η σύνδεση χρήστη και η επαλήθευση κωδικού πρόσβασης είναι απαραίτητες. Στην καθημερινή μου εργασία προγραμματισμού, διαπίστωσα ότι πολλοί προγραμματιστές χρησιμοποιούν δηλώσεις SQL για να επαληθεύσουν τους κωδικούς πρόσβασης των χρηστών μέσω μιας δήλωσης όπως αυτή:
sql="Επιλέξτε * από τον πίνακα χρήστη όπου name='"+name+"' και password='"+password+"'"
Το όνομα και ο κωδικός πρόσβασης είναι τα ονόματα χρήστη και οι κωδικοί πρόσβασης που εισάγει ο χρήστης και οι παραπάνω δηλώσεις εκτελούνται για να επαληθευτεί εάν ο χρήστης και ο κωδικός πρόσβασης είναι νόμιμοι και έγκυροι. Ωστόσο, μέσω της ανάλυσης, μπορεί να διαπιστωθεί ότι υπάρχουν μοιραία κενά στις παραπάνω δηλώσεις. Όταν εισάγουμε την ακόλουθη συμβολοσειρά στο όνομα χρήστη: 111'ή'1=1, στη συνέχεια εισάγουμε τον κωδικό πρόσβασης τυχαία, τον ορίζουμε σε aaaa. Μετά την αντικατάσταση της μεταβλητής, η πρόταση SQL γίνεται η ακόλουθη συμβολοσειρά:
sql="Επιλέξτε * από τον πίνακα χρήστη όπου name='111'or'1=1' και password='aaaa'
Όλοι γνωρίζουμε ότι όταν η δήλωση επιλογής κρίνει τις συνθήκες ερωτήματος, θα αγνοήσει τις ακόλουθες και (και) λειτουργίες κατά την αντιμετώπιση ή (ή) λειτουργίες και η τιμή 1=1 στην παραπάνω δήλωση είναι πάντα αληθής, πράγμα που σημαίνει ότι ανεξάρτητα από την τιμή που εισάγεται στον κωδικό πρόσβασης, μπορεί να περάσει την παραπάνω επαλήθευση κωδικού πρόσβασης! Η λύση σε αυτό το πρόβλημα είναι πολύ απλή και υπάρχουν πολλές μέθοδοι, η πιο συχνά χρησιμοποιούμενη είναι να κριθεί η νομιμότητα του χρήστη και ο κωδικός πρόσβασης που εισήγαγε ο χρήστης πριν από την εκτέλεση επαλήθευσης και δεν επιτρέπονται ειδικοί χαρακτήρες όπως μονά εισαγωγικά και σύμβολα ίσου.
Τα παραπάνω προβλήματα, αν και μπορεί να φαίνονται απλά, υπάρχουν. Για παράδειγμα, η πρώιμη έκδοση του διάσημου διαδικτυακού παιχνιδιού "Smiling Proud Jianghu" στο Διαδίκτυο είχε ένα τέτοιο πρόβλημα και ο συγγραφέας ανέλυσε επίσης προσεκτικά ορισμένα από τα προγράμματα που είχε γράψει στο παρελθόν αφού διάβασε την αναφορά ευπάθειας σχετικά με αυτό το παιχνίδι και υπήρχαν πολλά τέτοια κενά. Αυτό πρέπει πραγματικά να είναι η προσοχή μας. Αυτό εκθέτει επίσης την έλλειψη εμπειρίας προγραμματισμού και ευαισθητοποίησης σε θέματα ασφάλειας των νέων προγραμματιστών, συμπεριλαμβανομένου του συγγραφέα. Ταυτόχρονα, μας υπενθυμίζει επίσης ότι οι προγραμματιστές πρέπει να λαμβάνουν πλήρως υπόψη την ασφάλεια του προγράμματος κατά το σχεδιασμό του προγράμματος και δεν πρέπει να είναι ατημέλητοι και μια φαινομενικά μικρή παράλειψη μπορεί να προκαλέσει σοβαρές συνέπειες.
|