Εάν η ιστοσελίδα σας αποδέχεται την είσοδο του χρήστη ο SQL ένεση μπορεί να συμβεί αν τα δεδομένα δεν έχει επικυρωθεί ή να απολυμαίνονται πριν από το ερώτημα της βάσης δεδομένων γίνεται. Το ακόλουθο παράδειγμα είναι ένα κοινό λάθος, γίνεται από τον προγραμματιστή αρχή ή webmaster. Ελέγξτε τον κωδικό αυτό, εσείς έγραψε ποτέ ένα ερώτημα MySQL σαν αυτό;
PHP
$ result = mysql_query ("SELECT * από τους χρήστες με το Όνομα Χρήστη =" ". $ _POST [" username "].» «&& password =" ". $ _POST ["password"].? "")
1 ". $ _POST". $ _POST $ result = mysql_query ("SELECT * από τους χρήστες με το Όνομα Χρήστη =" ["username"]. »« && κωδικό πρόσβασης = '["password"] . ")? Αυτή η σειρά του κώδικα είναι γραμμένο για να δεχθεί δύο τιμές από μια φόρμα σύνδεσης: ένα όνομα χρήστη και έναν κωδικό πρόσβασης. Αλλά τι γίνεται αν κάποιος θα υποβάλει κενό όνομα χρήστη και για την τιμή κωδικό πρόσβασης την ακόλουθη συμβολοσειρά: «Ή το όνομα χρήστη = 'admin το ερώτημα θα μοιάζουν: PHP $ result = mysql_query ("SELECT * από τους χρήστες με το Όνομα Χρήστη = '' && password = '' ή το όνομα χρήστη = "admin" ")? 1 $ = αποτέλεσμα mysql_query ("SELECT * από τους χρήστες με το Όνομα Χρήστη = '' && κωδικό πρόσβασης = '' ή το όνομα χρήστη =" admin "")? Δημιουργία ασφαλούς php websitesIf αυτό το ερώτημα χρησιμοποιήθηκε για μια δέσμη ενεργειών σύνδεσης, οι χάκερ θα αποκτήσετε πρόσβαση στο λογαριασμό για το χρήστη με το όνομα "admin". Φανταστείτε τι ένας χάκερ θα μπορούσε να κάνει στην εφαρμογή web σας, εάν αυτός έχει δικαιώματα διαχειριστή. Μην ανησυχείτε, υπάρχουν διάφοροι τρόποι για να προστατεύσει τα ερωτήματα σας από ενέσεις SQL. Πρώτα απ 'όλα αυτό είναι καλύτερο να χρησιμοποιήσετε το MySQL βελτιωμένη επέκταση (mysqli). Οι παλιές λειτουργίες PHP για MySQL είναι ακόμα διαθέσιμα, αλλά η επέκταση mysqli προσφέρει πιο ασφαλή χαρακτηριστικά. Εάν χρησιμοποιείτε τις λειτουργίες mysqli μπορείτε να επιλέξετε μεταξύ των διαδικαστικών στυλ και αντικειμενοστραφή στυλ. Μπορώ να χρησιμοποιήσω για τα παραδείγματα μου αντικειμενοστρεφής στυλ. Πριν ξεφύγουν από τις τιμές για τα ερωτήματα μας χρησιμοποιούμε την filter_var λειτουργίας () για να αποστειρώνουν τις τιμές εισόδου. PHP $ username = filter_var ($ _ POST ["username"], FILTER_SANITIZE_STRING)? $ κωδικού πρόσβασης = filter_var ($ _ POST ["password"], FILTER_SANITIZE_STRING)? 1 2 $ username = filter_var ($ _ POST ["username"], FILTER_SANITIZE_STRING)? $ password = filter_var ($ _ POST ["password"], FILTER_SANITIZE_STRING)? παράδειγμα μου χρησιμοποιεί την προεπιλεγμένη τιμή για τον τύπο του φίλτρου FILTER_SANITIZE_STRING. Στη συνέχεια μπορώ να χρησιμοποιήσω το mysqli παραλλαγή του mysql_real_escape_string () για να προετοιμάσει τις χορδές για το ερώτημα βάσης δεδομένων. Πριν μπορώ να συνεχίσω με την επικύρωση των εισροών, θα πρέπει να δημιουργήσετε ένα αντικείμενο βάσης δεδομένων για πρώτη φορά. PHP $ db = νέα mysqli ("localhost", "db_user", "db_password", "db_name")? αν (mysqli_connect_errno ()) {/ * Να ελέγχετε σύνδεση * / die ("Connect απέτυχε:" .mysqli_connect_error ())? } $ username = $ dB-> mysqli_real_escape_string ($ username)? $ password = $ dB-> mysqli_real_escape_string ($ password)? 1 2 3 4 5 6 7 $ db = νέα mysqli ("localhost", "db_user", "db_password", "db_name")? αν (mysqli_connect_errno ()) {/ * Να ελέγχετε σύνδεση * / die ("Connect απέτυχε:" .mysqli_connect_error ()) ? } $ username = $ dB-> mysqli_real_escape_string ($ username)? $ password = $ dB-> mysqli_real_escape_string ($ password)? Τώρα είναι ασφαλές να περάσετε αυτές τις τιμές στο ερώτημα βάσης δεδομένων μας: PHP $ αποτέλεσμα = $ dB-> ερώτημα ( sprintf ("SELECT από τους χρήστες με το Όνομα Χρήστη = '% s' && κωδικό πρόσβασης = '% s'", $ username, $ password))? $ dB-> κοντά ()? 1 2 $ result = $ dB-> ερώτημα (sprintf ("SELECT από τους χρήστες με το Όνομα Χρήστη = '% s' && κωδικό πρόσβασης = '% s'", $ username, $ password))? $ dB-> κοντά ()? Στο παράδειγμά μου χρησιμοποίησα το sprintf λειτουργία () για να προσθέσετε το τιμές στο ερώτημα και να χρησιμοποιήσετε το $ dB-> κοντά () για να καταστρέψει το αντικείμενο της βάσης δεδομένων. Ένα άλλο μεγάλο και ασφαλή mysqli διαθέτουν τη λειτουργία έτοιμες καταστάσεις.
Μεταφράζονται, παρακαλώ περιμένετε..