Bu wikiHow, PHP -də Hazırlanmış Bəyanatları istifadə edərək SQL enjeksiyonunun qarşısını almağı öyrədir. SQL enjeksiyonu, bu gün veb tətbiqlərində ən çox yayılmış zəifliklərdən biridir. Hazırlanmış ifadələr bağlı parametrlərdən istifadə edir və dəyişənləri SQL sətirləri ilə birləşdirmir, bu da təcavüzkarın SQL bəyanatını dəyişdirməsini qeyri -mümkün edir.
Hazırlanmış ifadələr, dəyişənləri tərtib edilmiş SQL ifadəsi ilə birləşdirir, beləliklə SQL və dəyişənlər ayrıca göndərilir. Dəyişənlər daha sonra SQL ifadəsinin bir hissəsi deyil, sadəcə sətirlər kimi şərh olunur. Aşağıdakı addımlardakı metodlardan istifadə edərək, mysql_real_escape_string () kimi başqa SQL enjeksiyon filtrləmə üsullarından istifadə etməyinizə ehtiyac olmayacaq.
Addımlar
2 -dən 1 -ci hissə: SQL Enjeksiyonunu Anlamaq
Addım 1. SQL Enjeksiyonu, SQL verilənlər bazasından istifadə edən tətbiqlərdə bir növ zəiflikdir
Zəiflik, bir istifadəçi girişi SQL bəyanatında istifadə edildikdə yaranır:
$ adı = $ _GET ['istifadəçi adı']; $ query = "Şifrəni seçin FROM tbl_user WHERE name = '$ name'";
Addım 2. İstifadəçinin URL dəyişən istifadəçi adına daxil etdiyi dəyər $ name dəyişəninə veriləcək
Daha sonra istifadəçinin SQL ifadəsini redaktə etməsini mümkün edən birbaşa SQL bəyanatına yerləşdirilir.
$ name = "admin 'OR 1 = 1 -"; $ query = "Şifrəni seçin FROM tbl_user WHERE name = '$ name'";
Addım 3. Daha sonra SQL verilənlər bazası SQL ifadəsini aşağıdakı kimi alacaq:
Tbl_users -dən parol seçin WHERE name = 'admin' OR 1 = 1 - '
-
Bu etibarlı SQL -dir, lakin istifadəçi üçün bir parol qaytarmaq əvəzinə bəyanat cədvəldəki bütün şifrələri qaytaracaq tbl_user. Bu veb tətbiqlərinizdə istədiyiniz bir şey deyil.
2 -ci hissə 2: Hazırlanmış Hesabatlar yaratmaq üçün mySQLi istifadə edin
Addım 1. mySQLi SELECT Sorğusunu yaradın
MySQLi Hazırlanmış İfadələrdən istifadə edərək cədvəldən məlumat seçmək üçün aşağıdakı kodu istifadə edin.
$ adı = $ _GET ['istifadəçi adı']; if ($ stmt = $ mysqli-> hazırlamaq ("tbl_users WHERE name =?" dən parol seçin)) {// Dəyişənləri parametrə simli olaraq bağlayın. $ stmt-> bind_param ("s", $ adı); // Bəyanatı icra edin. $ stmt-> icra et (); // Dəyişənləri sorğudan əldə edin. $ stmt-> bind_result ($ pass); // Məlumatları əldə edin. $ stmt-> fetch (); // Məlumatları göstərin. printf (" %s istifadəçisi üçün parol %s / n", $ adı, $ pass); // Hazırlanmış ifadəni bağlayın. $ stmt-> yaxın (); }
Qeyd: $ mysqli dəyişəni mySQLi Bağlantı Obyektidir
Addım 2. mySQLi INSERT Sorğusunu yaradın
MySQLi Hazırlanmış Hesabatları istifadə edərək məlumatları bir cədvələ daxil etmək üçün aşağıdakı kodu istifadə edin.
$ adı = $ _GET ['istifadəçi adı']; $ parol = $ _GET ['parol']; if ($ stmt = $ mysqli-> Prepar ("INSERT INTO tbl_users (name, password) VALUES (?,?)")) {// Dəyişənləri parametrə strings kimi bağlayın. $ stmt-> bind_param ("ss", $ adı, $ parol); // Bəyanatı icra edin. $ stmt-> icra et (); // Hazırlanmış ifadəni bağlayın. $ stmt-> yaxın (); }
Qeyd: dəyişən $ mysqli mySQLi Bağlantı Obyektidir
Addım 3. mySQLi UPDATE Sorğusunu yaradın
MySQLi Hazırlanmış Hesabatları istifadə edərək cədvəldəki məlumatları YENİLƏNMƏK üçün aşağıdakı kodu istifadə edin.
$ adı = $ _GET ['istifadəçi adı']; $ parol = $ _GET ['parol']; if ($ stmt = $ mysqli-> hazırla ("UPDATE tbl_users SET password =? WHERE name =?")) {// Dəyişənləri parametrə strings kimi bağlayın. $ stmt-> bind_param ("ss", $ parol, $ adı); // Bəyanatı icra edin. $ stmt-> icra et (); // Hazırlanmış ifadəni bağlayın. $ stmt-> yaxın (); }
Qeyd: $ mysqli dəyişəni mySQLi Bağlantı Obyektidir
Addım 4. mySQLi DELETE Sorğusunu yaradın
Aşağıdakı skript, mySQLi Hazırlanmış Bəyanatları istifadə edərək cədvəldən məlumatların necə silinəcəyidir.
$ adı = $ _GET ['istifadəçi adı']; $ parol = $ _GET ['parol']; if ($ stmt = $ mysqli-> prepar ("tbl_users WHERE name =?" DELETE)) {// Dəyişəni parametrə bir simli kimi bağlayın. $ stmt-> bind_param ("s", $ adı); // Bəyanatı icra edin. $ stmt-> icra et (); // Hazırlanmış ifadəni bağlayın. $ stmt-> yaxın (); }