Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 12749|Απάντηση: 0

[Πηγή] Το mybatis αποτρέπει την έγχυση SQL

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 16/8/2018 10:57:34 π.μ. | | |
Η έγχυση SQL είναι ένας απλός φορέας επίθεσης που εξακολουθεί να είναι πολύ κοινός σήμερα. Ο λόγος για αυτό δεν είναι άλλος από κανένα έμπλαστρο για ηλίθιους. Γιατί το λέτε αυτό, ας πάρουμε την JAVA ως παράδειγμα για να το δείξουμε:

Ας υποθέσουμε ότι υπάρχει ένας τέτοιος πίνακας στη βάση δεδομένων:


Στη συνέχεια, χρησιμοποιήστε τον πίνακα ενεργειών JDBC:


Ο παραπάνω κώδικας χρησιμοποιείται συχνά από ορισμένους προγραμματιστές. Φανταστείτε μια κατάσταση όπου η εισερχόμενη παράμετρος userId είναι "3; χρήστης πίνακα πτώσης? Η δήλωση SQL που εκτελείται είναι η εξής:


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

Όταν προγραμματίζουμε σύμφωνα με τις προδιαγραφές, η έγχυση SQL είναι ανύπαρκτη. Αυτό ισχύει επίσηςΟ πρώτος τρόπος για να αποφύγετε την έγχυση SQL: προμεταγλωττισμένες δηλώσεις, ο κωδικός έχει ως εξής:


Γιατί δεν υπάρχει SQL injection στον παραπάνω κώδικα; Επειδή χρησιμοποιείται η προμεταγλωττισμένη δήλωση, η προμεταγλωττισμένη δήλωση θα ορίσει "επιλογή ονόματος από τον χρήστη όπου id= ?" Η δήλωση μεταγλωττίζεται εκ των προτέρων, έτσι ώστε να χρειάζεται μόνο να αντικατασταθεί με τις εισερχόμενες παραμέτρους όταν εκτελείται; Τα σύμβολα κράτησης θέσης είναι μια χαρά. Για την πρώτη μη συμμορφούμενη περίπτωση, το πρόγραμμα θα γράψει μια δήλωση SQL και στη συνέχεια θα τη μεταγλωττίσει με το περιεχόμενο που πέρασε ο χρήστης, που είναι ακριβώς το πρόβλημα.

Εκτός από τη χρήση προμεταγλωττισμένων δηλώσεων, υπάρχει μια δεύτερη επιλογήΤρόποι αποφυγής SQL injection attacks: Αποθηκευμένες διαδικασίες。 Μια αποθηκευμένη διαδικασία είναι ένα σύνολο εντολών SQL που εκτελούν μια συγκεκριμένη λειτουργία, μεταγλωττισμένη και αποθηκευμένη σε μια βάση δεδομένων, και ο χρήστης μπορεί να την εκτελέσει καλώντας μια αποθηκευμένη διαδικασία και δίνοντας μια παράμετρο (εάν η αποθηκευμένη διαδικασία έχει παραμέτρους), η οποία μπορεί επίσης να αποφύγει επιθέσεις SQL injection

Η αντίστοιχη αποθηκευμένη διαδικασία στον παραπάνω κώδικα είναι η εξής:

Φυσικά, οι χρήστες μπορούν επίσης να κάνουν έλεγχο χαρακτήρων στο frontend, κάτι που είναι επίσης ένας τρόπος για να αποφευχθεί η ένεση SQL: για παράδειγμα, για την παραπάνω παράμετρο userId, ο χρήστης θα ελέγξει για ερωτηματικό και θα εμφανιστεί ένα σφάλμα.
Ωστόσο, ο πιο θεμελιώδης λόγος είναι ότι οι επιθέσεις SQL injection υπάρχουν επειδή οι εφαρμογές δεν χρησιμοποιούν τα λιγότερα προνόμια κατά την πρόσβαση σε βάσεις δεδομένων. Φαίνεται ότι όλοι χρησιμοποιούν τον λογαριασμό root για πρόσβαση στη βάση δεδομένων.

Πώς λοιπόν το MyBatis αποφεύγει τις επιθέσεις SQL injection; Ή πάρτε για παράδειγμα τον παραπάνω χρήστη του πίνακα:
Ας υποθέσουμε ότι το αρχείο αντιστοίχισης είναι:


Τα αντίστοιχα java αρχεία είναι:


Μπορείτε να δείτε ότι η παράμετρος εισόδου είναι userId τύπου String, όταν περνάμε στο userId="34; χρήστης πίνακα πτώσης? Μετά από αυτό, η έντυπη δήλωση αναφέρει:


Ανεξάρτητα από το αναγνωριστικό χρήστη που έχει εισαχθεί, η δήλωση sql του είναι ως εξής. Αυτό οφείλεται στο γεγονός ότι το mybatis χρησιμοποιεί προμεταγλωττισμένες δηλώσεις στην υποκείμενη υλοποίηση. Όταν η βάση δεδομένων εκτελεί αυτήν τη δήλωση, χρησιμοποιεί απευθείας την προμεταγλωττισμένη δήλωση και στη συνέχεια αντικαθιστά το σύμβολο κράτησης θέσης με το passing userId; Απλά πήγαινε να τρέξεις. Να αντικατασταθούν πρώτα τα σύμβολα κράτησης θέσης; Η διαδικασία της μεταγλώττισης πραγματοποιείται, επομένως δεν υπάρχει χώρος για να επιβιώσει η έγχυση SQL.

Πώς λοιπόν το MyBatis κάνει την προμεταγλώττιση SQL; Στην πραγματικότητα, η κλάση PreparedStatement χρησιμοποιείται στο κάτω μέρος του πλαισίου. Η κλάση PreparedStaement όχι μόνο αποφεύγει την έγχυση SQL, αλλά εξοικονομεί επίσης χρόνο μεταγλώττισης (N-1) όταν η ίδια δήλωση SQL εκτελείται N φορές, βελτιώνοντας έτσι την αποτελεσματικότητα.

Εάν αλλάξετε την παραπάνω δήλωση σε:

Όταν εισάγουμε userId="34; χρήστης πίνακα πτώσης? Μετά από αυτό, η έντυπη δήλωση αναφέρει:

Προς το παρόν, το mybatis δεν χρησιμοποιεί προμεταγλωττισμένες δηλώσεις, θα συρράψει πρώτα συμβολοσειρές και στη συνέχεια θα εκτελέσει μεταγλώττιση, όπως ακριβώς τίθεται σε ισχύ η έγχυση SQL.
Επομένως, όταν γράφετε προτάσεις αντιστοίχισης mybatis, προσπαθήστε να χρησιμοποιήσετε τη μορφή "#{xxx}". Εάν πρέπει να χρησιμοποιήσετε παραμέτρους όπως "${xxx}", πρέπει να τις φιλτράρετε χειροκίνητα για να αποτρέψετε επιθέσεις SQL injection.





Προηγούμενος:Ερωτηματικό C#; Χειριστής
Επόμενος:Συντομεύσεις σχολίων και κατάργησης σχολίων πολλών γραμμών στο IDEA
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com