Πώς να αποτρέψετε την έγχυση SQL σε PHP (με εικόνες)

Πίνακας περιεχομένων:

Πώς να αποτρέψετε την έγχυση SQL σε PHP (με εικόνες)
Πώς να αποτρέψετε την έγχυση SQL σε PHP (με εικόνες)

Βίντεο: Πώς να αποτρέψετε την έγχυση SQL σε PHP (με εικόνες)

Βίντεο: Πώς να αποτρέψετε την έγχυση SQL σε PHP (με εικόνες)
Βίντεο: ΚΟΡΟΙΔΕΥΟΥΝ ΟΡΕΙΝΗ ΜΕΛΙΣΣΑ 2024, Ενδέχεται
Anonim

Αυτό το wikiHow σας διδάσκει πώς να αποτρέψετε την έγχυση SQL χρησιμοποιώντας Προετοιμασμένες δηλώσεις σε PHP. Η έγχυση SQL είναι μία από τις πιο κοινές ευπάθειες στις εφαρμογές Ιστού σήμερα. Οι προετοιμασμένες δηλώσεις χρησιμοποιούν δεσμευμένες παραμέτρους και δεν συνδυάζουν μεταβλητές με συμβολοσειρές SQL, καθιστώντας αδύνατο για έναν εισβολέα να τροποποιήσει τη δήλωση SQL.

Οι προετοιμασμένες δηλώσεις συνδυάζουν τη μεταβλητή με τη μεταγλωττισμένη πρόταση SQL, έτσι ώστε η SQL και οι μεταβλητές να αποστέλλονται χωριστά. Οι μεταβλητές στη συνέχεια ερμηνεύονται ως απλές συμβολοσειρές και όχι ως μέρος της δήλωσης SQL. Χρησιμοποιώντας τις μεθόδους στα παρακάτω βήματα, δεν θα χρειαστεί να χρησιμοποιήσετε άλλες τεχνικές φιλτραρίσματος έγχυσης SQL, όπως το mysql_real_escape_string ().

Βήματα

Μέρος 1 από 2: Κατανόηση της ένεσης SQL

Βήμα 1. Το SQL Injection είναι ένας τύπος ευπάθειας σε εφαρμογές που χρησιμοποιούν βάση δεδομένων SQL

Η ευπάθεια προκύπτει όταν μια είσοδος χρήστη χρησιμοποιείται σε μια δήλωση SQL:

$ name = $ _GET ['όνομα χρήστη']; $ query = "ΕΠΙΛΟΓΗ κωδικού πρόσβασης από tbl_user WHERE name = '$ name'";

Βήμα 2. Η τιμή που εισάγει ένας χρήστης στο όνομα χρήστη της μεταβλητής URL θα αντιστοιχιστεί στο όνομα της μεταβλητής $

Στη συνέχεια τοποθετείται απευθείας στη δήλωση SQL, επιτρέποντας στον χρήστη να επεξεργαστεί τη δήλωση SQL.

$ name = "admin 'OR 1 = 1 -"; $ query = "ΕΠΙΛΟΓΗ κωδικού πρόσβασης από tbl_user WHERE name = '$ name'";

Βήμα 3. Στη συνέχεια, η βάση δεδομένων SQL θα λάβει τη δήλωση SQL ως εξής:

ΕΠΙΛΟΓΗ κωδικού πρόσβασης από tbl_users WHERE name = 'admin' OR 1 = 1 - '

  • Αυτό είναι έγκυρο SQL, αλλά αντί να επιστρέψει έναν κωδικό πρόσβασης για τον χρήστη, η δήλωση θα επιστρέψει όλους τους κωδικούς πρόσβασης στον πίνακα tbl_user. Αυτό δεν είναι κάτι που θέλετε στις διαδικτυακές σας εφαρμογές.

    Μέρος 2 από 2: Χρήση του mySQLi για τη δημιουργία προετοιμασμένων δηλώσεων

    2542820 1
    2542820 1

    Βήμα 1. Δημιουργήστε το ερώτημα mySQLi SELECT

    Χρησιμοποιήστε τον παρακάτω κώδικα για να ΕΠΙΛΕΞΤΕ δεδομένα από έναν πίνακα χρησιμοποιώντας τις καταστάσεις προετοιμασίας mySQLi.

    $ name = $ _GET ['όνομα χρήστη']; εάν ($ stmt = $ mysqli-> προετοιμάσει ("ΕΠΙΛΟΓΗ κωδικού πρόσβασης από tbl_users WHERE name =?")) {// Συνδέστε μια μεταβλητή στην παράμετρο ως συμβολοσειρά. $ stmt-> bind_param ("s", $ name); // Εκτέλεση της δήλωσης. $ stmt-> εκτέλεση (); // Λάβετε τις μεταβλητές από το ερώτημα. $ stmt-> bind_result ($ pass); // Λήψη δεδομένων. $ stmt-> fetch (); // Εμφάνιση δεδομένων. printf ("Ο κωδικός πρόσβασης για τον χρήστη %s είναι %s / n", $ name, $ pass); // Κλείστε την προετοιμασμένη δήλωση. $ stmt-> κλείσιμο (); }

    Σημείωση: Η μεταβλητή $ mysqli είναι το αντικείμενο σύνδεσης mySQLi

    2542820 2
    2542820 2

    Βήμα 2. Δημιουργήστε το ερώτημα mySQLi INSERT

    Χρησιμοποιήστε τον παρακάτω κώδικα για ΕΙΣΑΓΩΓΗ δεδομένων σε έναν πίνακα χρησιμοποιώντας τις δηλώσεις προετοιμασίας mySQLi.

    $ name = $ _GET ['όνομα χρήστη']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> Prepared ("ΕΙΣΑΓΩΓΗ ΣΕ tbl_users (όνομα, κωδικός πρόσβασης) ΤΙΜΕΣ (?,?)")) {// Συνδέστε τις μεταβλητές στην παράμετρο ως συμβολοσειρές. $ stmt-> bind_param ("ss", $ name, $ password); // Εκτέλεση της δήλωσης. $ stmt-> εκτέλεση (); // Κλείστε την προετοιμασμένη δήλωση. $ stmt-> κλείσιμο (); }

    Σημείωση: Η μεταβλητή $ mysqli είναι το αντικείμενο σύνδεσης mySQLi

    2542820 3
    2542820 3

    Βήμα 3. Δημιουργήστε το ερώτημα ενημέρωσης mySQLi

    Χρησιμοποιήστε τον παρακάτω κώδικα για ΕΝΗΜΕΡΩΣΗ δεδομένων σε έναν πίνακα χρησιμοποιώντας τις δηλώσεις προετοιμασίας mySQLi.

    $ name = $ _GET ['όνομα χρήστη']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> προετοιμάσει ("ΕΝΗΜΕΡΩΣΗ tbl_users SET password =? WHERE name =?")) {// Συνδέστε τις μεταβλητές στην παράμετρο ως συμβολοσειρές. $ stmt-> bind_param ("ss", $ password, $ name); // Εκτέλεση της δήλωσης. $ stmt-> εκτέλεση (); // Κλείστε την προετοιμασμένη δήλωση. $ stmt-> κλείσιμο (); }

    Σημείωση: Η μεταβλητή $ mysqli είναι το αντικείμενο σύνδεσης mySQLi

    2542820 4
    2542820 4

    Βήμα 4. Δημιουργήστε το ερώτημα mySQLi DELETE Query

    Το παρακάτω σενάριο είναι ο τρόπος διαγραφής δεδομένων από έναν πίνακα χρησιμοποιώντας δηλώσεις προετοιμασίας mySQLi.

    $ name = $ _GET ['όνομα χρήστη']; $ password = $ _GET ['password']; εάν ($ stmt = $ mysqli-> προετοιμάσει ("ΔΙΑΓΡΑΦΗ ΑΠΟ tbl_users WHERE name =?")) {// Συνδέστε τη μεταβλητή στην παράμετρο ως συμβολοσειρά. $ stmt-> bind_param ("s", $ name); // Εκτέλεση της δήλωσης. $ stmt-> εκτέλεση (); // Κλείστε την προετοιμασμένη δήλωση. $ stmt-> κλείσιμο (); }

Συνιστάται: