Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> PHP /MySQL Προγραμματισμός

Πώς ελέγχετε τα δεδομένα που δίνονται από τον χρήστη με τιμές βάσης δεδομένων χρησιμοποιώντας PHP από τη βάση δεδομένων MySQL;

Υπάρχουν διάφοροι τρόποι για να ελέγξετε εάν τα δεδομένα που παρέχονται από το χρήστη ταιριάζουν με τα δεδομένα σε μια βάση δεδομένων MySQL χρησιμοποιώντας το PHP. Η καλύτερη προσέγγιση εξαρτάται από το τι συγκρίνετε και πώς θέλετε να χειριστείτε πιθανές αποκλίσεις. Ακολουθούν μερικά παραδείγματα, εστιάζοντας στις βέλτιστες πρακτικές ασφαλείας:

1. Έλεγχος για έναν μόνο χρήστη (π.χ. σύνδεση):

Αυτό είναι το πιο συνηθισμένο σενάριο. Θα ελέγξουμε εάν ένα όνομα χρήστη και ένας κωδικός πρόσβασης ταιριάζουν με μια εγγραφή στη βάση δεδομένων. Βασικά, θα καταγράψουμε τον κωδικό πρόσβασης πριν το συγκρίνουμε. Ποτέ μην αποθηκεύετε κωδικούς πρόσβασης σε απλό κείμενο!

`` `php

// διαπιστευτήρια βάσης δεδομένων (αντικαταστήστε αυτά με τα πραγματικά σας διαπιστευτήρια!)

$ servername ="your_servername";

$ username ="your_username";

$ password ="your_password";

$ dbname ="your_dbname";

// Εισαγωγή χρήστη (απολυμαντικά αυτό!)

$ usernameInput =$ _Post ["Όνομα χρήστη"];

$ passwordInput =$ _Post ["κωδικός"]];

// απολύστε τις εισόδους χρηστών για την πρόληψη της ένεσης SQL

$ usernameInput =mysqli_real_escape_string ($ conn, $ usernameInput);

$ passwordInput =mysqli_real_escape_string ($ conn, $ passwordinput);

// Δημιουργία σύνδεσης

$ conn =νέο mysqli ($ servername, $ username, $ password, $ dbname);

// Ελέγξτε τη σύνδεση

αν ($ conn-> connect_error) {

die ("Η σύνδεση απέτυχε:" $ conn-> connect_error);

}

// Προετοιμασία και δέσμευση

$ stmt =$ conn-> prepare ("επιλέξτε password_hash από χρήστες όπου όνομα χρήστη =;");

$ stmt-> bind_param ("s", $ usernameInput);

$ stmt-> execute ();

$ αποτέλεσμα =$ stmt-> get_result ();

αν ($ αποτέλεσμα-> num_rows> 0) {

$ row =$ αποτέλεσμα-> fetch_assoc ();

$ hashedPassword =$ row ["password_hash"];

// επαληθεύστε τον κωδικό πρόσβασης χρησιμοποιώντας το password_verify (ενσωματωμένη λειτουργία hashing κωδικού πρόσβασης PHP)

αν (password_verify ($ passwordInput, $ hashedPassword)) {

// Επιτυχής σύνδεση

Echo "Σύνδεση επιτυχίας!";

} αλλιώς {

// λανθασμένος κωδικός πρόσβασης

echo "λανθασμένος κωδικός πρόσβασης";

}

} αλλιώς {

// Το όνομα χρήστη δεν βρέθηκε

echo "Το όνομα χρήστη δεν βρέθηκε.";

}

$ stmt-> close ();

$ conn-> close ();

>>

`` `

Επεξήγηση:

* διαπιστευτήρια βάσης δεδομένων: Αντικαταστήστε τα διαπιστευτήρια κράτησης θέσης με τις πραγματικές λεπτομέρειες της βάσης δεδομένων MySQL.

* Εισαγωγή χρήστη: Αυτός ο κωδικός υποθέτει ότι το όνομα χρήστη και ο κωδικός πρόσβασης υποβάλλονται μέσω αίτησης δημοσίευσης. Πάντα απολυματίζετε την είσοδο χρήστη για την πρόληψη των τρωτών σημείων έγχυσης SQL. `mysqli_real_escape_string ()` είναι ένα βασικό βήμα, αλλά οι προετοιμασμένες δηλώσεις (που χρησιμοποιούνται εδώ) είναι πολύ πιο ισχυρές.

* Προετοιμασμένη δήλωση: Μια προετοιμασμένη δήλωση εμποδίζει την έγχυση SQL διαχωρίζοντας το ερώτημα SQL από τα δεδομένα που παρέχονται από το χρήστη. Είναι ζωτικής σημασίας για την ασφάλεια.

* Κωδικός πρόσβασης: Η βάση δεδομένων πρέπει να αποθηκεύει κωδικό πρόσβασης *Hashes *, όχι απλούς κωδικούς πρόσβασης κειμένου. `password_hash ()` δημιουργεί ένα ασφαλές hash και `password_verify ()` συγκρίνει την είσοδο του χρήστη με το αποθηκευμένο hash.

* Χειρισμός σφαλμάτων: Ο κώδικας περιλαμβάνει βασικό χειρισμό σφαλμάτων για σύνδεση βάσης δεδομένων και αποτυχίες ερωτήματος.

2. Έλεγχος για πολλαπλούς αγώνες (π.χ. αναζήτηση ενός πίνακα):

Εάν πρέπει να βρείτε πολλαπλούς αγώνες με βάση την είσοδο του χρήστη (όπως η αναζήτηση προϊόντων με συγκεκριμένο όνομα), θα πρέπει να προσαρμόσετε το ερώτημα:

`` `php

// ... (σύνδεση βάσης δεδομένων όπως παραπάνω) ...

$ searchTerm =$ _post ["searchTerm"];

$ searchTerm =mysqli_real_escape_string ($ conn, $ searchterm); // Περιεχόμενο!

$ sql ="επιλέξτε * από προϊόντα όπου το όνομα όπως το '%$ searchterm%'"; // Απλό παράδειγμα - Χρησιμοποιήστε την προετοιμασμένη δήλωση για καλύτερη ασφάλεια!

$ αποτέλεσμα =$ conn-> ερώτημα ($ SQL);

αν ($ αποτέλεσμα-> num_rows> 0) {

ενώ ($ row =$ αποτέλεσμα-> fetch_assoc ()) {

// Επεξεργαστείτε κάθε σειρά αντιστοίχισης

Echo "Προϊόν:". $ row ["Όνομα"]. «
"?

}

} αλλιώς {

echo "Δεν βρέθηκαν προϊόντα.";

}

// ... (κλείσιμο σύνδεσης) ...

>>

`` `

Σημαντική σημείωση: Το παραπάνω παράδειγμα αναζήτησης χρησιμοποιεί τη συγκόλληση συμβολοσειράς, η οποία είναι ευάλωτη στην ένεση SQL εάν το `$ searchterm` δεν έχει απολυθεί . Για μια ασφαλή λύση, την ξαναγράψτε χρησιμοποιώντας προετοιμασμένες δηλώσεις. Παράδειγμα:

`` `php

$ stmt =$ conn-> Προετοιμασία ("επιλέξτε * από προϊόντα όπου το όνομα Like;");

$ searchTerm ="%". $ searchterm. "%"; // προσθέστε μπαλαντέρ για όπως

$ stmt-> bind_param ("s", $ searchterm);

$ stmt-> execute ();

// ... υπόλοιπο του κώδικα για να χειριστεί τα αποτελέσματα ...

`` `

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

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα