Uji kejayaan php. Tugas ujian untuk pembangun PHP dalam tempoh percubaan. Mencipta skrip js

Ini ialah cara yang berpatutan dan selamat untuk membayar barangan dan perkhidmatan dalam talian. Tambahkan pemproses untuk sistem ini pada kedai dalam talian anda dan terima pembayaran tanpa berlengah-lengah.

Protokol Yandex.Money 3.0 yang dikemas kini membolehkan anda menggunakan jenis pembayaran yang berbeza:

  • Sebenarnya wang Yandex;
  • Kad bank;
  • Pembayaran melalui terminal;
  • Pembayaran mudah alih.
Di samping itu, prosedur untuk menyambungkan kedai yang dibuat pada platform 1C-Bitrix: Pengurusan Tapak, kepada Yanedex.Money telah dipermudahkan dengan ketara. Anda perlu meninggalkan permintaan di laman web Yandex.Money (nyatakan dalam ulasan bahawa tapak web anda berada dengan protokol versi 3.0.) dan isikan borang yang dipermudahkan (terdiri daripada 3 medan sahaja).

Untuk menyambungkan protokol Yandex.Money baharu di kedai dalam talian pada platform 1C-Bitrix, anda perlu mencipta sistem pembayaran baharu dan memilih pemproses

Semak sama ada tapak anda responsif menggunakan protokol https. Ini adalah prasyarat untuk menerima pembayaran menggunakan protokol Yanedex.Money 3.0.

Anda boleh menggunakan sijil SSL yang ditandatangani sendiri atau Mesin Maya kami, di mana semuanya telah dikonfigurasikan.

Seterusnya, tunjukkan ID Simpan di Pusat Pemprosesan Pusat, Nombor tingkap kedai di pusat pemprosesan pusat, yang mesti anda terima daripada Yandex apabila membuat perjanjian, dan Kata laluan kedai (shopPassword) daripada profil Yandex kedai.

Untuk setiap jenis pembayaran, anda perlu mencipta pemproses anda sendiri dan memilih jenis pembayaran yang diperlukan.

Untuk menguji pembayaran anda perlu meletakkan nilai "Y" dalam medan Mod percubaan. Apabila anda menyerahkan permohonan untuk menyambung ke protokol Yandex.Money 3.0, anda akan menerima pautan khas, yang menggunakan mana anda boleh menambah baki dompet anda untuk ujian dengan 1000 rubel.

Dalam tetapan modul Kedai Dalam Talian, anda boleh mentakrifkan semula laluan ke halaman dengan mesej tentang pembayaran atau ralat yang berjaya.

Semua. Persediaan selesai. Gunakan

Pelanggan yang menyambungkan versi sebelumnya Yandex.Money (1.6) tidak perlu menaik taraf kepada versi 3.0. Itu. kedua-dua versi disokong oleh kedua-dua Yandex.Money dan 1C-Bitrix: Pengurusan Tapak. TETAPI versi 1.6 tidak menambah keupayaan untuk menggunakan pembayaran selain daripada Yandex.Money. Pelanggan baharu sistem pembayaran ini disambungkan menggunakan protokol 3.0.

Dalam penghantaran produk 1C-Bitrix: Pengurusan Tapak Pemproses Yandex.Money (3.0) akan dikeluarkan dalam versi 14.0.0 modul Kedai Dalam Talian (jualan). Sebelum kemas kini ini dikeluarkan (kami mengandaikan ia akan dikeluarkan dalam alfa pada akhir bulan), pengendali boleh diminta melalui Sokongan Teknikal.

Dalam era web moden, kebanyakan laman web menjadi lebih dan lebih interaktif. Jika sebelum ini, untuk menerima data yang dikemas kini, kami perlu memuat semula keseluruhan halaman, kini teknologi telah muncul yang membolehkan kami tidak memuatkan keseluruhan halaman, tetapi hanya sebahagian yang berasingan daripadanya. Sebaliknya, ini memberikan kemudahan kepada kedua-dua pengguna dan pemilik pelayan, kerana halaman akan dimuatkan dengan lebih cepat untuk pengguna, kerana hanya bahagian halaman yang berasingan dimuatkan, dan pelayan tidak perlu menjana halaman setiap kali dan memberikannya kepada pengguna. Ciri-ciri ini mudah dilaksanakan menggunakan php dan ajax.

Hari ini kita akan melihat contoh kecil untuk lebih memahami cara konsep AJAX berfungsi. Kadang-kadang sukar bagi pemula untuk memahami cara php dan ajax berinteraksi antara satu sama lain; ramai orang mencari contoh cara mengesahkan borang dengan cepat tanpa memuatkan semula keseluruhan halaman. Saya akan menunjukkan secara ringkas kepada anda cara ini dilakukan, supaya anda boleh memahami asas dan prinsip yang akan membolehkan anda menguasai alat lain dengan lebih cepat dan menulis skrip anda sendiri pada masa hadapan.

Mari kita buat tugas kecil untuk diri kita sendiri, kita akan menyemak kehadiran alamat e-mel dalam pangkalan data tanpa memuat semula halaman menggunakan php dan ajax. Contoh ini akan menunjukkan dengan baik bagaimana kita boleh berinteraksi dengan pelayan tanpa memuatkan semula halaman dalam penyemak imbas, dan juga, ini sering digunakan untuk pelbagai jenis pengesahan borang pengguna. Dalam direktori root kami akan mencipta 3 fail bernama index.php, email.php, validate.js.

Mencipta halaman

Mari buat halaman mudah dengan satu borang yang mengandungi hanya satu medan untuk memasukkan e-mel.
Sintaks fail Index.php

Tutorial AJAX

Cara paling mudah untuk bekerja dengan AJAX ialah menyambungkan rangka kerja jQuery, iaitu apa yang saya lakukan. jQuery memberikan kami sintaks yang mudah difahami dan mudah digunakan untuk menghantar permintaan AJAX, jadi mengapa tidak mengambil kesempatan daripadanya?

Mencipta skrip js

Sintaks fail validate.js

$(dokumen).ready(function())( var email = ""; $("#email").keyup(function())( var value = $(this).val(); $.ajax(( taip: "POST", url:"email.php", data:"email="+value, success:function(msg)( if(msg == "valid")( $("#message").html( "E-mel ini boleh digunakan. E-mel ini sudah diambil."); ) ) )); )); $("#submit").klik(function())( if(email == "")( alert( "Sila, letakkan data ke semua e-mel"); )else( $.ajax(( jenis: "POST", url:"email.php", data:"add_email="+email, success:function(msg)( $ ("#message" ).html(msg); ) )); ) )); ));

Pengendali PHP

Skrip ini akan menerima permintaan POST daripada klien, memprosesnya dan mengembalikan hasilnya. AJAX membaca keputusan dan membuat keputusan berdasarkannya.
Sintaks fail Email.php

$connection = mysqli_connect("localhost","emel","emel","emel"); if(isset($_POST["emel"]) && $_POST["emel"] != "")( $emel = $_POST["emel"]; $emel = mysqli_real_escape_string($connection,$email); if (!filter_var($email, FILTER_VALIDATE_EMAIL))( echo "invalid"; )else( $sql = "PILIH id DARI e-mel DI MANA e-mel="$e-mel""; $result = mysqli_query($connection,$sql); if( mysqli_num_rows($result) == 1)( echo "invalid"; )else( echo "valid"; ) ) ) if(isset($_POST["add_email"]) && $_POST["add_email"] != "" )( $email = mysqli_real_escape_string($connection,$_POST["add_email"]); $sql = "INSERT IN TO emel(email) VALUES("$email")"; if(mysqli_query($connection,$sql))( echo Success"; )else( echo "Error"; ) )

Dalam skrip PHP kami, kod paling biasa yang memproses permintaan siaran dan mencetak teks tertentu pada halaman. Akibatnya, AJAX menghantar permintaan kepada skrip php, skrip memprosesnya dan menghasilkan hasilnya, AJAX membaca hasilnya dan menukar halaman dalam masa nyata.

AJAX menghantar permintaan POST ke skrip menggunakan sekeping kod ini:

$.ajax(( taip:"POST", url:"email.php", data:"email="+value, success:function(msg)( if(msg == "valid")( $("#message ").html("E-mel ini boleh digunakan."); email = value; )else( $("#message").html("E-mel ini sudah diambil."); ) ) ));

jenis - Jenis permintaan, POST atau GET. Dalam kes kami POST;
url - alamat skrip yang permintaan dihantar;
data - data yang dihantar dalam permintaan;
kejayaan - perkara yang perlu dilakukan hasil daripada pelaksanaan permintaan yang berjaya. Dalam kes kami, fungsi dipanggil;

Dalam skrip itu sendiri, kehadiran e-mel dalam pangkalan data disemak setiap kali watak dimasukkan ke dalam medan e-mel. Dalam skrip, bahagian $("#email").keyup(function()()); bertanggungjawab untuk memproses input. , yang menyemak tekan kekunci dalam medan dengan id = "e-mel" .
Seperti yang anda lihat, kod ini agak mudah dan tidak memerlukan kemahiran yang sangat baik untuk memahami, semuanya terikat pada pemprosesan keyup() peristiwa - tekan kekunci, klik() - klik tetikus pada elemen. Ini diikuti dengan permintaan dan respons AJAX daripada skrip. Oleh itu, menggunakan php dan ajax anda boleh mendapatkan kemungkinan yang hampir tidak terhad untuk membuat halaman interaktif.
Kod ini tidak berpura-pura berkualiti tinggi, tetapi jika anda membangunkannya, tambahkan pengesahan yang betul pada peringkat klien dan pelayan, dan perkenalkan css, maka ia boleh digunakan dalam projek anda.
Jika anda mempunyai sebarang pertanyaan, jangan teragak-agak untuk menulis komen.
Saya doakan anda hari yang baik dan jumpa anda tidak lama lagi :)

7.4K
Dalam artikel ini saya akan menerangkan membuat dan menyerahkan borang AJAX. Selepas ini, kita boleh melihat pelaksanaan animasi menggunakan animate.css, pengesahan data menggunakan JavaScript.

Pada masa menulis artikel ini, Bootstrap 3.3.5 ialah versi semasa rangka kerja. Untuk artikel ini, kami menggunakan binaan Bootstrap lalai (12 lajur). Semasa anda menyelesaikan tugasan dalam artikel ini, pastikan anda menggunakan coretan dan struktur kod terkini yang diterangkan dalam dokumentasi Bootstrap.

Struktur fail dan folder

Kami akan membuat direktori akar dan menambah fail dan folder berikut kepadanya:

Borang Bootstrap:


Kami perlu menyambungkan beberapa perpustakaan bahagian hadapan:
  • Bootstrap ;
  • jQuery.

Dengan mengambil kira perpustakaan ini, struktur fail akan kelihatan seperti ini:

Borang Bootstrap:

Mencipta Borang

Buka fail index.html anda dan salin struktur borang hubungan AJAX asas berikut ke dalamnya:

Borang hubungan menggunakan Bootstrap 3.3.4 " Hantar mesej kepada saya

Ini ialah templat HTML asas di mana kami akan menambah kandungan borang. Kami telah memasukkan semua fail CSS dan JavaScript yang diperlukan. Ambil perhatian bahawa untuk contoh khusus ini kita tidak memerlukan bootstrap.js.

Kami telah memasukkan teg meta port pandang untuk pertanyaan media dalam Bootstrap. JavaScript diletakkan di bahagian bawah fail supaya kod utama diproses terlebih dahulu.

Dalam teg badan kami telah memasukkan div dengan kelas col-sm-6 col-sm-offset-3 . Ini bermakna di dalam dan di atas port pandangan sm (kecil) kami ingin memaparkan lajur lebar 50% (bilangan maksimum lajur 12). Kelas col-sm-offset-3 menetapkan offset kiri kepada 25%.

Ini mencipta reka letak yang menggunakan separuh ruang yang tersedia dan berpusat secara mendatar. Selepas itu kami memasukkan h3 dan seterusnya datang pangkalan borang. Pastikan anda menggunakan ID pada borang supaya anda boleh melampirkan acara penyerahan borang JQuery AJAX kemudiannya:

Tiada kemenangan tanpa perjuangan

Nama E-mel Mesej Hantar Mesej Dihantar!

Ini adalah semua medan input dan butang yang pengguna akan berinteraksi. Div awal dengan kelas baris yang ditetapkan ialah sintaks Bootstrap klasik, yang mewakili kumpulan mendatar elemen kol. Lajur dalam Bootstrap mencipta padding atau ruang putih. Dengan mengalihkannya, anda boleh memastikan garisan itu muat sama rata ke dalam bekas.

Kami mencipta dua lajur dengan kelas col-sm-6 (50%) yang akan kami gunakan untuk memisahkan bahagian atas borang. Dalam lajur pertama col-sm-6 kami telah mencipta label dan medan untuk nama dan e-mel. Setiap daripadanya mengandungi label dengan atribut yang sepadan, jadi label itu dikaitkan dengan medan yang sepadan.

Setiap lajur ini termasuk kumpulan bentuk yang secara semantik mengumpulkan label dengan membuat padding kecil di bahagian bawah:

Tipografi

Bootstrap membolehkan anda menggunakan kelas untuk H1-H6. Ia membantu anda menggayakan elemen sebaris tanpa menambah medan tambahan atau membuat blok elemen borang hubungan super AJAX. Kami menggunakan kelas H4 untuk menggayakan label dan menjadikannya besar.

Kelas kawalan bentuk digunakan pada setiap elemen input supaya ia memenuhi keseluruhan lebar bekas (lebar 100%). Kelas ini juga menambah pelbagai gaya yang membolehkan anda mencipta elemen bentuk yang mudah dibaca (saiz besar, tepi yang jelas, dll.).

Selepas lajur ini kami memasukkan kandungan mesej. Kami membungkusnya dalam kumpulan bentuk dan menggunakan gaya yang sama seperti untuk label dan medan teks.

Seruan untuk bertindak

Mari buat butang hantar. Bootstrap mengandungi kelas untuk pelbagai butang dan keadaannya. Kami memutuskan untuk menggunakan butang "kejayaan" (btn-success), yang berwarna hijau secara lalai.

Anda juga perlu menggunakan kelas asas btn untuk menetapkan semula parameter asas butang (sempadan, padding, penjajaran teks, saiz fon). Kami telah menggunakan kelas btn-lg, yang mencipta butang besar, dan kemudian kelas tarik-kanan, yang menjadikan balut butang ke kiri.

Selepas butang, kami menyertakan div dengan ID #msgSubmit dan menggunakan kelas berikut: "h3 text-center hidden ". Kelas h3 membantu mencipta tajuk yang lebih besar, pusat teks menetapkan penjajaran teks ke tengah, dan set tersembunyi paparan: tiada dan kelihatan: hidden :

Menambah fungsi untuk menghantar data

Kami telah mencipta borang AJAX Bootstrap JQuery asas, tetapi ia tidak melakukan apa-apa lagi. Langkah seterusnya kami ialah mencipta fungsi yang mengambil input Pengguna dan menghantarnya secara tidak segerak ke PHP.

Buka fail scripts.js dan salin kod berikut ke dalamnya:

$("#contactForm").submit(function(event)( // membatalkan penyerahan data borang event.preventDefault(); submitForm(); ));

Ini ialah sekeping kod JQuery yang mendengar fungsi hantar data #contactForm (seperti yang dinyatakan sebelum ini). Sebelum fungsi ini, kami mengendalikan pembolehubah acara, yang menyimpan tindakan penyerahan borang untuk fungsi tersebut.

event.preventDeafult() menghentikan data borang daripada diserahkan apabila halaman dimuat semula tanpa memilih tindakan pada borang. Dan pada akhirnya kod ini meminta fungsi submitForm(); :

function submitForm())( // Mulakan pembolehubah dengan kandungan borang var name = $("#name").val(); var email = $("#email").val(); var message = $("#message ").val(); $.ajax(( type: "POST", url: "php/form-process.php", data: "name=" + name + "&email=" + email + "&message=" + message, success: function(text)( if (text == "berjaya")( formSuccess(); ) ) )); ) function formSuccess())( $("#msgSubmit").removeClass ("tersembunyi");)

Tiga pembolehubah yang digunakan menangkap nilai setiap medan input borang dan menyerahkannya kepada pembolehubah JavaScript untuk digunakan kemudian.

Kami memulakan objek AJAX di dalam JQuery dan menetapkan parameter untuk post , lokasi fail PHP, data yang ingin kami siarkan dan fungsi panggil balik. Data termasuk ketiga-tiga pembolehubah dengan id yang sepadan. Fungsi panggil balik dipanggil apabila objek AJAX telah berjaya menerima maklumat daripada skrip PHP. Fungsi ini mengambil teks yang dikembalikan dan menyemak sama ada ia sama dengan rentetan "kejayaan". Jika ya, maka fungsi formSuccess terakhir dijalankan.

Ia mengalih keluar kelas tersembunyi daripada #msgSubmit DIV yang kami gunakan sebelum ini, sekali gus mengeluarkan teks.

Menyambung ke fungsi Mel PHP

Sekarang anda perlu menulis skrip yang akan menerima data daripada borang AJAX, dan menghantar kandungan melalui fungsi Mel PHP. Buka fail process.php dan tambahkan kod berikut padanya:

Kita perlu menyimpan pembolehubah yang ingin kita gunakan. Daripada fungsi mel anda boleh mendapatkan tiga pembolehubah input dan memberi mereka nama yang sama dalam PHP. Pembolehubah $EmailTo ialah alamat e-mel yang boleh ditetapkan dalam skrip. $Subject ialah rentetan yang menerangkan subjek e-mel.

Badan surat dibuat secara rawak dengan penambahan tiga pembolehubah yang dicipta. Mula-mula kita menetapkan teks perihalan, sebagai contoh, "Nama:", kemudian datang pembolehubah, dan kemudian baris baharu (/n). Kami mengulangi langkah yang sama, mengikat semua data kepada pembolehubah $body.

Untuk menghantar e-mel, kami melampirkannya pada fungsi mel. Dengan memberikan nilai kepada pembolehubah $success, kami menentukan alamat e-mel yang akan dihantar e-mel, subjek e-mel, kandungan dan alamat e-mel pengirim.

Untuk memulakan proses penghantaran e-mel, anda perlu memanggilnya dalam pernyataan if. Dengan cara ini anda boleh menyemak sama ada data borang telah berjaya dihantar atau tidak. Jika fungsi Mel mengembalikan "benar", skrip mengembalikan "kejayaan", jika fungsi melemparkan ralat, "tidak sah" dikembalikan.

Keputusan ini akan dikembalikan kepada objek AJAX, dan diproses pada bahagian klien. Kelebihan AJAX ialah semuanya dilakukan secara tidak segerak pada sisi pelanggan. Ini membolehkan pengguna untuk terus berinteraksi dengan tapak semasa borang AJAX menyerahkan data:

Mari bersinar

Kami kini akan memberi tumpuan kepada menyediakan maklum balas pengguna melalui pelbagai ciri tambahan yang boleh didayakan. Khususnya, kami akan melihat maklum balas borang menggunakan pengendalian ralat, kedua-dua belah klien dan pelayan.

Kami juga menggunakan beberapa alat untuk mengesahkan borang:

  • Animate.css: ;
  • Pengesah Bootstrap.

Tambahkannya pada projek anda seperti yang kami lakukan sebelum ini dengan Bootstrap dan JQuery. Alat ini akan membantu memberikan maklum balas kepada pengguna selepas dia menyerahkan data.

Struktur projek kini sepatutnya kelihatan seperti ini:

Pengesahan Borang

Mari mulakan dengan memasang pengesah selepas memasukkan data borang hubungan PHP AJAX. Pergi ke fail scripts.js dan edit sekeping kod pertama yang memanggil fungsi SubmitForm() selepas data borang diserahkan.
Ia perlu diubah seperti berikut:

$("#contactForm").validator().on("submit", function (event) ( if (event.isDefaultPrevented()) ( // handle form error... ) else ( // semuanya baik-baik saja! acara .preventDefault(); submitForm(); ) ));

Coretan kod baharu ini menyemak untuk melihat sama ada Pengesah Bootstrap menemui masalah dan menghentikan kod daripada berjalan. Jika tidak, kami teruskan seperti biasa. Kami masih perlu mengecualikan tindakan lalai (memuat semula halaman tanpa mengisi borang) daripada skrip penyerahan data borang.

Sekarang, jika kita mengklik butang hantar borang tanpa mengisi semua medan, yang kosong akan diserlahkan dengan warna merah:


Dalam proses menambah pengesahan, kami melumpuhkan pengesahan HTML5 asli. Anda boleh menambah konteks tambahan pada pengesahan dengan memasukkan mesej ralat. Pengesah Bootstrap mempunyai ciri berguna yang membolehkan anda memaparkan mesej ralat untuk setiap medan. Untuk menambahnya, anda perlu melengkapkan penanda HTML.

Di dalam setiap kumpulan borang, di bawah medan kemasukan data, anda perlu meletakkan kod HTML berikut:

Sebagai contoh, di bawah ialah div tambahan yang ditambahkan pada medan nama dan e-mel:

Nama E-mel

Sekarang, apabila menghantar semula data borang AJAX JQuery, mesej ralat akan dipaparkan jika medan borang tidak diisi: "Sila isi medan ini. " Dengan menambahkan atribut data pada data input yang dipanggil "ralat data", anda boleh memasukkan mesej ralat tersuai.

Sebagai contoh:

Menambah Animasi Maklum Balas

Kami telah menambah fungsi untuk menunjukkan medan borang kosong. Tetapi adalah baik untuk menambah beberapa animasi tambahan pada borang dan beberapa mesej untuk memberitahu pengguna apa yang sedang berlaku. Pada masa ini, apabila data borang berjaya dihantar, mesej "Mesej Dihantar! “tetapi bagaimana dengan kesilapan?

Untuk menggunakan kod sedia ada, kami akan mengubah suai mesej kejayaan penyerahan data sedia ada. Pertama sekali, mari kita keluarkan teks “Mesej Dihantar! " daripada markup HTML dan biarkan div kosong:

Sekarang kita perlu mencipta fungsi baharu untuk mengendalikan status mesej. Tambahkan fungsi ini ke bahagian bawah fail scripts.js anda:

function submitMSG(valid, msg)( var msgClasses; if(valid)( msgClasses = "h3 text-center tada animated text-success"; ) else ( msgClasses = "h3 text-center text-bahaya"; ) $("# msgSubmit").removeClass().addClass(msgClasses).text(msg); )

Fungsi ini mengambil dua hujah. sah akan menjadi pembolehubah boolean: jika nilainya benar, mesej akan dipaparkan yang menunjukkan bahawa data telah berjaya dihantar. Jika palsu , mesej ralat akan dicetak. msg ialah mesej yang akan kami paparkan dalam blok div.

Fungsi ini menyemak sama ada kita sedang berurusan dengan mesej tentang penghantaran data yang berjaya atau mesej ralat. Ini dilakukan dengan menyemak nilai pembolehubah yang sah . Sama ada cara, ia menetapkan pembolehubah dengan kelas CSS yang sesuai (kita perlu memasukkan semula h3 dan pusat teks kerana kita akan mengalih keluarnya).

Nota: Untuk kelas mesej kejayaan kami menggunakan beberapa kelas animate.css. Apabila data borang hubungan AJAX JQuery berjaya diserahkan, animasi tada akan dimainkan.

Akhir sekali, fungsi mengalih keluar semua kelas daripada #msgSubmit (untuk mengelakkan pertindihan kelas) dan kemudian menetapkan kelas keutamaan dan menambah teks mesej pada div.

Di dalam pemulaan pengesah pada permulaan bahagian ini, kami mengemas kini kod untuk menambah panggilan ke fungsi berikut di dalam pernyataan if apabila ia menilai kepada benar:

submitMSG(false, "Adakah anda mengisi borang dengan betul?");

Sekarang, jika anda belum mengisi semua medan, anda akan menerima mesej ralat "Adakah anda mengisi borang dengan betul? »

Langkah terakhir untuk fungsi submitMSG baharu ini ialah memanggilnya apabila data borang berjaya diserahkan. Kemas kini fungsi formSuccess() seperti berikut:

$("#contactForm").reset(); submitMSG(benar, "Mesej Dihantar!")

Kami ingin menetapkan semula borang dan mengosongkan nilai apabila kami memanggil fungsi submitMSG seperti yang dinyatakan di atas dengan mesej penyerahan yang berjaya. Kini, apabila data borang berjaya diserahkan, mesej yang sepadan dengan animasi tada animate.css harus dipaparkan:

Jom goncangkan diri

Mari tambahkan animasi pepijat pada keseluruhan borang, animasi "gegar" generik sepatutnya berjaya!

Cipta fungsi baharu sejurus selepas formSuccess() dan panggilnya formError() :

function formError())( $("#contactForm").removeClass().addClass("goncang animasi").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function())( $(this).removeClass(); )) ;)

Fungsi ini menggunakan pendekatan yang diterangkan dalam halaman tunjuk cara animate.css, yang membolehkan anda menambah animasi pada elemen dan kemudian menggunakan semula ia sekali lagi.

Animasi CSS mempunyai ciri yang malang: ia tidak boleh dimainkan semula walaupun kelas dialih keluar dan ditambah semula. Fungsi ini membantu menetapkan semula kelas akhir animasi supaya anda boleh menambahkannya semula. Apabila pengguna mengklik butang "Serah" tanpa mengisi semua medan borang maklum balas AJAX, kami memainkan animasi goncang. Dan jika ia tidak mengisi semua medan lagi, anda perlu memainkan animasi ini sekali lagi.

Anda boleh memanggil fungsi formError() ini di atas fungsi submitMSG() yang kami buat untuk melaporkan ralat. Sebagai contoh, seperti ini:

formError(); submitMSG(false, "Adakah anda mengisi borang dengan betul?");

Kini, apabila pengguna cuba menyerahkan data borang tanpa mengisi semua medan, ia akan bergegar untuk memberitahunya bahawa ada sesuatu yang tidak kena.

Lagi Pengesahan

Pengesahan pihak pelanggan adalah baik, tetapi mana-mana pengguna boleh melumpuhkannya dan menyerahkan borang dengan medan kosong dengan mengedit kod dalam penyemak imbas. Ia adalah perlu untuk membuat perkhidmatan pengesahan di bahagian pelayan.

Kita perlu membuka fail process.php dan membuat perubahan yang diperlukan untuk memastikan semua medan disemak. Kami akan mencipta pembolehubah $errorMSG untuk menangkap mesej ralat dan kemudian mendayakan semakan $_POST tambahan:

Kod PHP ini menyemak sama ada medan borang AJAX kosong wujud sebelum menetapkan datanya sebagai pembolehubah yang sepadan (menggantikan pembolehubah yang ditakrifkan kod sedia ada daripada $_POST ). Jika medan kosong, kami menentukan mesej generik untuk dihantar semula kepada klien.

Sebagai tindak balas kepada panggilan AJAX asal, kami perlu menghantar mesej ralat yang akan dipaparkan dalam penyemak imbas. Untuk melakukan ini, edit pernyataan if yang kami buat sebelum ini di bahagian bawah kod PHP:

Melalui pernyataan if, kami menyemak sama ada pembolehubah $errorMSG kosong (“”), serta status fungsi Mel terbina dalam yang kami gunakan untuk pembolehubah $success. Dalam keadaan lain, kami telah menyertakan semakan tambahan untuk melihat sama ada ralat itu adalah hasil daripada kegagalan $success. Jika ya, maka kami menghantar semula mesej "Sesuatu telah berlaku: ". Jika tidak, kami memaparkan mesej yang telah disusun apabila kami menyemak medan kosong.

Dan langkah terakhir ialah menerima mesej baharu dalam AJAX dan memaparkannya dalam borang. Kita perlu mengemas kini objek AJAX dalam fail scripts.js seperti ini:

$.ajax(( jenis: "POST", url: "php/form-process.php", data: "name=" + name + "&email=" + email + "&message=" + message, success: function( teks)( jika (teks == "kejayaan")( formSuccess(); ) else ( formError(); submitMSG(false,text); ) ) ));

Kami baru sahaja mengemas kini syarat else, yang menyemak teks == kejayaan . Dalam lain kita memanggil fungsi formError(), yang menggunakan animasi goncang dan meminta fungsi submitMSG() untuk teks yang dikembalikan daripada PHP.

Kesimpulan

Pergi ke Github untuk melihat keseluruhan kod. Sekarang borang maklum balas PHP AJAX menyediakan pengguna dengan maklumat tentang medan yang tidak diisinya. Kami mengeluarkan mesej kontekstual berdasarkan status dan mesej yang dikembalikan daripada PHP. Kami juga melaksanakan tahap tambahan pengesahan sisi pelayan untuk pengguna yang cuba memintas pengesahan bahagian hadapan.

Saya harap anda menikmati artikel ini. Sila tinggalkan soalan dan maklum balas anda dalam komen.

Penerbitan ini ialah terjemahan artikel "Membina Borang Hubungan Bootstrap Menggunakan PHP dan AJAX", yang disediakan oleh pasukan projek yang mesra


Dalam senarai sepuluh jenis serangan yang paling biasa menurut OWASP, dua tempat pertama diduduki oleh suntikan kod dan serangan XSS (skrip merentas tapak). Mereka berjalan seiring kerana XSS, seperti beberapa jenis serangan lain, bergantung pada kejayaan serangan suntikan. Nama ini menyembunyikan keseluruhan kelas serangan di mana data disuntik ke dalam aplikasi web untuk memaksanya melaksanakan atau mentafsir kod berniat jahat mengikut cara yang diingini oleh penyerang. Serangan ini termasuk, sebagai contoh, XSS, suntikan SQL, suntikan pengepala, suntikan kod dan Pendedahan Laluan Penuh. Dan ini hanya sebahagian kecil.


Serangan suntikan adalah kisah seram untuk semua pengaturcara. Mereka adalah yang paling biasa dan berjaya kerana kepelbagaian, skala dan (kadangkala) kesukaran untuk melindungi daripadanya. Semua aplikasi perlu mendapatkan data dari suatu tempat. XSS dan Redress UI adalah perkara biasa, jadi saya menumpukan bab berasingan kepada mereka dan memisahkannya daripada kelas umum.


OWASP menawarkan takrifan serangan suntikan berikut:


Peluang suntikan - seperti SQL, OS dan LDAP - berlaku apabila penterjemah menerima data yang tidak dipercayai sebagai sebahagian daripada permintaan arahan. Data berniat jahat boleh menipu jurubahasa untuk melaksanakan arahan tertentu atau mengakses data yang tidak dibenarkan.

Suntikan SQL

Suntikan SQL adalah bentuk serangan suntikan yang paling biasa dan sangat berbahaya. Sukar untuk menilai terlalu tinggi keseriusan ancaman ini, jadi amat penting untuk memahami perkara yang mempengaruhi kejayaan serangan dan cara melindungi daripadanya.


Jadi, data disuntik ke dalam aplikasi web dan kemudian digunakan dalam pertanyaan SQL. Mereka biasanya datang daripada sumber input yang tidak dipercayai, seperti borang web. Walau bagaimanapun, suntikan juga boleh dilakukan dari tempat lain, katakan dari pangkalan data itu sendiri. Pengaturcara sering percaya pada keselamatan lengkap pangkalan data mereka, tidak menyedari bahawa jika ia selamat dalam satu kes, ini tidak bermakna sama sekali ia akan selamat pada masa hadapan. Data daripada pangkalan data harus dianggap tidak boleh dipercayai sehingga dibuktikan sebaliknya, iaitu sehingga ia telah disahkan.


Jika serangan itu berjaya, penyerang boleh memanipulasi pertanyaan SQL supaya ia menjalankan operasi pada pangkalan data yang tidak dimaksudkan oleh pembangun.


Lihat pertanyaan ini:


$db = mysqli baharu("localhost", "nama pengguna", "kata laluan", "storedb"); $result = $db->query("SELECT * FROM transactions WHERE user_id = " . $_POST["user_id"]);

Terdapat beberapa jambs di sini. Pertama, kami tidak menyemak kandungan data POST untuk memastikan bahawa user_id adalah betul. Kedua, kami membenarkan sumber yang tidak dipercayai untuk memberitahu kami user_id mana yang hendak digunakan: penyerang boleh menyelinap masuk ke mana-mana user_id yang sah. Ia mungkin terkandung dalam medan tersembunyi pada borang yang kami fikir selamat kerana ia tidak boleh diedit (sambil terlupa bahawa penyerang boleh memasukkan apa sahaja data yang mereka mahu). Ketiga, kami tidak melarikan diri dari user_id dan tidak menyerahkannya kepada permintaan sebagai parameter terikat, yang juga membenarkan penyerang menyuntik rentetan sewenang-wenang yang akan memanipulasi pertanyaan SQL, memandangkan kami tidak dapat menyemaknya sejak awal. .


Tiga peninggalan ini sangat biasa dalam aplikasi web.


Mengenai kepercayaan pangkalan data, bayangkan kami mencari transaksi menggunakan medan nama_pengguna. Nama adalah luas dalam skop dan mungkin mengandungi tanda petikan. Katakan penyerang menyimpan nilai rentetan yang disuntik dalam salah satu nama pengguna. Apabila kami menggunakan nilai ini sekali lagi dalam salah satu pertanyaan berikut, ia akan memanipulasi rentetan pertanyaan, kerana kami menganggap pangkalan data sebagai sumber yang boleh dipercayai dan tidak mengasingkan atau mengehadkan pertanyaan yang terjejas.


Juga beri perhatian kepada faktor lain pelaksanaan SQL: storan berterusan tidak semestinya perlu disimpan pada pelayan. HTML 5 menyokong penggunaan pangkalan data sebelah klien, di mana anda boleh menghantar pertanyaan menggunakan SQL dan JavaScript. Terdapat dua API untuk ini: WebSQL dan IndexedDB. Pada tahun 2010, W3C tidak mengesyorkan memilih WebSQL; ia disokong oleh pelayar WebKit menggunakan SQLite sebagai backend. Kemungkinan besar, sokongan akan kekal demi keserasian ke belakang, walaupun walaupun terdapat cadangan W3C. Seperti namanya, API ini menerima pertanyaan SQL, yang bermaksud ia boleh menjadi sasaran untuk serangan suntikan. IndexedDB ialah alternatif yang lebih baharu, pangkalan data NoSQL (tidak memerlukan penggunaan pertanyaan SQL).

Contoh suntikan SQL

Memanipulasi pertanyaan SQL boleh mempunyai matlamat berikut:

  • Kebocoran data.
  • Pendedahan maklumat yang disimpan.
  • Manipulasi maklumat yang disimpan.
  • Pintasan kebenaran.
  • Suntikan SQL sisi pelanggan.
  • Perlindungan suntikan SQL

    Perlindungan terhadap suntikan SQL adalah berdasarkan prinsip echeloning. Sebelum menggunakan data dalam pertanyaan, anda mesti menyemak sama ada bentuknya adalah betul. Ia juga perlu untuk mengasingkan data sebelum memasukkannya dalam permintaan atau memasukkannya sebagai parameter peralihan.

    Peperiksaan

    Saya terus mengulanginya: semua data yang tidak dibuat secara eksplisit dalam kod sumber PHP permintaan semasa adalah tidak boleh dipercayai. Semak mereka dengan ketat dan tolak apa-apa yang tidak lulus cek. Jangan cuba "membetulkan" data; hanya perubahan kecil, kosmetik pada format boleh dibuat.


    Kesilapan biasa termasuk mengesahkan data untuk penggunaan berterusan yang berterusan (seperti paparan atau pengiraan) dan tidak mengesahkan medan dalam pangkalan data di mana maklumat akan disimpan sebagai hasilnya.

    Perisai

    Menggunakan sambungan mysqli, anda boleh mengasingkan semua data yang disertakan dalam pertanyaan SQL. Fungsi mysqli_real_escape_string() melakukan ini. Sambungan pgsql untuk PostgresSQL menawarkan fungsi pg_escape_bytea() , pg_escape_identifier() , pg_escape_literal() dan pg_escape_string(). Sambungan mssql (Microsoft SQL Server) tidak mempunyai fungsi pengasingan, dan pendekatan addslashes() adalah tidak cekap - anda memerlukan fungsi tersuai.


    Untuk menjadikan hidup anda lebih sukar, saya akan mengatakan bahawa anda tidak berhak untuk membuat kesilapan apabila mengasingkan data yang dimasukkan ke dalam permintaan. Satu kehilangan dan anda terdedah kepada serangan.


    rumuskan. Perisai bukanlah pilihan perlindungan terbaik. Ia harus digunakan sebagai pilihan terakhir. Ia mungkin diperlukan jika perpustakaan pangkalan data yang anda gunakan untuk abstraksi membolehkan anda mengkonfigurasi pertanyaan SQL kosong atau bahagian pertanyaan tanpa memaksa parameter terikat. Dalam kes lain, adalah lebih baik untuk mengelakkan pengasingan sama sekali. Pendekatan ini adalah kompleks, terdedah kepada ralat, dan berbeza-beza bergantung pada sambungan pangkalan data.

    Pertanyaan berparameter (ungkapan yang disediakan)

    Parameterisasi, atau pengikatan parameter, ialah cara yang disyorkan untuk membuat pertanyaan SQL. Semua perpustakaan pangkalan data yang baik menggunakannya secara lalai. Berikut ialah contoh menggunakan sambungan PDO untuk PHP:


    if(ctype_digit($_POST["id"]) && is_int($_POST["id"])) ( $validatedId = $_POST["id"]; $pdo = new PDO("mysql:store.db") ; $stmt = $pdo->prepare("SELECT * FROM transactions WHERE user_id = :id"); $stmt->bindParam(":id", $validatedId, PDO::PARAM_INT); $stmt->execute() ; ) else ( // tolak nilai id dan maklumkan kepada pengguna tentang ralat itu )

    Kaedah bindParam(), tersedia untuk ungkapan PDO, membenarkan parameter terikat pada "tempat letak" yang disediakan dalam ungkapan yang disediakan sebelum ini. Kaedah ini menerima parameter jenis data asas, seperti PDO::PARAM_INT , PDO::PARAM_BOOL , PDO::PARAM_LOB dan PDO::PARAM_STR . Ini ialah lalai untuk PDO::PARAM_STR melainkan dinyatakan sebaliknya, jadi ingat untuk nilai lain juga!


    Tidak seperti pengasingan manual, pengikatan parameter (atau apa sahaja kaedah yang digunakan pustaka pangkalan data anda) akan mengasingkan data terikat secara automatik supaya anda tidak perlu mengingati fungsi yang hendak digunakan. Selain itu, pengikatan parameter yang konsisten adalah lebih dipercayai daripada cuba mengingati bahawa anda perlu mengasingkan semuanya secara manual.

    Pelaksanaan prinsip keistimewaan terkecil

    Menamatkan suntikan SQL yang berjaya adalah sama pentingnya dengan menghalangnya sepenuhnya. Apabila penyerang mendapat keupayaan untuk melaksanakan pertanyaan SQL, dia akan melakukannya sebagai pengguna pangkalan data tertentu. Prinsip keistimewaan terkecil boleh memastikan bahawa semua pengguna hanya mempunyai keistimewaan yang sangat diperlukan untuk melaksanakan tugas mereka.


    Jika pengguna mempunyai keistimewaan yang tinggi, penyerang boleh menjatuhkan jadual dan menukar keistimewaan pengguna lain dengan melakukan suntikan SQL baharu bagi pihak mereka. Untuk mengelakkan perkara ini berlaku, jangan sekali-kali mengakses pangkalan data daripada aplikasi web sebagai akar, pentadbir atau pengguna lain yang mempunyai keistimewaan tinggi.


    Satu lagi aplikasi prinsip tersebut ialah pengasingan peranan membaca dan menulis data ke pangkalan data. Pilih satu pengguna dengan kebenaran tulis sahaja dan satu lagi dengan kebenaran baca sahaja. Jika serangan ditujukan kepada pengguna "membaca", maka penyerang tidak akan dapat memanipulasi data dalam jadual atau menulisnya. Anda boleh mengehadkan akses dengan lebih sempit lagi, dengan itu mengurangkan kesan serangan suntikan SQL yang berjaya.


    Banyak aplikasi web, terutamanya yang sumber terbuka, direka untuk menggunakan hanya satu pengguna pangkalan data, yang tahap keistimewaannya hampir pasti tidak pernah diperiksa. Jadi jangan lupa tentang perkara ini dan jangan cuba menjalankan aplikasi di bawah akaun pentadbir.

    Suntikan Kod (dikenali sebagai Kemasukan Fail Jauh)

    Suntikan kod ialah sebarang teknik yang membenarkan penyerang menambah kod sumber pada aplikasi web dengan keupayaan untuk mentafsir dan melaksanakannya. Dalam kes ini, kita tidak bercakap tentang memperkenalkan kod ke bahagian klien, contohnya dalam JavaScript, serangan XSS sudah digunakan di sini.


    Anda boleh menyuntik kod sumber terus daripada sumber input yang tidak dipercayai atau memaksa aplikasi web memuatkannya daripada sistem fail setempat atau sumber luaran seperti URL. Apabila kod disuntik sebagai hasil kemasukan sumber luaran, ia biasanya dirujuk sebagai kemasukan fail jauh (RFI), walaupun RFI sendiri sentiasa bertujuan untuk menyuntik kod.


    Sebab utama untuk memperkenalkan kod:

    • memintas pemeriksaan data input,
    • suntikan input yang tidak dipercayai ke dalam mana-mana konteks di mana ia akan dianggap sebagai kod PHP,
    • menggodam keselamatan repositori kod sumber,
    • lumpuhkan amaran tentang memuatkan perpustakaan pihak ketiga,
    • mengkonfigurasi semula pelayan supaya ia menghantar fail bukan PHP kepada penterjemah PHP.

    Beri perhatian khusus kepada perkara terakhir: dalam kes ini, pengguna yang tidak dipercayai boleh memuat naik sebarang fail ke pelayan.

    Contoh suntikan kod

    PHP mempunyai banyak sasaran suntikan kod, jadi serangan jenis ini mendahului senarai tontonan pengaturcara.

    Termasuk fail

    Sasaran yang paling jelas untuk suntikan kod ialah fungsi include() , include_once() , require() , dan require_once(). Jika data input yang tidak boleh dipercayai membolehkan anda menentukan parameter laluan yang dihantar kepada fungsi ini, maka anda boleh mengawal dari jauh fail yang hendak disertakan. Perlu diingatkan bahawa fail yang disertakan tidak semestinya fail PHP sebenar; sebarang format fail yang mampu menyimpan data teks boleh digunakan (iaitu, hampir tanpa sekatan).


    Parameter laluan juga mungkin terdedah kepada Direktori Traversal atau serangan kemasukan fail jauh. Menggunakan gabungan aksara ../ atau... dalam laluan membolehkan penyerang menavigasi ke hampir mana-mana fail yang boleh diakses oleh proses PHP. Pada masa yang sama, dalam konfigurasi PHP lalai, fungsi di atas menerima URL melainkan allow_url_include dinyahdayakan.

    Peperiksaan

    Fungsi PHP eval() menerima baris kod PHP untuk pelaksanaan.

    Melaksanakan Ungkapan Biasa

    Fungsi PCRE (Perl Compatible Regular Expression) preg_replace() dalam PHP membenarkan penggunaan e modifier (PREG_REPLACE_EVAL). Ini bermakna rentetan gantian, yang selepas penggantian akan dianggap kod PHP. Dan jika terdapat input yang tidak dipercayai dalam baris itu, maka mereka akan dapat menyuntik kod PHP boleh laku.

    Logik pemasukan fail yang rosak

    Aplikasi web, mengikut definisi, termasuk fail yang diperlukan untuk melayani sebarang permintaan. Jika anda mengambil kesempatan daripada kecacatan dalam logik penghalaan, pengurusan pergantungan, pemuatan automatik dan proses lain, maka memanipulasi laluan permintaan atau parameternya akan memaksa pelayan memasukkan fail setempat tertentu. Memandangkan aplikasi web tidak direka bentuk untuk mengendalikan manipulasi sedemikian, akibatnya mungkin tidak dapat diramalkan. Sebagai contoh, aplikasi secara tidak sengaja akan mendedahkan laluan yang hanya bertujuan untuk digunakan pada baris arahan. Atau ia akan mendedahkan kelas lain yang pembinanya melaksanakan tugas (lebih baik tidak mereka bentuk kelas dengan cara ini, tetapi ini masih berlaku). Mana-mana senario ini boleh mengganggu operasi bahagian belakang aplikasi, membenarkan manipulasi data atau serangan DOS pada operasi intensif sumber yang tidak melibatkan akses langsung.

    Cabaran Suntikan Kod

    Julat tugas adalah sangat luas, kerana jenis serangan ini membolehkan anda melaksanakan sebarang kod PHP pilihan penyerang.

    Pertahanan terhadap Suntikan KodSuntikan PerintahContoh Suntikan PerintahPertahanan terhadap Suntikan PerintahSuntikan Log (dikenali sebagai Suntikan Fail Log)

    Banyak aplikasi mengumpul log, dan pengguna yang diberi kuasa sering melihatnya melalui antara muka HTML. Oleh itu, log adalah salah satu sasaran utama penyerang yang ingin menyamarkan serangan lain, menipu mereka yang melihat log, dan kemudian juga menyerang pengguna aplikasi pemantauan yang log dibaca dan dianalisis.


    Kerentanan log bergantung pada mekanisme kawalan ke atas rakaman log, serta pada merawat data log sebagai sumber yang tidak boleh dipercayai apabila melihat dan menganalisis log.


    Sistem pengelogan mudah boleh menulis rentetan teks ke fail menggunakan file_put_contents() . Sebagai contoh, seorang pengaturcara merekodkan percubaan kebenaran yang gagal sebagai rentetan format berikut:


    sprintf("Percubaan log masuk gagal oleh %s", $nama pengguna);

    Bagaimana jika penyerang menggunakan nama "AdminnSuccessful login by Adminn" pada borang?


    Jika baris ini dimasukkan ke dalam log daripada data input yang tidak dipercayai, maka penyerang akan berjaya menyamarkan percubaan kebenaran yang gagal menggunakan kegagalan yang tidak bersalah untuk memasukkan kata laluan pentadbir. Kecurigaan data akan lebih dikurangkan jika anda menambah percubaan kebenaran yang berjaya.


    Intinya di sini ialah penyerang dapat menambah semua jenis entri pada log. Anda juga boleh menyuntik vektor XSS dan juga aksara yang membuat entri log sukar dibaca dalam konsol.

    Log tugas suntikan

    Salah satu matlamat pelaksanaan ialah penterjemah format log. Jika alat analisis menggunakan ungkapan biasa untuk menghuraikan entri log untuk memisahkannya ke dalam medan yang berbeza, maka adalah mungkin untuk mencipta dan menyuntik rentetan yang menyebabkan ungkapan biasa memilih medan yang disuntik dan bukannya yang betul. Sebagai contoh, entri ini boleh menyebabkan beberapa masalah:


    $username = "iamnothacker! at Mon Jan 01 00:00:00 +1000 2009"; sprintf("Percubaan log masuk gagal oleh %s pada %s", $nama pengguna,)

    Serangan suntikan log yang lebih canggih bergantung pada serangan traversal direktori untuk memaparkan log dalam penyemak imbas. Di bawah keadaan yang betul, menyuntik kod PHP ke dalam mesej log dan membuka fail log dalam penyemak imbas akan menghasilkan suntikan kod yang berjaya yang diformat dan dilaksanakan dengan kemas atas permintaan penyerang. Dan jika ia datang untuk melaksanakan PHP berniat jahat pada pelayan, maka kita hanya boleh berharap untuk keberkesanan lapisan pertahanan, yang boleh mengurangkan kerosakan.

    Perlindungan suntikan log

    Cara paling mudah untuk menapis semua mesej log luaran ialah menggunakan senarai putih. Katakan kita mengehadkan set aksara kepada nombor, huruf dan ruang sahaja. Mesej yang mengandungi aksara yang tidak dibenarkan dianggap rosak. Kemudian entri muncul dalam log tentang kemungkinan percubaan untuk menyuntik fail log. Ini ialah kaedah keselamatan mudah untuk log teks ringkas di mana mesej tidak boleh dielakkan daripada memasukkan data input yang tidak dipercayai.


    Kaedah perlindungan kedua ialah menukar sebahagian daripada data input yang tidak dipercayai menggunakan sistem seperti base64, yang menyokong set aksara terhad sambil masih membenarkan pelbagai maklumat disimpan dalam bentuk teks.

    Laluan Traversal (dikenali sebagai Direktori Traversal)

    Serangan lintasan laluan ialah percubaan untuk menjejaskan operasi membaca atau menulis fail pada bahagian belakang aplikasi web. Ini dilakukan dengan memperkenalkan parameter yang membolehkan anda memanipulasi laluan fail yang terlibat dalam operasi bahagian belakang. Jadi jenis serangan ini memudahkan Pendedahan Maklumat dan suntikan fail setempat/jauh.


    Kami akan mempertimbangkan serangan sedemikian secara berasingan, tetapi asas kejayaan mereka adalah laluan traversal dengan tepat. Memandangkan fungsi yang diterangkan di bawah adalah khusus untuk memanipulasi laluan fail, masuk akal untuk menyebut bahawa banyak fungsi PHP tidak menerima laluan fail dalam erti kata biasa. Sebaliknya, fungsi seperti include() atau file() menerima URI.


    Ia kelihatan sama sekali tidak semulajadi. Tetapi ini bermakna dua panggilan fungsi berikut adalah setara, yang menggunakan laluan mutlak (contohnya, tanpa bergantung pada laluan relatif pemuatan automatik).


    include('/var/www/vendor/library/Class.php'); include('file:///var/www/vendor/library/Class.php');

    Masalahnya ialah laluan relatif diproses di sebelah (tetapan include_path dalam php.ini dan pemuat automatik yang tersedia). Dalam kes sedemikian, fungsi PHP sangat terdedah kepada pelbagai bentuk manipulasi parameter, termasuk Penggantian Skim URI Fail, di mana penyerang boleh menyuntik URI HTTP atau FTP jika data tidak dipercayai dibenamkan pada permulaan laluan fail. Kami akan membincangkan perkara ini dengan lebih terperinci dalam bahagian mengenai serangan kemasukan fail jauh, tetapi buat masa ini kami akan memberi tumpuan kepada memintas laluan sistem fail.


    Kerentanan ini melibatkan menukar laluan untuk mengakses fail lain. Ini biasanya dicapai dengan menyuntik satu siri ../ jujukan ke dalam hujah, yang kemudiannya dilampirkan pada fungsi atau dimasukkan sepenuhnya ke dalam fungsi seperti include() , require() , file_get_contents() dan malah kurang mencurigakan (kepada sesetengah) fungsi seperti DOMDocument: :load() .


    Menggunakan urutan ../, penyerang memaksa sistem untuk kembali ke direktori induk. Jadi laluan /var/www/public/../vendor sebenarnya pergi ke /var/www/vendor . Urutan ../ selepas /public membawa kita kembali ke direktori induk, iaitu /var/www. Ini membolehkan penyerang mendapat akses kepada fail yang terletak di luar direktori /public yang boleh diakses daripada pelayan web.


    Sudah tentu, melalui laluan tidak terhad kepada hanya kembali. Anda boleh melaksanakan elemen laluan baharu untuk mendapatkan akses kepada direktori anak yang tidak boleh diakses daripada penyemak imbas kerana tetapan sekatan dalam .htaccess. Operasi sistem fail PHP tidak mengambil berat tentang konfigurasi kawalan capaian bagi fail dan direktori bukan awam pada pelayan web.

    Contoh Path TraversalDefenses terhadap Path TraversalXML Injection

    Walaupun pengenalan JSON sebagai cara ringan untuk memindahkan data antara pelayan dan klien, XML kekal sebagai alternatif yang popular dan API perkhidmatan web sering menyokongnya selari dengan JSON. XML juga digunakan untuk menukar data menggunakan skema XML: RSS, Atom, SOAP dan RDF, dsb.


    XML ada di mana-mana: ia boleh didapati dalam pelayan aplikasi web, penyemak imbas (sebagai format pilihan untuk permintaan dan respons XMLHttpRequest), dan sambungan penyemak imbas. Memandangkan kelaziman dan pemprosesan lalainya oleh penghurai popular seperti libxml2, digunakan oleh PHP dalam DOM dan dalam sambungan SimpleXML dan XMLReader, XML telah menjadi sasaran untuk serangan suntikan. Apabila penyemak imbas secara aktif mengambil bahagian dalam pertukaran XML, ia mesti diambil kira bahawa melalui XSS, pengguna yang dibenarkan boleh menghantar permintaan XML yang sebenarnya dibuat oleh penyerang.

    Pembenaman Entiti Luar XML (XXE)

    Serangan ini wujud kerana perpustakaan penghuraian XML sering menyokong penggunaan rujukan entiti tersuai. Anda akan belajar tentang penyiapan entiti XML standard, yang digunakan untuk mewakili aksara penanda khas seperti > , < ; dan '. XML membolehkan anda mengembangkan set entiti standard dengan mentakrifkan entiti tersuai melalui dokumen XML itu sendiri. Mereka boleh ditakrifkan dengan memasukkannya secara langsung dalam DOCTYPE pilihan. Nilai lanjutan yang mereka wakili mungkin merujuk kepada sumber luaran yang harus disertakan. Serangan XXE menjadi popular dengan tepat kerana keupayaan XML biasa untuk menyimpan pautan tersuai yang boleh dikembangkan kerana kandungan sumber luaran. Dalam keadaan biasa, input yang tidak dipercayai tidak boleh berinteraksi dengan sistem kami dengan cara yang tidak dijangka. Dan kebanyakan pengaturcara XXE hampir pasti tidak meramalkan serangan XXE, yang menjadi kebimbangan khusus.


    Mari, sebagai contoh, tentukan entiti tersuai baharu yang tidak berbahaya:



    Dokumen XML dengan definisi ini kini boleh merujuk entiti di mana-mana entiti biasanya dibenarkan:


    Keputusan ini ialah

    Apabila penghurai XML seperti PHP DOM mentafsir XML ini, ia akan memproses entiti tersuai ini sebaik sahaja dokumen dimuatkan. Oleh itu, apabila meminta teks yang sepadan, ia akan mengembalikan perkara berikut:


    Keputusan ini tidak berbahaya sama sekali


    Jelas sekali, entiti tersuai mempunyai kelebihan untuk mewakili teks berulang dan XML dengan nama entiti yang lebih pendek. Selalunya XML mesti mengikut tatabahasa tertentu dan entiti tersuai memudahkan penyuntingan. Walau bagaimanapun, memandangkan ketidakpercayaan kami terhadap input luaran, kami perlu berhati-hati dengan mana-mana XML yang digunakan oleh aplikasi kami. Sebagai contoh, ini bukan jenis yang selamat sama sekali:


    &harmless;

    Bergantung pada kandungan fail tempatan yang diminta, data boleh digunakan semasa mengembangkan entiti. Dan kemudian kandungan yang diperluaskan boleh diekstrak daripada penghurai XML dan dimasukkan ke dalam data keluar aplikasi web untuk analisis oleh penyerang. Sebagai contoh, untuk mendedahkan maklumat. Fail yang diekstrak akan ditafsirkan sebagai XML, walaupun tiada aksara khas untuk mencetuskan tafsiran ini. Ini mengehadkan sejauh mana kandungan fail tempatan boleh didedahkan. Jika fail ditafsirkan sebagai XML, tetapi tidak mengandungi XML yang sah, kemungkinan besar kami akan menerima ralat, yang akan menghalang kandungan daripada didedahkan. Walau bagaimanapun, PHP mempunyai helah kemas yang tersedia untuk memintas had skop supaya permintaan HTTP jauh menjejaskan aplikasi web walaupun respons yang dikembalikan tidak boleh dihantar kembali kepada penyerang.


    Terdapat tiga kaedah yang biasa digunakan untuk menghurai dan menggunakan XML dalam PHP: PHP DOM, SimpleXML dan XMLReader. Mereka semua menggunakan sambungan libxml2 dan sokongan untuk entiti luaran didayakan secara lalai. Akibatnya, PHP terdedah kepada serangan XXE secara lalai, yang sangat mudah terlepas apabila mempertimbangkan keselamatan aplikasi web atau perpustakaan yang menggunakan XML.


    Jangan lupa juga bahawa XHTML dan HTML 5 boleh bersiri sebagai XML yang sah. Ini bermakna bahawa beberapa halaman XHTML atau HTML 5 bersiri XML boleh dihuraikan sebagai XML, menggunakan DOMDocument::loadXML() dan bukannya DOMDocument::loadHTML() . Penggunaan penghurai XML ini juga terdedah kepada suntikan entiti XML luaran. Ingat bahawa libxml2 belum mengenali HTML 5 DOCTYPE lagi, jadi ia tidak boleh mengesahkannya sebagai XHTML DOCTYPES.

    Contoh pelaksanaan entiti XML luaran Kandungan Fail dan Pendedahan

    Kami melihat contoh pendedahan maklumat di atas, dengan menyatakan bahawa entiti XML tersuai boleh merujuk fail luaran.


    &harmless;

    Dalam kes ini, entiti tersuai akan dikembangkan dengan kandungan fail. Memandangkan semua permintaan sedemikian dilakukan secara tempatan, ini membolehkan kandungan semua fail yang boleh dibaca oleh aplikasi untuk didedahkan. Iaitu, apabila entiti lanjutan dimasukkan ke dalam data keluar aplikasi, penyerang akan dapat memeriksa fail yang tidak boleh diakses. Walau bagaimanapun, dalam kes ini terdapat had yang serius: fail mestilah sama ada dalam format XML atau dalam format yang tidak akan membawa kepada ralat penghurai XML. Tetapi intinya ialah batasan ini boleh diabaikan sepenuhnya dalam PHP:


    &harmless;

    PHP menyediakan akses kepada pembungkus sebagai URI, salah satu protokol yang diterima oleh fungsi sistem fail standard: file_get_contents(), require(), require_once(), file(), copy() dan banyak lagi. Pembalut PHP menyokong beberapa penapis yang boleh digunakan pada sumber tertentu supaya hasilnya dikembalikan dengan memanggil fungsi. Dalam contoh di atas, kami menggunakan penapis convert.base-64-encode pada fail sasaran yang ingin kami baca.


    Ini bermakna bahawa penyerang boleh membaca mana-mana fail yang tersedia untuk PHP, tanpa mengira format teks. Cukup sekadar menyahkod data yang datang daripada aplikasi, dan kemudian membedahnya tanpa sebarang hukuman. Walaupun ini tidak secara langsung membahayakan pengguna akhir atau bahagian belakang aplikasi, ia membenarkan penyerang mengkaji struktur aplikasi dengan teliti dalam usaha mencari kelemahan lain. Selain itu, risiko bahawa penyerang akan dikesan adalah minimum.

    Pintasan Kawalan Akses

    Akses dikawal dengan cara yang berbeza. Memandangkan serangan XXE dilakukan pada bahagian belakang aplikasi web, sesi pengguna semasa tidak boleh digunakan. Tetapi penyerang masih boleh memintas kawalan akses ke bahagian belakang menggunakan permintaan daripada pelayan tempatan. Pertimbangkan kawalan akses primitif ini:


    if (isset($_SERVER["HTTP_CLIENT_IP"]) || isset($_SERVER["HTTP_X_FORWARDED_FOR"]) || !in_array(@$_SERVER["REMOTE_ADDR"], array("127.0.0.1", "::1 ",))) ( header("HTTP/1.0 403 Forbidden"); exit("Anda tidak dibenarkan mengakses fail ini."); )

    Sekeping PHP ini, seperti banyak orang lain seperti itu, mengehadkan akses kepada fail PHP tertentu pada pelayan tempatan, iaitu localhost. Walau bagaimanapun, serangan XXE pada bahagian hadapan aplikasi memberikan penyerang bukti kelayakan tepat yang diperlukan untuk memintas kawalan akses ini, kerana semua permintaan HTTP kepada penghurai XML akan dibuat daripada localhost.


    &harmless;

    Walaupun paparan log terhad kepada permintaan tempatan, penyerang masih boleh mendapatkan log tersebut. Perkara yang sama berlaku untuk antara muka penyelenggaraan atau pentadbiran, akses yang terhad dengan cara ini.

    serangan DOS

    Hampir semua perkara yang menentukan penggunaan sumber pelayan boleh digunakan untuk serangan DOS. Dengan menyuntik entiti XML luaran, penyerang boleh membuat permintaan HTTP sewenang-wenangnya yang, di bawah keadaan yang betul, mengalirkan sumber pelayan.


    Kami akan bercakap kemudian tentang potensi penggunaan DOS lain bagi serangan XXE dari segi pengembangan entiti XML.

    Perlindungan terhadap suntikan entiti XML luaran

    Serangan ini sangat popular, jadi anda akan terkejut betapa mudahnya untuk bertahan menentangnya. Memandangkan DOM, SimpleXML dan XMLReader bergantung pada libxml2, anda hanya boleh menggunakan fungsi libxml_disable_entity_loader() untuk melumpuhkan penggunaan entiti luaran. Walau bagaimanapun, ini tidak akan melumpuhkan entiti tersuai yang dipratentukan dalam DOCTYPE, kerana mereka tidak menggunakan sumber luaran yang memerlukan permintaan HTTP atau operasi sistem fail.


    $oldValue = libxml_disable_entity_loader(true); $dom = new DOMDocument(); $dom->loadXML($xml); libxml_disable_entity_loader($oldValue);

    Ini mesti dilakukan untuk semua operasi yang melibatkan pemuatan XML daripada rentetan, fail atau URI jauh.


    Apabila aplikasi tidak pernah memerlukan entiti luaran, dan untuk kebanyakan permintaannya, memuatkan sumber luaran boleh dilumpuhkan sama sekali pada tahap yang lebih global. Dalam kebanyakan kes, ini adalah lebih baik untuk menentukan semua titik pemuatan XML, memandangkan banyak perpustakaan mempunyai kelemahan yang wujud kepada serangan XXE:


    libxml_disable_entity_loader(true);

    Ingatlah untuk mengembalikan TRUE selepas setiap pendayaan sementara memuatkan sumber luaran. Anda mungkin memerlukannya untuk sesuatu yang tidak berbahaya seperti menukar Docbook XML kepada HTML, di mana penggunaan gaya XSL bergantung pada entiti luaran.


    Walau bagaimanapun, fungsi melumpuhkan libxml2 bukanlah ubat mujarab. Analisis sambungan lain dan perpustakaan PHP yang menghuraikan atau memproses XML untuk mencari "suis" mereka untuk menggunakan entiti luaran.


    Jika ini tidak mungkin, kemudian semak juga sama ada dokumen XML mengisytiharkan DOCTYPE. Jika ya, dan jika entiti luaran dilumpuhkan, maka buang sahaja dokumen XML, menafikan akses XML yang tidak dipercayai kepada penghurai yang berpotensi terdedah dan logkannya sebagai kemungkinan serangan. Ini adalah langkah yang perlu kerana tidak akan ada tanda lain - tiada ralat, tiada pengecualian. Bina semakan ini ke dalam pengesahan input biasa anda. Tetapi kaedah ini jauh dari ideal, jadi sangat disyorkan untuk menyelesaikan masalah entiti luaran secara asas.


    /** * Cuba pengesanan pantas */ $collapsedXML = preg_replace("/[:space:]/", "", $xml); if(preg_match("/