Rumah Pergigian kanak-kanak Pendaftaran eksekutif php. Sistem pendaftaran pengguna yang mudah

Pendaftaran eksekutif php. Sistem pendaftaran pengguna yang mudah

Mencipta tapak berasaskan keahlian kelihatan seperti tugas yang menakutkan pada mulanya. Jika anda pernah mahu melakukan ini sendiri, kemudian hanya berputus asa apabila anda mula berfikir bagaimana anda akan menyusunnya menggunakan kemahiran PHP anda, maka artikel ini adalah untuk anda. Kami akan membimbing anda melalui setiap aspek mencipta tapak berasaskan keahlian, dengan kawasan ahli yang selamat dilindungi oleh kata laluan.

Keseluruhan proses terdiri daripada dua bahagian besar: pendaftaran pengguna dan pengesahan pengguna. Pada bahagian pertama, kita akan meliputi penciptaan borang pendaftaran dan menyimpan data dalam pangkalan data MySQL. Di bahagian kedua, kami akan mencipta borang log masuk dan menggunakannya untuk membenarkan pengguna mengakses di kawasan selamat.

Muat turun kod

Anda boleh memuat turun keseluruhan kod sumber untuk sistem pendaftaran/log masuk dari pautan di bawah:

Konfigurasi & Muat Naik
Fail ReadMe mengandungi arahan terperinci.

Buka source\include\membersite_config.php fail dalam editor teks dan kemas kini konfigurasi. (Log masuk pangkalan data, nama tapak web anda, alamat e-mel anda dll).

Muat naik keseluruhan kandungan direktori. Uji register.php dengan menghantar borang.

Borang pendaftaran

Untuk membuat akaun pengguna, kami perlu mengumpulkan jumlah maklumat minimum daripada pengguna. Kami memerlukan namanya, alamat e-melnya dan nama pengguna dan kata laluan yang dikehendakinya. Sudah tentu, kita boleh meminta lebih banyak maklumat pada ketika ini, tetapi bentuk yang panjang sentiasa dimatikan. Jadi mari kita hadkan diri kita kepada bidang tersebut sahaja.

Berikut adalah borang pendaftaran:

Daftar

Jadi, kami mempunyai medan teks untuk nama, e-mel dan kata laluan. Ambil perhatian bahawa kami menggunakan untuk kebolehgunaan yang lebih baik.

Pengesahan borang

Pada ketika ini adalah idea yang baik untuk meletakkan beberapa kod pengesahan borang, jadi kami memastikan bahawa kami mempunyai semua data yang diperlukan untuk membuat akaun pengguna. Kami perlu menyemak sama ada nama dan e-mel, dan kata laluan telah diisi dan bahawa e-mel itu dalam format yang betul.

Mengendalikan penyerahan borang

Sekarang kita perlu mengendalikan data borang yang dihantar.

Berikut ialah urutannya (lihat fail fg_membersite.php dalam sumber yang dimuat turun):

fungsi RegisterUser() ( if(!isset($_POST["diserahkan"])) ( return false; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) ( return false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( return false; ) if(!$this->SendUserConfirmationEmail($formvars)) ( return false; ) $this->SendAdminIntimationEmail($ formvars); kembalikan benar;)

Pertama, kami mengesahkan penyerahan borang. Kemudian kami mengumpul dan 'membersihkan' data penyerahan borang (sentiasa lakukan ini sebelum menghantar e-mel, menyimpan ke pangkalan data dll). Penyerahan borang kemudiannya disimpan ke jadual pangkalan data. Kami menghantar e-mel kepada pengguna yang meminta pengesahan. Kemudian kami memberitahu pentadbir bahawa pengguna telah mendaftar.

Menyimpan data dalam pangkalan data

Sekarang setelah kami mengumpulkan semua data, kami perlu menyimpannya ke dalam pangkalan data.
Berikut ialah cara kami menyimpan penyerahan borang ke pangkalan data.

fungsi SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("Log masuk pangkalan data gagal!"); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("E-mel ini sudah didaftarkan"); return false; ) if(!$this->IsFieldUnique( $formvars,"nama pengguna")) ( $this->HandleError("Nama Pengguna ini sudah digunakan. Sila cuba nama pengguna lain"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Memasukkan ke Pangkalan Data gagal!"); return false; ) return true; )

Ambil perhatian bahawa anda telah mengkonfigurasi butiran log masuk Pangkalan Data dalam fail membersite_config.php. Kebanyakan kes, anda boleh menggunakan "localhost" untuk hos pangkalan data.
Selepas log masuk, kami memastikan bahawa jadual itu sedia ada. (Jika tidak, skrip akan mencipta jadual yang diperlukan).
Kemudian kami memastikan bahawa nama pengguna dan e-mel adalah unik. Jika ia tidak unik, kami mengembalikan ralat kepada pengguna.

Struktur jadual pangkalan data

Ini adalah struktur meja. Fungsi CreateTable() dalam fail fg_membersite.php mencipta jadual. Inilah kodnya:

function CreateTable() ( $qry = "Buat Jadual $this->tablename (". "id_user INT NOT NULL AUTO_INCREMENT ," "name VARCHAR(128) NOT NULL ," "email VARCHAR(64) NOT NULL ," " "phone_number VARCHAR(16) NOT NULL ," "nama pengguna VARCHAR(16) NOT NULL ," "kata laluan VARCHAR(32) NOT NULL ," "confirmcode VARCHAR(32) ," "PRIMER KUNCI (id_user)." ")"; if( !mysql_query($qry,$this->connection)) ( $this->HandleDBError("Ralat mencipta jadual \nquery was\n $qry"); return false; ) return true; )

Medan id_user akan mengandungi id unik pengguna, dan juga merupakan kunci utama jadual. Perhatikan bahawa kami membenarkan 32 aksara untuk medan kata laluan. Kami melakukan ini kerana, sebagai langkah keselamatan tambahan, kami akan menyimpan kata laluan dalam pangkalan data yang disulitkan menggunakan MD5. Sila ambil perhatian bahawa kerana MD5 ialah kaedah penyulitan sehala, kami tidak akan dapat memulihkan kata laluan sekiranya pengguna terlupa.

Memasukkan pendaftaran ke meja

Berikut ialah kod yang kami gunakan untuk memasukkan data ke dalam pangkalan data. Kami akan menyediakan semua data kami dalam tatasusunan $formvars.

fungsi InsertIntoDB(&$formvars) ($confirmcode = $this->MakeConfirmationMd5($formvars["email"]);$insert_query = "masukkan ke dalam ".$this->nama jadual."(nama, e-mel, nama pengguna, kata laluan, confirmcode) values ​​​​("" . $this->SanitizeForSQL($formvars["name"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" . $ this->SanitizeForSQL($formvars["nama pengguna"]) . "", "" . md5($formvars["kata laluan"]) . "", "" . $confirmcode . "")";if(! mysql_query( $insert_query ,$this->connection)) ( $this->HandleDBError("Ralat semasa memasukkan data ke jadual\nquery:$insert_query"); return false; ) return true; )

Perhatikan bahawa kami menggunakan fungsi PHP md5() untuk menyulitkan kata laluan sebelum memasukkannya ke dalam pangkalan data.
Selain itu, kami membuat kod pengesahan unik daripada alamat e-mel pengguna.

Menghantar e-mel

Sekarang setelah kami mempunyai pendaftaran dalam pangkalan data kami, kami akan menghantar e-mel pengesahan kepada pengguna. Pengguna perlu mengklik pautan dalam e-mel pengesahan untuk melengkapkan proses pendaftaran.

fungsi SendUserConfirmationEmail(&$formvars) ($mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"],$formvars["name"]) ; $mailer->Subject = "Pendaftaran anda dengan ".$this->nama tapak; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["email"" ])); $confirm_url = $this->GetAbsoluteURLFolder().."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Hello ".$formvars["name"]."\r\ n\r\n". "Terima kasih atas pendaftaran anda dengan ".$this->sitename."\r\n". "Sila klik pautan di bawah untuk mengesahkan pendaftaran anda.\r\n." "$confirm_url\r \n". "\r\n". "Salam,\r\n". "Juruweb\r\n". $this->nama tapak; if(!$mailer->Send()) ($this-> HandleError("Gagal menghantar e-mel pengesahan pendaftaran."); return false; ) return true; )

Kemas kini

9hb Jan 2012
Ciri Tetapkan Semula Kata Laluan/Tukar Kata Laluan ditambah
Kod itu kini dikongsi di GitHub.

Selamat kembaliUserFullName(); ?>!

Lesen


Kod dikongsi di bawah lesen LGPL. Anda boleh menggunakannya secara bebas di tapak web komersial atau bukan komersial.

Tiada siaran berkaitan.

Komen pada entri ini ditutup.

Untuk membahagikan pelawat tapak kepada kumpulan tertentu, sistem kecil mesti dipasang di tapak pendaftaran dalam php. Dengan cara ini, anda membahagikan pelawat secara bersyarat kepada dua kumpulan pelawat rawak dan menjadi kumpulan pengguna yang lebih istimewa yang anda berikan maklumat yang lebih berharga.

Dalam kebanyakan kes, sistem pendaftaran yang lebih mudah digunakan, yang ditulis dalam php dalam satu fail daftar.php.

Jadi, kami telah menyimpang sedikit, dan sekarang kami akan melihat dengan lebih dekat pada fail pendaftaran.

Register.php fail

Untuk memastikan bahawa ini tidak mengambil banyak masa anda, kami akan mencipta sistem yang akan mengumpulkan pengguna, menerima maklumat hubungan minimum daripada mereka. Dalam kes ini, kami akan memasukkan segala-galanya ke dalam pangkalan data mysql. Untuk kelajuan tertinggi pangkalan data, kami akan mencipta jadual pengguna dalam format MyISAM dan dalam pengekodan utf-8.

Catatan! Semua skrip mesti sentiasa ditulis dalam pengekodan yang sama. Semua fail tapak dan pangkalan data MySql mestilah dalam pengekodan yang sama. Pengekodan yang paling biasa ialah UTF-8 dan Windows-1251.

Mengapa anda perlu menulis segala-galanya dalam satu pengekodan yang akan kami bincangkan kemudian. Buat masa ini, ambil maklumat ini sebagai peraturan ketat untuk mencipta skrip, jika tidak, anda akan menghadapi masalah dengan skrip pada masa hadapan. Tidak mengapa, sudah tentu, tetapi anda hanya akan kehilangan banyak masa mencari ralat dalam skrip.

Bagaimanakah skrip itu sendiri akan berfungsi?

Kami mahu memudahkan segala-galanya dan mendapatkan hasil yang cepat. Oleh itu, kami hanya akan menerima log masuk, e-mel dan kata laluan daripada pengguna. Dan untuk melindungi daripada robot spam, kami akan memasang captcha kecil. Jika tidak, beberapa budak lelaki dari London akan menulis penghurai robot kecil yang akan mengisi seluruh pangkalan data dengan pengguna palsu dalam beberapa minit, dan akan bergembira dengan kepandaian dan keterpaksaannya.

Inilah skripnya sendiri. Semuanya direkodkan dalam satu fail daftar.php:

! `; // tanda soal merah $sha=$sh."skrip/pro/"; //laluan ke folder utama $bg=` bgcolor="#E1FFEB"`; // warna latar belakang baris?> Contoh skrip pendaftaran register.php style.css" />

Dalam kes ini, skrip merujuk kepada dirinya sendiri. Dan ia adalah bentuk dan pemproses data yang dimasukkan ke dalam borang. Sila ambil perhatian bahawa fail dimampatkan sebagai arkib zip dan mengandungi fail konfigurasi config.php, longgokan pangkalan data pengguna, fail yang mengandungi fungsi tambahan functions.php, fail gaya style.css dan fail register.php itu sendiri. Terdapat juga beberapa fail yang bertanggungjawab untuk operasi dan penjanaan simbol captcha.

helo! Sekarang kami akan cuba melaksanakan pendaftaran paling mudah di laman web menggunakan PHP + MySQL. Untuk melakukan ini, Apache mesti dipasang pada komputer anda. Prinsip kerja skrip kami ditunjukkan di bawah.

1. Mari kita mulakan dengan mencipta jadual pengguna dalam pangkalan data. Ia akan mengandungi data pengguna (log masuk dan kata laluan). Mari pergi ke phpmyadmin (jika anda mencipta pangkalan data pada PC anda http://localhost/phpmyadmin/). Buat jadual pengguna, ia akan mempunyai 3 medan.

Saya menciptanya dalam pangkalan data mysql, anda boleh menciptanya dalam pangkalan data lain. Seterusnya, tetapkan nilai seperti dalam rajah:

2. Sambungan ke jadual ini diperlukan. Mari buat fail bd.php. Kandungannya:

$db = mysql_connect("pelayan MySQL anda","log masuk untuk pelayan ini", "kata laluan untuk pelayan ini");
mysql_select_db ("nama pangkalan data yang kami sambungkan", $db);
?>

Dalam kes saya ia kelihatan seperti ini:

$db = mysql_connect("localhost","pengguna","1234");
mysql_select_db("mysql",$db);
?>

Jimat bd.php.
Hebat! Kami mempunyai jadual dalam pangkalan data dan sambungan kepadanya. Kini anda boleh mula membuat halaman di mana pengguna akan meninggalkan data mereka.

3. Buat fail reg.php dengan kandungannya (semua komen di dalamnya):



Pendaftaran


Pendaftaran


















4. Buat fail, yang akan memasukkan data ke dalam pangkalan data dan menyimpan pengguna. save_user.php(komen di dalam):



{
}
//jika log masuk dan kata laluan dimasukkan, maka kami memprosesnya supaya tag dan skrip tidak berfungsi, anda tidak pernah tahu apa yang orang mungkin masukkan


//alih keluar ruang tambahan
$log masuk = trim($log masuk);
$kata laluan = trim($kata laluan);
// sambung ke pangkalan data
// semak kewujudan pengguna dengan log masuk yang sama
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
jika (!kosong ($myrow["id"])) (
exit("Maaf, log masuk yang anda masukkan sudah didaftarkan. Sila masukkan log masuk lain.");
}
// jika ini tidak berlaku, maka simpan data
$result2 = mysql_query("MASUKKAN KE DALAM pengguna (log masuk, kata laluan) NILAI("$log masuk","$kata laluan")");
// Semak jika terdapat ralat
jika ($result2=="TRUE")
{
echo "Anda telah berjaya mendaftar! Kini anda boleh memasuki tapak. Laman Utama";
}
lain (
echo "Ralat! Anda tidak berdaftar.";
}
?>

5. Kini pengguna kami boleh mendaftar! Seterusnya, anda perlu membuat "pintu" untuk pengguna yang sudah berdaftar memasuki tapak. index.php(komen di dalam):

// keseluruhan prosedur berfungsi dalam sesi. Ia adalah tempat data pengguna disimpan semasa dia berada di tapak. Adalah sangat penting untuk melancarkannya pada awal halaman!!!
session_start();
?>


Laman utama


Laman utama











Daftar



// Semak sama ada pembolehubah log masuk dan id pengguna kosong
jika (kosong($_SESSION["log masuk"]) atau kosong($_SESSION["id"]))
{
// Jika kosong, maka kami tidak memaparkan pautan
echo "Anda telah log masuk sebagai tetamu
Pautan ini hanya tersedia untuk pengguna berdaftar";
}
lain
{

Dalam fail index.php Kami akan memaparkan pautan yang akan dibuka hanya kepada pengguna berdaftar. Ini adalah titik keseluruhan skrip - untuk mengehadkan akses kepada sebarang data.

6. Masih terdapat fail dengan pengesahan log masuk dan kata laluan yang dimasukkan. testreg.php (komen di dalam):

session_start(); // keseluruhan prosedur berfungsi pada sesi. Ia adalah tempat data pengguna disimpan semasa dia berada di tapak. Adalah sangat penting untuk melancarkannya pada awal halaman!!!
if (isset($_POST["log masuk"])) ( $login = $_POST["log masuk"]; if ($log masuk == "") ( unset($log masuk);) ) //masukkan log masuk yang dimasukkan oleh pengguna ke $login pembolehubah, jika ia kosong, kemudian musnahkan pembolehubah
if (isset($_POST["kata laluan"])) ( $password=$_POST["password"]; if ($password =="") ( unset ($password);) )
//masukkan kata laluan yang dimasukkan pengguna ke dalam pembolehubah $password, jika ia kosong, kemudian musnahkan pembolehubah tersebut
if (empty($login) or empty($password)) //jika pengguna tidak memasukkan log masuk atau kata laluan, maka kami mengeluarkan ralat dan menghentikan skrip
{
exit("Anda belum memasukkan semua maklumat, kembali dan isi semua ruangan!");
}
//jika log masuk dan kata laluan dimasukkan, maka kami memprosesnya supaya tag dan skrip tidak berfungsi, anda tidak pernah tahu apa yang orang mungkin masukkan
$login = stripslashes($login);
$login = htmlspecialchars($log masuk);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//alih keluar ruang tambahan
$log masuk = trim($log masuk);
$kata laluan = trim($kata laluan);
// sambung ke pangkalan data
include("bd.php");// fail bd.php mesti berada dalam folder yang sama dengan semua yang lain, jika tidak, ubah sahaja laluan

$result = mysql_query("SELECT * FROM users WHERE login="$login"",$db); //ambil daripada pangkalan data semua data tentang pengguna dengan log masuk yang dimasukkan
$myrow = mysql_fetch_array($result);
if (kosong ($myrow["kata laluan")))
{
//jika pengguna dengan log masuk yang dimasukkan tidak wujud
}
lain (
//jika wujud, kemudian semak kata laluan
jika ($myrow["kata laluan"]==$kata laluan) (
//jika kata laluan sepadan, maka kami melancarkan sesi untuk pengguna! Anda boleh mengucapkan tahniah kepadanya, dia masuk!
$_SESSION["log masuk"]=$myrow["log masuk"];
$_SESSION["id"]=$myrow["id"];//data ini digunakan dengan kerap, jadi pengguna yang log masuk akan "membawanya bersamanya"
echo "Anda telah berjaya memasuki tapak! Halaman utama";
}
lain (
//jika kata laluan tidak sepadan

Keluar ("Maaf, log masuk atau kata laluan yang anda masukkan tidak betul.");
}
}
?>

OK semuanya sudah berakhir Sekarang! Pelajaran mungkin membosankan, tetapi sangat berguna. Hanya idea pendaftaran ditunjukkan di sini, maka anda boleh memperbaikinya: tambah perlindungan, reka bentuk, medan data, memuatkan avatar, log keluar dari akaun (untuk melakukan ini, hanya memusnahkan pembolehubah dari sesi dengan fungsi tidak ditetapkan) dan sebagainya. Semoga berjaya!

Saya menyemak semuanya, ia berfungsi dengan baik!

Hari ini kita akan melihat eksploitasi kerentanan 1 hari yang kritikal dalam CMS Joomla yang popular, yang meletup di Internet pada akhir Oktober. Kami akan bercakap tentang kelemahan dengan nombor CVE-2016-8869, CVE-2016-8870 Dan CVE-2016-9081. Ketiga-tiganya datang dari satu kod yang merana di kedalaman rangka kerja selama lima tahun yang panjang, menunggu di sayap, hanya untuk kemudian membebaskan diri dan membawa bersamanya huru-hara, tapak yang digodam dan air mata pengguna yang tidak bersalah Joomla ini. Hanya pemaju yang paling berani dan berani, yang matanya merah akibat cahaya monitor, dan papan kekuncinya dipenuhi serbuk roti, dapat mencabar roh jahat yang mengamuk dan meletakkan kepala mereka di atas mezbah pembaikan.

AMARAN

Semua maklumat disediakan untuk tujuan maklumat sahaja. Baik editor mahupun pengarang tidak bertanggungjawab terhadap sebarang kemungkinan bahaya yang disebabkan oleh bahan artikel ini.

Di mana semuanya bermula

Pada 6 Oktober 2016, Demis Palma mencipta topik di Stack Exchange di mana dia bertanya: kenapa, sebenarnya, dalam Joomla versi 3.6 terdapat dua kaedah untuk mendaftar pengguna dengan nama yang sama register()? Yang pertama adalah dalam pengawal UsersControllerRegistration dan yang kedua adalah dalam pengawal UsersControllerUser. Damis ingin tahu sama ada kaedah UsersControllerUser::register() telah digunakan di suatu tempat, atau jika ia hanyalah anakronisme evolusi yang tinggal daripada logik lama. Kebimbangannya ialah walaupun kaedah ini tidak digunakan oleh mana-mana pandangan, ia boleh dipanggil dengan pertanyaan yang dibuat. Yang mana saya menerima respons daripada pembangun dengan nama samaran itoctopus, yang mengesahkan: masalah itu benar-benar wujud. Dan menghantar laporan kepada pembangun Joomla.

Kemudian peristiwa berkembang paling pesat. Pada 18 Oktober, pembangun Joomla menerima laporan daripada Damis, yang pada masa itu telah merangka PoC yang membenarkan pendaftaran pengguna. Dia menerbitkan nota di laman webnya, di mana dia bercakap secara umum tentang masalah yang ditemuinya dan pemikirannya mengenai perkara ini. Pada hari yang sama, versi baharu Joomla 3.6.3 dikeluarkan, yang masih mengandungi kod terdedah.

Selepas ini, Davide Tampellini memutar pepijat ke tahap mendaftar bukan pengguna mudah, tetapi pentadbir. Dan pada 21 Oktober, satu kes baharu tiba kepada pasukan keselamatan Joomla. Ia sudah bercakap tentang peningkatan keistimewaan. Pada hari yang sama, pengumuman muncul di laman web Joomla bahawa pada hari Selasa, 25 Oktober, versi seterusnya dengan nombor siri 3.6.3 akan dikeluarkan, yang membetulkan kelemahan kritikal dalam kernel sistem.

25 Oktober Pasukan Strike Keselamatan Joomla menemui masalah terbaharu yang dicipta oleh sekeping kod yang ditemui oleh Damis. Kemudian komit bertarikh 21 Oktober dengan nama yang tidak mencolok Prepare 3.6.4 Stable Release ditolak ke dalam cawangan utama repositori Joomla rasmi, yang membetulkan pepijat malang itu.

Selepas ini keluar, ramai individu yang berminat menyertai komuniti pembangun - mereka mula mempromosikan kelemahan dan menyediakan eksploitasi.

Pada 27 Oktober, penyelidik Harry Roberts memuat naik eksploitasi siap sedia ke repositori Penyelidikan Xiphos yang boleh memuat naik fail PHP ke pelayan dengan CMS yang terdedah.

Butiran

Nah, latar belakang sudah berakhir, mari kita beralih ke bahagian yang paling menarik - analisis kelemahan. Saya memasang Joomla 3.6.3 sebagai versi ujian, jadi semua nombor baris akan relevan untuk versi ini. Dan semua laluan ke fail yang anda akan lihat di bawah akan ditunjukkan secara relatif kepada akar CMS yang dipasang.

Terima kasih kepada penemuan Damis Palma, kami tahu bahawa terdapat dua kaedah yang melaksanakan pendaftaran pengguna dalam sistem. Yang pertama digunakan oleh CMS dan terletak dalam fail /components/com_users/controllers/registration.php:108. Yang kedua (yang perlu kita panggil) tinggal di /components/com_users/controllers/user.php:293. Mari kita lihat dengan lebih dekat.

286: /** 287: * Kaedah untuk mendaftar pengguna. 288: * 289: * @kembali boolean 290: * 291: * @sejak 1.6 292: */ 293: daftar fungsi awam() 294: ( 295: JSession::checkToken("post") atau jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Dapatkan data borang. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Semak ralat. 318: if ($return === false) 319: ( ... 345: / / Selesaikan pendaftaran 346: $return = $model->register($data);

Di sini saya meninggalkan hanya baris yang menarik. Versi penuh kaedah terdedah boleh dilihat dalam repositori Joomla.

Mari kita fikirkan apa yang berlaku semasa pendaftaran pengguna biasa: data apa yang dihantar dan bagaimana ia diproses. Jika pendaftaran pengguna didayakan dalam tetapan, borang boleh didapati di http://joomla.local/index.php/component/users/?view=registration.


Permintaan pendaftaran pengguna yang sah kelihatan seperti tangkapan skrin berikut.


Komponen com_users bertanggungjawab untuk bekerja dengan pengguna. Beri perhatian kepada parameter tugas dalam permintaan. Ia mempunyai format $controller.$method . Mari lihat struktur fail.

Nama skrip dalam folder pengawal sepadan dengan nama pengawal yang dipanggil. Memandangkan permintaan kami kini mengandungi $controller = "registration" , fail akan dipanggil pendaftaran.php dan kaedah daftar()nya.

Perhatian, soalan: bagaimana untuk memindahkan pemprosesan pendaftaran ke tempat yang terdedah dalam kod? Anda mungkin sudah menekanya. Nama kaedah yang terdedah dan sebenar adalah sama (daftar), jadi kita hanya perlu menukar nama pengawal yang dipanggil. Di manakah terletaknya pengawal kita yang terdedah? Betul, dalam fail pengguna.php. Ternyata $controller = "user" . Menggabungkan segala-galanya kita mendapat tugas = user.register . Sekarang permintaan pendaftaran diproses mengikut kaedah yang kami perlukan.


Perkara kedua yang perlu kita lakukan ialah menghantar data dalam format yang betul. Semuanya mudah di sini. Daftar sah() mengharapkan daripada kami tatasusunan yang dipanggil jform , di mana kami menghantar data pendaftaran - nama, log masuk, kata laluan, e-mel (lihat tangkapan skrin dengan permintaan).

  • /components/com_users/controllers/registration.php: 124: // Dapatkan data pengguna. 125: $requestData = $this->input->post->get("jform", array(), "array");

Pelanggan kami mendapat data ini daripada tatasusunan yang dipanggil pengguna.

  • /components/com_users/controllers/user.php: 301: // Dapatkan data borang. 302: $data = $this->input->post->get("user", array(), "array");

Oleh itu, kami menukar nama semua parameter dalam permintaan daripada jfrom kepada pengguna .

Langkah ketiga kami ialah mencari token CSRF yang sah, kerana tanpanya tidak akan ada pendaftaran.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") atau jexit(JText::_("JINVALID_TOKEN"));

Ia kelihatan seperti cincangan MD5, dan anda boleh mengambilnya, sebagai contoh, daripada borang kebenaran di tapak /index.php/component/users/?view=login.


Kini anda boleh membuat pengguna menggunakan kaedah yang dikehendaki. Jika semuanya berjaya, maka tahniah - anda hanya mengeksploitasi kelemahan CVE-2016-8870"Semakan kebenaran tiada untuk mendaftarkan pengguna baharu."

Inilah yang kelihatan dalam kaedah daftar() "berfungsi" daripada pengawal UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Jika pendaftaran dilumpuhkan - Ubah hala ke halaman log masuk. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) log masuk", palsu)); 117: 118: kembali palsu; 119: )

Dan sebagainya dalam terdedah:

  • /components/com_users/controllers/user.php:

Ya, tidak mungkin.

Untuk memahami masalah kedua yang lebih serius, mari hantar permintaan yang kami buat dan lihat bagaimana ia dilaksanakan dalam pelbagai bahagian kod. Berikut ialah bahagian yang bertanggungjawab untuk mengesahkan data yang diserahkan oleh pengguna dalam kaedah pekerja:

Kesinambungan hanya tersedia untuk ahli

Pilihan 1. Sertai komuniti "tapak" untuk membaca semua bahan di tapak

Keahlian dalam komuniti dalam tempoh yang ditetapkan akan memberi anda akses kepada SEMUA bahan Penggodam, meningkatkan diskaun terkumpul peribadi anda dan membolehkan anda mengumpul penarafan Skor Xakep profesional!

Dalam artikel ini anda akan belajar cara membuat borang pendaftaran dan kebenaran menggunakan HTML, JavaScript, PHP dan MySql. Borang sedemikian digunakan di hampir setiap laman web, tanpa mengira jenisnya. Mereka dicipta untuk forum, kedai dalam talian, rangkaian sosial (seperti Facebook, Twitter, Odnoklassniki) dan banyak jenis tapak lain.

Jika anda mempunyai tapak web pada komputer tempatan anda, maka saya harap anda sudah mempunyai pelayan tempatan dipasang dan berjalan. Tanpanya, tiada apa yang akan berjaya.

Mencipta jadual dalam Pangkalan Data

Untuk melaksanakan pendaftaran pengguna, pertama sekali kita memerlukan Pangkalan Data. Jika anda sudah memilikinya, maka hebat, jika tidak, anda perlu menciptanya. Dalam artikel itu, saya menerangkan secara terperinci bagaimana untuk melakukan ini.

Oleh itu, kita mempunyai Pangkalan Data (disingkatkan sebagai DB), kini kita perlu mencipta jadual pengguna di mana kami akan menambah pengguna berdaftar kami.

Saya juga menerangkan cara membuat jadual dalam pangkalan data dalam artikel. Sebelum membuat jadual, kita perlu menentukan medan yang akan terkandung di dalamnya. Medan ini akan sepadan dengan medan daripada borang pendaftaran.

Jadi, kami fikir, bayangkan apakah medan yang akan ada pada borang kami dan mencipta jadual pengguna dengan bidang ini:

  • ID- Pengecam. Padang ID Setiap jadual dalam pangkalan data harus memilikinya.
  • nama pertama- Untuk menyimpan nama.
  • nama terakhir- Untuk mengekalkan nama keluarga.
  • emel- Untuk menyimpan alamat pos. Kami akan menggunakan e-mel sebagai log masuk, jadi medan ini mestilah unik, iaitu mempunyai indeks UNIK.
  • status_emel- Medan untuk menunjukkan sama ada mel itu disahkan atau tidak. Jika mel itu disahkan, maka ia akan mempunyai nilai 1, jika tidak nilainya ialah 0.
  • kata laluan- Untuk menyimpan kata laluan.


Jika anda mahu borang pendaftaran anda mempunyai beberapa medan lain, anda juga boleh menambahkannya di sini.

Itu sahaja, meja kami pengguna sedia. Mari kita beralih ke peringkat seterusnya.

Sambungan Pangkalan Data

Kami telah mencipta pangkalan data, kini kami perlu menyambung kepadanya. Kami akan menyambung menggunakan sambungan PHP MySQLi.

Dalam folder tapak kami, buat fail dengan nama dbconnect.php, dan tulis skrip berikut di dalamnya:

Ralat sambungan DB. Penerangan ralat: ".mysqli_connect_error()."

"; exit(); ) // Tetapkan pengekodan sambungan $mysqli->set_charset("utf8"); // Untuk kemudahan, tambah pembolehubah di sini yang akan mengandungi nama tapak kami $address_site = "http://testsite .local" ; ?>

Fail ini dbconnect.php perlu disambungkan kepada pengendali borang.

Perhatikan pembolehubah $address_site, di sini saya menunjukkan nama tapak ujian saya yang akan saya usahakan. Sila nyatakan nama tapak anda dengan sewajarnya.

Struktur tapak

Sekarang mari kita lihat struktur HTML tapak kami.

Kami akan mengalihkan pengepala dan pengaki tapak ke dalam fail berasingan, header.php Dan footer.php. Kami akan memasukkannya pada semua halaman. Iaitu pada halaman utama (fail index.php), ke halaman dengan borang pendaftaran (fail borang_daftar.php) dan ke halaman dengan borang kebenaran (file form_auth.php).

Sekat dengan pautan kami, pendaftaran Dan kebenaran, tambahkannya pada pengepala tapak supaya ia dipaparkan pada semua halaman. Satu pautan akan dimasukkan di halaman borang pendaftaran(fail borang_daftar.php) dan satu lagi ke halaman dengan borang kebenaran(fail form_auth.php).

Kandungan fail header.php:

Nama tapak kami

Hasilnya, halaman utama kami kelihatan seperti ini:


Sudah tentu, tapak anda mungkin mempunyai struktur yang berbeza sama sekali, tetapi ini tidak penting untuk kami sekarang. Perkara utama ialah terdapat pautan (butang) untuk pendaftaran dan kebenaran.

Sekarang mari kita beralih kepada borang pendaftaran. Seperti yang anda sudah faham, kami ada dalam fail borang_daftar.php.

Pergi ke Pangkalan Data (dalam phpMyAdmin), buka struktur jadual pengguna dan lihat bidang apa yang kita perlukan. Ini bermakna kita memerlukan medan untuk memasukkan nama pertama dan akhir, medan untuk memasukkan alamat pos (E-mel) dan medan untuk memasukkan kata laluan. Dan untuk tujuan keselamatan, kami akan menambah medan untuk memasukkan captcha.

Pada pelayan, akibat pemprosesan borang pendaftaran, pelbagai ralat mungkin berlaku kerana pengguna tidak akan dapat mendaftar. Oleh itu, agar pengguna memahami mengapa pendaftaran gagal, adalah perlu untuk memaparkan mesej tentang ralat ini.

Sebelum memaparkan borang, tambahkan blok untuk memaparkan mesej ralat daripada sesi.

Dan satu perkara lagi, jika pengguna sudah diberi kuasa, dan kerana ingin tahu dia pergi ke halaman pendaftaran secara langsung dengan menulis di bar alamat penyemak imbas alamat_tapak/form_register.php, maka dalam kes ini, bukannya borang pendaftaran, kami akan memaparkan tajuk yang menyatakan bahawa dia sudah berdaftar.

Secara umum, kod fail borang_daftar.php kita dapat ini:

Anda telah pun berdaftar

Dalam penyemak imbas, halaman dengan borang pendaftaran kelihatan seperti ini:


Dengan menggunakan atribut yang diperlukan, kami telah mewajibkan semua bidang.

Perhatikan kod borang pendaftaran di mana captcha dipaparkan:


Kami menentukan laluan ke fail dalam nilai atribut src untuk imej captcha.php, yang menjana captcha ini.

Mari lihat kod fail captcha.php:

Kod ini diulas dengan baik, jadi saya akan fokus pada satu mata sahaja.

Di dalam satu fungsi imageTtfText(), laluan ke fon ditentukan verdana.ttf. Jadi untuk captcha berfungsi dengan betul, kita mesti mencipta folder fon, dan letakkan fail fon di sana verdana.ttf. Anda boleh menemuinya dan memuat turunnya dari Internet, atau mengambilnya dari arkib dengan bahan artikel ini.

Kami telah selesai dengan struktur HTML, sudah tiba masanya untuk meneruskan.

Menyemak kesahihan e-mel menggunakan jQuery

Mana-mana borang perlu menyemak kesahihan data yang dimasukkan, kedua-dua di bahagian klien (menggunakan JavaScript, jQuery) dan di bahagian pelayan.

Kita mesti memberi perhatian khusus kepada medan E-mel. Adalah sangat penting bahawa alamat pos yang dimasukkan adalah sah.

Untuk medan input ini, kami menetapkan jenis e-mel (type="email"), ini sedikit memberi amaran kepada kami terhadap format yang salah. Tetapi ini tidak mencukupi, kerana melalui pemeriksa kod yang disediakan oleh penyemak imbas, kita boleh menukar nilai atribut dengan mudah menaip Dengan emel pada teks, dan itu sahaja, cek kami tidak akan sah lagi.


Dan dalam kes ini, kita mesti melakukan pemeriksaan yang lebih dipercayai. Untuk melakukan ini, kami akan menggunakan perpustakaan jQuery daripada JavaScript.

Untuk menyambung pustaka jQuery, dalam fail header.php antara tag , sebelum teg penutup , tambah baris ini:

Sejurus selepas baris ini, kami akan menambah kod pengesahan e-mel. Di sini kami akan menambah kod untuk menyemak panjang kata laluan yang dimasukkan. Panjangnya mestilah sekurang-kurangnya 6 aksara.

Menggunakan skrip ini, kami menyemak alamat e-mel yang dimasukkan untuk kesahihan. Jika pengguna memasukkan E-mel yang salah, kami memaparkan mesej ralat tentang perkara ini dan melumpuhkan butang hantar borang. Jika semuanya baik-baik saja, maka kami mengalih keluar ralat dan mengaktifkan butang hantar borang.

Oleh itu, kami selesai dengan pengesahan borang di sisi pelanggan. Kini kami boleh menghantarnya ke pelayan, di mana kami juga akan melakukan beberapa semakan dan menambah data ke pangkalan data.

Pendaftaran pengguna

Kami menghantar borang ke fail untuk diproses daftar.php, melalui kaedah POST. Nama fail pengendali ini dinyatakan dalam nilai atribut tindakan. Dan kaedah penghantaran dinyatakan dalam nilai atribut kaedah.

Buka fail ini daftar.php dan perkara pertama yang perlu kita lakukan ialah menulis fungsi pelancaran sesi dan sambungkan fail yang kita buat tadi dbconnect.php(Dalam fail ini kami membuat sambungan ke pangkalan data). Dan juga, mari segera mengisytiharkan sel error_messages Dan kejayaan_mesej dalam tatasusunan sesi global. DALAM error_mesages kami akan merekodkan semua mesej ralat yang berlaku semasa pemprosesan borang, dan dalam kejayaan_mesej, kami akan merakam mesej gembira.

Sebelum kita meneruskan, kita mesti menyemak adakah borang diserahkan sama sekali?. Penyerang boleh melihat nilai atribut tindakan daripada borang, dan ketahui fail yang sedang memproses borang ini. Dan dia mungkin mempunyai idea untuk pergi terus ke fail ini dengan menaip alamat berikut dalam bar alamat penyemak imbas: http://site_address/register.php

Jadi kita perlu menyemak sel dalam tatasusunan POST global yang namanya sepadan dengan nama butang "Daftar" kami daripada borang. Dengan cara ini kita menyemak sama ada butang "Daftar" telah diklik atau tidak.

Jika penyerang cuba pergi terus ke fail ini, mereka akan menerima mesej ralat. Biar saya ingatkan anda bahawa pembolehubah $address_site mengandungi nama tapak dan ia telah diisytiharkan dalam fail dbconnect.php.

Ralat! muka surat utama.

"); } ?>

Nilai captcha dalam sesi telah ditambahkan apabila ia dijana, dalam fail captcha.php. Sebagai peringatan, saya akan menunjukkan kepada anda sekeping kod ini daripada fail sekali lagi captcha.php, di mana nilai captcha ditambahkan pada sesi:

Sekarang mari kita teruskan ke pengesahan itu sendiri. Dalam fail daftar.php, di dalam blok if, di mana kami menyemak sama ada butang "Daftar" telah diklik, atau sebaliknya di mana komen " ditunjukkan" // (1) Ruang untuk sekeping kod seterusnya"kami menulis:

//Semak captcha yang diterima //Potong ruang dari awal dan akhir baris $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Bandingkan nilai yang diterima dengan nilai daripada sesi. if($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Jika captcha tidak betul, maka kami mengembalikan pengguna ke halaman pendaftaran, dan di sana kami akan memaparkan mesej ralat kepadanya bahawa dia memasukkan captcha yang salah . $error_message = "

Ralat! Anda memasukkan captcha yang salah

"; // Simpan mesej ralat ke sesi. $_SESSION["error_messages"] = $error_message; // Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: " .$address_site ."/form_register.php"); //Hentikan skrip keluar(); ) // (2) Letakkan sekeping kod seterusnya )else( //Jika captcha tidak lulus atau ia kosong keluar ("

Ralat! Tiada kod pengesahan, iaitu kod captcha. Anda boleh pergi ke halaman utama.

"); }

Seterusnya, kita perlu memproses data yang diterima daripada tatasusunan POST. Pertama sekali, kita perlu menyemak kandungan tatasusunan POST global, iaitu, sama ada terdapat sel di sana yang namanya sepadan dengan nama medan input daripada borang kami.

Jika sel wujud, maka kami memangkas ruang dari awal dan akhir baris dari sel ini, jika tidak, kami mengubah hala pengguna kembali ke halaman dengan borang pendaftaran.

Seterusnya, selepas kami memangkas ruang, kami menambah baris pada pembolehubah dan menyemak pembolehubah ini untuk kekosongan; jika ia tidak kosong, maka kami meneruskan, jika tidak, kami mengalihkan pengguna kembali ke halaman dengan borang pendaftaran.

Tampal kod ini ke lokasi yang ditentukan" // (2) Ruang untuk sekeping kod seterusnya".

/* Semak sama ada terdapat data yang dihantar daripada borang dalam tatasusunan global $_POST dan bungkus data yang diserahkan dalam pembolehubah biasa.*/ if(isset($_POST["first_name"]))( //Pangkas ruang dari awal dan hujung rentetan $first_name = trim ($_POST["first_name"]); //Semak pembolehubah untuk kekosongan jika(!empty($first_name))( // Untuk keselamatan, tukar aksara khas kepada HTML entiti $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Masukkan nama anda

Medan nama tiada

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) if( isset($_POST["last_name"]))( //Pangkas ruang dari awal dan akhir baris $last_name = trim($_POST["last_name"]); if(!kosong($last_name)) ( // Untuk keselamatan , tukar aksara khas kepada entiti HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Sila masukkan nama keluarga anda

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) )lain ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Medan nama keluarga tiada

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) if( isset($_POST["e-mel"]))( //Pangkas ruang dari awal dan akhir baris $email = trim ($_POST["e-mel"]); if(!kosong($e-mel)) ($email = htmlspecialchars ($email, ENT_QUOTES); // (3) Lokasi kod untuk menyemak format alamat e-mel dan keunikannya )lain( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .="

Masukkan emel anda

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) )lain ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) if( isset($_POST["kata laluan"]))( //Pangkas ruang dari permulaan dan penghujung rentetan $kata laluan = trim ($_POST["kata laluan"]); if(!kosong($kata laluan)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Sulitkan kata laluan $password = md5($password."top_secret"); )else( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .="

Masukkan kata laluan anda

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) )lain ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) // (4) Tempat untuk kod untuk menambah pengguna ke pangkalan data

Yang paling penting ialah bidang emel. Kita mesti menyemak format alamat pos yang diterima dan keunikannya dalam pangkalan data. Maksudnya, adakah pengguna yang mempunyai alamat e-mel yang sama telah didaftarkan?

Di lokasi yang ditetapkan" // (3) Kod lokasi untuk menyemak format alamat pos dan keunikannya" tambah kod berikut:

//Semak format alamat e-mel yang diterima menggunakan ungkapan biasa $reg_email = "/^**@(+(*+)*\.)++/i"; //Jika format alamat e-mel yang diterima tidak sepadan dengan ungkapan biasa if(!preg_match($reg_email, $email))( // Simpan mesej ralat ke sesi. $_SESSION["error_messages"] .= "

Anda memasukkan e-mel yang salah

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) // Kami menyemak sama ada alamat sedemikian sudah ada dalam pangkalan data. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Jika bilangan yang diterima terdapat tepat satu baris, yang bermaksud pengguna dengan alamat e-mel ini telah didaftarkan if($result_query->num_rows == 1)( //Jika hasil yang diperolehi tidak palsu if(($row = $result_query->fetch_assoc()) != false) ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Pengguna dengan alamat e-mel ini telah pun didaftarkan

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); )else( // Simpan mesej ralat ke sesi . $_SESSION["error_messages"] .="

Ralat dalam pertanyaan pangkalan data

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); ) /* menutup pilihan */ $ result_query-> close(); //Hentikan skrip exit(); ) /* tutup pilihan */ $result_query->close();

Oleh itu, kami telah selesai dengan semua semakan, sudah tiba masanya untuk menambah pengguna ke pangkalan data. Di lokasi yang ditetapkan" // (4) Tempat untuk kod untuk menambah pengguna ke pangkalan data" tambah kod berikut:

//Pertanyaan untuk menambah pengguna ke pangkalan data $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", "".$emel.", "".$kata laluan."")"); if(!$result_query_insert)( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Ralat dalam permintaan untuk menambah pengguna ke pangkalan data

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); )lain( $_SESSION["success_messages"] = "

Pendaftaran berjaya diselesaikan!!!
Kini anda boleh log masuk menggunakan nama pengguna dan kata laluan anda.

"; //Hantar pengguna ke pengepala halaman kebenaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_auth.php"); ) /* Menyelesaikan permintaan */ $ result_query_insert-> close(); //Tutup sambungan ke pangkalan data $mysqli->close();

Jika ralat berlaku dalam permintaan untuk menambah pengguna ke pangkalan data, kami menambah mesej tentang ralat ini pada sesi dan mengembalikan pengguna ke halaman pendaftaran.

Jika tidak, jika semuanya berjalan lancar, kami juga menambah mesej pada sesi, tetapi kali ini ia lebih menyenangkan, iaitu kami memberitahu pengguna bahawa pendaftaran telah berjaya. Dan kami mengubahnya ke halaman dengan borang kebenaran.

Skrip untuk menyemak format alamat e-mel dan panjang kata laluan ada dalam fail header.php, jadi ia juga akan digunakan pada medan daripada borang ini.

Sesi juga dimulakan dalam fail header.php, jadi dalam fail form_auth.php Tidak perlu memulakan sesi, kerana kita akan mendapat ralat.


Seperti yang telah saya katakan, skrip untuk menyemak format alamat e-mel dan panjang kata laluan juga berfungsi di sini. Oleh itu, jika pengguna memasukkan alamat e-mel yang salah atau kata laluan pendek, dia akan segera menerima mesej ralat. Butang untuk masuk akan menjadi tidak aktif.

Selepas membetulkan ralat, butang untuk masuk menjadi aktif, dan pengguna akan dapat menyerahkan borang ke pelayan, di mana ia akan diproses.

Keizinan pengguna

Untuk atribut nilai tindakan kecacatan kebenaran mempunyai fail yang ditentukan auth.php, ini bermakna borang akan diproses dalam fail ini.

Jadi, buka fail auth.php dan tulis kod untuk memproses borang kebenaran. Perkara pertama yang perlu anda lakukan ialah memulakan sesi dan sambungkan fail dbconnect.php untuk menyambung ke pangkalan data.

//Isytiharkan sel untuk menambah ralat yang mungkin berlaku semasa memproses borang. $_SESSION["error_messages"] = ""; //Isytiharkan sel untuk menambah mesej yang berjaya $_SESSION["success_messages"] = "";

/* Semak sama ada borang telah dihantar, iaitu sama ada butang Log Masuk telah diklik. Jika ya, maka kita teruskan, jika tidak, maka kita akan memaparkan mesej ralat kepada pengguna yang menunjukkan bahawa dia mengakses halaman ini secara langsung. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Ruang untuk sekeping kod seterusnya )else( exit("

Ralat! Anda telah mengakses halaman ini secara langsung, jadi tiada data untuk diproses. Anda boleh pergi ke halaman utama.

"); }

//Semak captcha yang diterima if(isset($_POST["captcha"]))( //Potong ruang dari awal dan akhir baris $captcha = trim ($_POST["captcha"]); if(! kosong($captcha ))( //Bandingkan nilai yang diterima dengan nilai daripada sesi. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")) ( // Jika captcha tidak betul , maka kami mengembalikan pengguna ke halaman kebenaran, dan di sana kami akan memaparkan mesej ralat kepadanya bahawa dia memasukkan captcha yang salah. $error_message = "

Ralat! Anda memasukkan captcha yang salah

"; // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] = $error_message; // Kembalikan pengguna ke pengepala halaman kebenaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: " .$address_site ."/form_auth.php"); //Hentikan skrip keluar(); ) )else( $error_message = "

Ralat! Medan entri captcha tidak boleh kosong.

"; // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] = $error_message; // Kembalikan pengguna ke pengepala halaman kebenaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: " .$address_site ."/form_auth.php"); //Hentikan skrip keluar(); ) //(2) Tempat untuk memproses alamat e-mel //(3) Tempat untuk memproses kata laluan //(4) Tempat untuk mengarang pertanyaan kepada pangkalan data )else ( //Jika captcha tidak lulus keluar("

Ralat! Tiada kod pengesahan, iaitu kod captcha. Anda boleh pergi ke halaman utama.

"); }

Jika pengguna memasukkan kod pengesahan dengan betul, maka kami meneruskan, jika tidak, kami mengembalikannya ke halaman kebenaran.

Menyemak alamat surat menyurat

//Memangkas ruang dari awal dan akhir baris $email = trim ($_POST["email"]); if(isset($_POST["emel"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Semak format alamat e-mel yang diterima menggunakan ungkapan biasa $ reg_email = " /^**@(+(*+)*\.)++/i"; //Jika format alamat e-mel yang diterima tidak sepadan dengan ungkapan biasa if(!preg_match($reg_email, $email ))( // Simpan pada mesej ralat sesi. $_SESSION["error_messages"] .= "

Anda memasukkan e-mel yang salah

"; //Kembalikan pengguna ke pengepala halaman kebenaran("HTTP/1.1 301 Dipindahkan Secara Kekal"); header("Lokasi: ".$address_site."/form_auth.php"); //Hentikan skrip keluar(); ) )lain ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Medan untuk memasukkan alamat pos (e-mel) tidak boleh kosong.

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_register.php"); //Hentikan skrip keluar(); ) )lain ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Medan input e-mel tiada

"; //Kembalikan pengguna ke pengepala halaman kebenaran("HTTP/1.1 301 Dipindahkan Secara Kekal"); header("Lokasi: ".$address_site."/form_auth.php"); //Hentikan skrip keluar(); ) // (3) Kawasan pemprosesan kata laluan

Jika pengguna memasukkan alamat e-mel dalam format yang salah atau nilai medan alamat e-mel kosong, maka kami mengembalikannya ke halaman kebenaran di mana kami memaparkan mesej tentang perkara ini.

Pengesahan kata laluan

Medan seterusnya untuk diproses ialah medan kata laluan. Ke tempat yang ditentukan" //(3) Tempat untuk pemprosesan kata laluan", kami menulis:

If(isset($_POST["kata laluan"]))( //Pangkas ruang dari permulaan dan penghujung rentetan $password = trim ($_POST["kata laluan"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); //Sulitkan kata laluan $password = md5($password."top_secret"); )else( //Simpan mesej ralat pada sesi. $_SESSION["error_messages"] . = "

Masukkan kata laluan anda

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_auth.php"); //Hentikan skrip keluar(); ) )lain ( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Medan kata laluan tiada

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_auth.php"); //Hentikan skrip keluar(); )

Di sini kami menggunakan fungsi md5() untuk menyulitkan kata laluan yang diterima, kerana kata laluan kami dalam bentuk yang disulitkan dalam pangkalan data. Kata rahsia tambahan dalam penyulitan, dalam kes kami " rahsia sulit" mestilah yang digunakan semasa mendaftarkan pengguna.

Sekarang anda perlu membuat pertanyaan kepada pangkalan data untuk memilih pengguna yang alamat e-melnya sama dengan alamat e-mel yang diterima dan kata laluannya sama dengan kata laluan yang diterima.

//Pertanyaan dalam pangkalan data berdasarkan pilihan pengguna. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" DAN kata laluan = "".$password."""); if(!$result_query_select)( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Ralat pertanyaan semasa memilih pengguna daripada pangkalan data

"; //Kembalikan pengguna ke pengepala halaman pendaftaran("HTTP/1.1 301 Moved Permanently"); header("Lokasi: ".$address_site."/form_auth.php"); //Hentikan skrip keluar(); )else( //Semak jika tiada pengguna dengan data sedemikian dalam pangkalan data, kemudian paparkan mesej ralat if($result_query_select->num_rows == 1)( // Jika data yang dimasukkan sepadan dengan data daripada pangkalan data, kemudian simpan log masuk dan kata laluan kepada tatasusunan sesi. $_SESSION["e-mel"] = $emel; $_SESSION["kata laluan"] = $kata laluan; //Kembalikan pengguna ke pengepala halaman utama("HTTP/1.1 301 Dipindahkan Secara Kekal" ); header("Lokasi: ".$address_site ."/index.php"); )else( // Simpan mesej ralat pada sesi. $_SESSION["error_messages"] .= "

Log masuk dan/atau kata laluan salah

"; //Kembalikan pengguna ke pengepala halaman kebenaran("HTTP/1.1 301 Dipindahkan Secara Kekal"); header("Lokasi: ".$address_site."/form_auth.php"); //Hentikan skrip keluar(); ) )

Keluar dari tapak

Dan perkara terakhir yang kita laksanakan ialah prosedur untuk meninggalkan tapak. Pada masa ini, dalam pengepala kami memaparkan pautan ke halaman kebenaran dan halaman pendaftaran.

Dalam pengepala tapak (fail header.php), menggunakan sesi kami menyemak sama ada pengguna sudah dibenarkan. Jika tidak, maka kami memaparkan pautan pendaftaran dan kebenaran, jika tidak (jika dia diberi kuasa), maka bukannya pautan pendaftaran dan kebenaran kami memaparkan pautan Keluar.

Sekeping kod yang diubah suai daripada fail header.php:

Pendaftaran

Keluar

Apabila anda mengklik pada pautan keluar dari tapak, kami dibawa ke fail logout.php, di mana kami hanya memusnahkan sel dengan alamat e-mel dan kata laluan daripada sesi. Selepas ini, kami mengembalikan pengguna ke halaman di mana pautan telah diklik keluar.

Kod fail logout.php:

Itu sahaja. Sekarang anda tahu bagaimana melaksana dan memproses borang pendaftaran dan kebenaran pengguna di laman web anda. Borang ini terdapat di hampir setiap laman web, jadi setiap pengaturcara harus tahu cara menciptanya.

Kami juga mempelajari cara untuk mengesahkan data input, kedua-duanya pada bahagian klien (dalam penyemak imbas, menggunakan JavaScript, jQuery) dan pada bahagian pelayan (menggunakan PHP). Kami juga belajar melaksanakan prosedur untuk meninggalkan tapak.

Semua skrip telah diuji dan berfungsi. Anda boleh memuat turun arkib dengan fail tapak kecil ini dari pautan ini.

Pada masa akan datang saya akan menulis artikel di mana saya akan menerangkan. Dan saya juga bercadang untuk menulis artikel di mana saya akan menerangkan (tanpa memuatkan semula halaman). Jadi, untuk kekal dimaklumkan tentang keluaran artikel baharu, anda boleh melanggan laman web saya.

Jika anda mempunyai sebarang pertanyaan, sila hubungi saya, dan jika anda melihat sebarang ralat dalam artikel, sila beritahu saya.

Rancangan Pengajaran (Bahagian 5):

  1. Mencipta struktur HTML untuk borang kebenaran
  2. Kami memproses data yang diterima
  3. Kami memaparkan sapaan pengguna dalam pengepala tapak

Adakah anda suka artikel itu?



Baru di tapak

>

Paling popular