Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Amankan Form dengan Form Keys

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Ari Gustiawan (you can also view the original English article)

Keamanan adalah topik panas. Memastikan bahwa website Anda aman sangat penting untuk aplikasi web. Bahkan, aku menghabiskan 70% dari waktu saya mengamankan aplikasi saya. Salah satu hal yang paling penting kita harus aman adalah form. Hari ini, kita akan meninjau metode untuk mencegah XSS (Cross-site scripting) dan Cross-site request forgery di form.

Mengapa?

POST data dapat dikirim dari satu situs web lain. Mengapa hal ini buruk? Skenario sederhana...

User, login ke situs web Anda, mengunjungi situs web lain selama sesi nya. Website ini akan dapat mengirim POST data ke website Anda--misalnya, dengan AJAX. Karena user login di situs Anda, situs web lain juga akan dapat mengirim post data untuk mengamankan yang hanya dapat diakses setelah login.

Kita juga harus melindungi halaman kami terhadap serangan menggunakan cURL

Bagaimana kita memperbaikinya?

Dengan form keys! Kami akan menambahkan hash khusus (form key) untuk setiap form untuk memastikan bahwa data hanya dapat diproses ketika itu telah dikirim dari website Anda. Setelah submit form, script PHP kami akan memvalidasi form key yang di submit juga form key yang kita set di session.

Apa yang harus kita lakukan:

  1. Tambahkan form key untuk setiap form.
  2. Menyimpan form key dalam session.
  3. Memvalidasi form key setelah submit form.

Langkah 1: Simpple Form

Login Form

Pertama kita perlu form sederhana untuk keperluan demonstrasi. Salah satu form yang paling penting kita harus amankan adalah login form. Login form adalah rentan terhadap brute force attacks . Buat sebuah file baru dan Simpan sebagai index.php di web Anda root. Tambahkan kode berikut dalam body:

Sekarang kita memiliki halaman XHTML yang sederhana dengan login form. Jika Anda ingin menggunakan form ley website Anda, Anda dapat mengganti script diatas dengan halaman login Anda sendiri. Sekarang, mari kita lanjutkan untuk tindakan nyata.

Langkah 2: Membuat kelas

Kita akan membuat PHP class untuk form key. Karena setiap halaman dapat mengandung hanya satu form key, kita bisa membuat singleton kelas kami untuk memastikan bahwa kelas kami digunakan dengan benar. Karena menciptakan singletons OOP topik yang lebih advance, kami akan melewatkan bagian ini. Buat sebuah file baru yang disebut formkey.class.php dan menempatkannya di web Anda root. Sekarang kita harus berpikir tentang fungsi-fungsi yang kita butuhkan. Pertama, kita perlu fungsi untuk menghasilkan sebuah kunci bentuk sehingga kita dapat menempatkan dalam form. Dalam file PHP Anda menempatkan kode berikut:

Di atas, Anda melihat kelas dengan tiga bagian: dua variabel dan fungsi. Kami membuat fungsi private karena fungsi ini hanya boleh digunakan oleh outputfunctions kami, yang kita akan buat nanti. Dalam dua variabel, kami akan menyimpan form key. Ini juga private  karena mereka hanya dapat digunakan oleh fungsi di dalam kelas kami.

Sekarang, kita harus memikirkan cara untuk menghasilkan form key kami. Karena form key kami harus unik (jika tidak, kami tidak memiliki efek apapun), kita menggunakan kombinasi dari pengguna alamat IP untuk mengikat key pengguna, mt_rand() untuk membuatnya unik dan fungsi uniqid() untuk membuatnya lebih unik. Kami juga mengenkripsi informasi ini dengan md5() untuk membuat hash unik yang kita kemudian dapat menyisipkan ke halaman kami. Karena kita menggunakan md5(), pengguna tidak dapat melihat apa yang kita digunakan untuk menghasilkan kunci. Seluruh fungsi:

Masukkan kode di atas ke dalam file formkey.class.php Anda. Menggantikan fungsi dengan fungsi baru.

Langkah 3: Memasukkan Form key ke Form

Untuk langkah ini, kami membuat sebuah fungsi baru yang output bidang HTML tersembunyi dengan form key kami. Fungsi terdiri dari tiga langkah:

Generate, Save, OutputGenerate, Save, OutputGenerate, Save, Output

  1. Menghasilkan kunci formulir dengan fungsi generateKey() kami.
  2. Menyimpan form key dalam variabel $formKey kami dan dalam session.
  3. Bidang output HTML.

Kami nama kami outputKey() fungsi dan membuat publik, karena kita harus menggunakannya di luar kelas kami. Fungsi kita akan memanggil fungsi private generateKey() untuk menghasilkan form key baru dan menyimpannya secara lokal dalam session. Akhirnya, kita membuat kode XHTML. Sekarang tambahkan kode berikut di dalam kelas PHP kami:

Sekarang, kita akan menambahkan form key ke form login untuk mengamankan itu. Kita harus mencakup kelas di file index.php kami. Kita juga harus mulai session karena kelas kami menggunakan session untuk menyimpan key yang digenerate. Untuk ini, kita menambahkan kode berikut di atas doctype dan tag head:

Kode di atas cukup jelas. Kita mulai sesi (karena kami menyimpan form key) dan memuat file kelas PHP. Setelah itu, kita mulai kelas dengan new formKey(), ini akan membuat kelas kami dan menyimpannya dalam $formKey. Sekarang kita hanya perlu mengedit form agar berisi form key:

Dan itu semua! Karena kami membuat outputKey() fungsi, kita hanya harus memasukkannya ke dalam form. Kita dapat menggunakan form key dalam setiap form dengan hanya menambahkan <?php $formKey-> outputKey();? > Sekarang hanya review sumber halaman web Anda dan Anda dapat melihat bahwa ada sebuah form key yang disisipkan ke dalam form. Satu-satunya langkah yang tersisa adalah untuk memvalidasi request.

Langkah 4: memvalidasi

Kami tidak akan memvalidasi form secara keseluruhan; hanya form key. Validasi form adalah dasar PHP dan tutorial dapat ditemukan di seluruh web. Mari kita memvalidasi form key. Karena fungsi "generateKey" kami akan menimpa nilai session, kami menambahkan konstruktor kelas PHP kami. Constructor yang akan dipanggil ketika kelas kami menciptakan (atau dibangun). Konstruktor akan menyimpan kunci sebelumnya di dalam kelas sebelum kita membuat yang baru; Jadi kita akan selalu memiliki form key sebelumnya untuk validasi form. Jika kita tidak melakukan ini, kita tidak akan mampu memvalidasi form key. Tambahkan fungsi PHP berikut untuk kelas Anda:

Constructor yang harus selalu bernama __construct(). Ketika constructor disebut kami memeriksa jika session di set, dan jika demikian, kami menyimpan itu secara lokal dalam variabel old_formKey kami.

Sekarang kami mampu memvalidasi form key kami. Kami membuat fungsi dasar di dalam kelas kami yang memvalidasi form key. Fungsi ini juga harus public karena kami akan menggunakannya di luar kelas kami. Fungsi akan memvalidasi nilai POST form key terhadap nilai tersimpan di form key. Tambahkan fungsi ini PHP class:

Dalam index.php, memvalidasi form key dengan menggunakan fungsi yang kami hanya dibuat di kelas kami. Tentu saja, kami hanya memvalidasi setelah permintaan POST. Tambahkan kode berikut setelah $formKey = new formKey();

Kami membuat sebuah variabel $error yang menyimpan pesan error kita. Jika permintaan POST telah dikirim kami memvalidasikan formkey dengan $formKey->validate(). Jika ini mengembalikan false, form key tidak valid dan kami menampilkan pesan error. Perhatikan bahwa kita hanya memvalidasi form key--Anda diharapkan untuk memvalidasi seluruh form sendiri.

Dalam HTML, Anda dapat menempatkan kode berikut untuk menampilkan pesan error:

Ini akan echo variabel $error jika sudah di set.

FormFormForm

Jika Anda mulai server Anda dan pergi ke index.php, Anda akan melihat form dan pesan 'No error'. Ketika Anda mengirimkan form Anda akan melihat pesan 'No form key error' karena itu adalah permintaan POST yang valid. Sekarang cobalah untuk reload halaman dan menerima ketika peramban permintaan bahwa POST data dikirim kembali. Anda akan melihat bahwa script kami trigger pesan error: 'Form key error!' Form sekarang dilindungi terhadap masukan dari situs web lain dan kesalahan dengan halaman ulang! error juga ditampilkan setelah refresh karena form key baru dibuat setelah kami submit form. Ini baik karena, sekarang, pengguna tidak sengaja tidak dapat memposting form dua kali.

Kode lengkap

Di sini adalah seluruh kode PHP dan HTML:

index.php

fomrkey.class.php

Kesimpulan

Menambahkan kode ini ke setiap form yang penting di website Anda akan meningkatkan keamanan form Anda secara dramatis. Bahkan berhenti menyegarkan masalah, seperti yang kita lihat di langkah 4. Karena form key hanya berlaku untuk satu permintaan, double posting ini tidak mungkin.

Ini adalah tutorial pertama saya, saya harap Anda seperti itu dan menggunakannya untuk meningkatkan keamanan Anda! Tolong beritahu saya tahu pikiran Anda, melalui komentar. Memiliki metode yang lebih baik? Marilah kita tahu.

Bacaan lebih lanjut


Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.