Πώς αποτρέπει η MySQL την ένεση sql; Αρχή και πρόληψη SQL injection

MySQLΠώς να αποτρέψετε την ένεση sql; Αρχή και πρόληψη SQL injection

MySQL και SQL injection

Εάν λάβετε τα δεδομένα που εισήγαγε ο χρήστης μέσω μιας ιστοσελίδας και τα εισαγάγετε σε έναΒάση δεδομένων MySQL, τότε ενδέχεται να υπάρχουν προβλήματα ασφάλειας με την ένεση SQL.

Αυτό το κεφάλαιο θα παρουσιάσει πώς να αποτρέψετε την ένεση SQL και να φιλτράρετε τους χαρακτήρες που εισήχθησαν στην SQL μέσω σεναρίων.

Η λεγόμενη ένεση SQL είναι να εξαπατήσει τον διακομιστή να εκτελέσει κακόβουλες εντολές SQL εισάγοντας εντολές SQL στη φόρμα ιστού για την υποβολή ή την εισαγωγή της συμβολοσειράς ερωτήματος του ονόματος τομέα ή του αιτήματος σελίδας.

Δεν πρέπει ποτέ να εμπιστευόμαστε τα δεδομένα εισόδου χρήστη, πρέπει να υποθέσουμε ότι τα δεδομένα εισόδου χρήστη δεν είναι ασφαλή και όλοι πρέπει να φιλτράρουμε τα δεδομένα εισόδου χρήστη.

Στο ακόλουθο παράδειγμα, το όνομα χρήστη που εισαγάγατε πρέπει να είναι ένας συνδυασμός γραμμάτων, αριθμών και υπογράμμισης και το όνομα χρήστη πρέπει να αποτελείται από 8 έως 20 χαρακτήρες:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

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

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Στην παραπάνω δήλωση ένεσης, δεν φιλτράραμε τη μεταβλητή $name και η δήλωση SQL που δεν χρειαζόμαστε εισάγεται στο $name, η οποία θα διαγράψει όλα τα δεδομένα στον πίνακα χρηστών.

Η mysqli_query() στην PHP δεν επιτρέπεται να εκτελεί πολλαπλές εντολές SQL, αλλά σε SQLite και PostgreSQL, πολλές δηλώσεις SQL μπορούν να εκτελεστούν ταυτόχρονα, επομένως πρέπει να επαληθεύσουμε αυστηρά τα δεδομένα αυτών των χρηστών.

Για να αποτρέψουμε την ένεση SQL, πρέπει να δώσουμε προσοχή στα ακόλουθα σημεία:

  • 1. Ποτέ μην εμπιστεύεστε τα στοιχεία του χρήστη.Ελέγξτε την είσοδο του χρήστη, μπορείτε να χρησιμοποιήσετε κανονικές εκφράσεις ή να περιορίσετε το μήκος, να μετατρέψετε μονά εισαγωγικά και διπλά "-", κ.λπ.
  • 2. Μην χρησιμοποιείτε ποτέ sql δυναμικής συναρμολόγησης, μπορείτε να χρησιμοποιήσετε παραμετροποιημένη sql ή να χρησιμοποιήσετε απευθείας αποθηκευμένες διαδικασίες για αναζήτηση δεδομένων και πρόσβαση.
  • 3. Μην χρησιμοποιείτε ποτέ συνδέσεις βάσης δεδομένων με δικαιώματα διαχειριστή, χρησιμοποιήστε ξεχωριστές συνδέσεις βάσης δεδομένων με περιορισμένα δικαιώματα για κάθε εφαρμογή.
  • 4. Μην αποθηκεύετε απευθείας εμπιστευτικές πληροφορίες, μην κρυπτογραφείτε ή κατακερματίζετε κωδικούς πρόσβασης και ευαίσθητες πληροφορίες.
  • 5. Οι πληροφορίες εξαίρεσης της εφαρμογής θα πρέπει να δίνουν όσο το δυνατόν λιγότερες συμβουλές και είναι καλύτερο να χρησιμοποιείτε προσαρμοσμένες πληροφορίες σφάλματος για την αναδίπλωση των αρχικών πληροφοριών σφάλματος
  • 6. Η μέθοδος ανίχνευσης της έγχυσης sql γενικά υιοθετεί βοηθητική软件Ή η πλατφόρμα ιστότοπου για ανίχνευση, το λογισμικό χρησιμοποιεί γενικά το εργαλείο ανίχνευσης έγχυσης sql jsky και η πλατφόρμα ιστότοπου διαθέτει το εργαλείο ανίχνευσης πλατφόρμας ασφαλείας ιστότοπου Yisi. MDCSOFT SCAN et al.Η χρήση του MDCSOFT-IPS μπορεί να αμυνθεί αποτελεσματικά από την ένεση SQL, τις επιθέσεις XSS κ.λπ.

Αποτροπή SQL Injection

Σε γλώσσες δέσμης ενεργειών όπως η Perl και η PHP, μπορείτε να διαφύγετε από τα δεδομένα που εισάγει ο χρήστης για να αποτρέψετε την ένεση SQL.

Η επέκταση MySQL για PHP παρέχει τη συνάρτηση mysqli_real_escape_string() για διαφυγή ειδικών χαρακτήρων εισαγωγής.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Ένεση σε δηλώσεις Like

Κατά την υποβολή ερωτήματος όπως, εάν ο χρήστης εισάγει τιμές με "_" και "%", αυτό θα συμβεί: ο χρήστης ήθελε αρχικά να κάνει ερώτημα "abcd_", αλλά τα αποτελέσματα του ερωτήματος περιλαμβάνουν "abcd_", "abcde" και "abcdf " Κλπ., το πρόβλημα παρουσιάζεται επίσης όταν ο χρήστης θέλει να κάνει ερώτημα "30%" (σημείωση: τριάντα τοις εκατό).

Στο σενάριο PHP μπορούμε να χρησιμοποιήσουμε τη συνάρτηση addcslashes() για να χειριστούμε την παραπάνω κατάσταση, όπως στο ακόλουθο παράδειγμα:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Η συνάρτηση addcslashes() προσθέτει μια ανάστροφη κάθετο πριν από τον καθορισμένο χαρακτήρα.

Μορφή σύνταξης:

addcslashes(string,characters)
参数περιγραφή
κορδόνιΑπαιτείται.Καθορίζει τη συμβολοσειρά προς έλεγχο.
χαρακτήρεςΠροαιρετικός.Καθορίζει τον χαρακτήρα ή το εύρος των χαρακτήρων που επηρεάζονται από την addcslashes().

Ιστολόγιο Hope Chen Weiliang ( https://www.chenweiliang.com/ ) κοινοποίησε "Πώς η MySQL αποτρέπει την ένεση sql; sql injection αρχή και πρόληψη», θα σας βοηθήσει.

Καλώς ήρθατε να μοιραστείτε τον σύνδεσμο αυτού του άρθρου:https://www.chenweiliang.com/cwl-500.html

Καλώς ήρθατε στο κανάλι Telegram του ιστολογίου του Chen Weiliang για να λαμβάνετε τις τελευταίες ενημερώσεις!

🔔 Γίνετε ο πρώτος που θα αποκτήσει τον πολύτιμο "Οδηγό χρήσης εργαλείου τεχνητής νοημοσύνης μάρκετινγκ περιεχομένου ChatGPT" στον κορυφαίο κατάλογο του καναλιού! 🌟
📚 Αυτός ο οδηγός περιέχει τεράστια αξία, 🌟Αυτή είναι μια σπάνια ευκαιρία, μην τη χάσετε! ⏰⌛💨
Κοινοποιήστε και κάντε like αν σας αρέσει!
Η κοινή χρήση και τα like σας είναι το συνεχές μας κίνητρο!

 

发表 评论

Η διεύθυνση email σας δεν θα δημοσιευθεί. 必填 项 已 用 * 标注

κύλιση στην κορυφή