Verifikasi formulir PHP

Pada bagian ini dan bagian berikutnya disebutkan bagaimana cara menggunaan PHP untuk memverifikasi data formulir.

Verifikasi formulir PHP

Petunjuk:Harap berhati-hati tentang keamanan saat mengelola formulir PHP!

Halaman ini akan menunjukkan bagaimana cara mengelola formulir PHP dengan aman. Pemverifikasi data formulir HTML penting untuk mencegah hakcipta dan spam!

Formulir HTML yang kami gunakan nanti akan mengandung berbagai jenis bidang input: bidang teks wajib dan opsional, tombol pilihan serta tombol kirim:

Formulir di atas menggunakan aturan verifikasi seperti ini:

Bidang Aturan verifikasi
Nama Diperlukan. Harus mengandung huruf dan spasi.
E-mail Diperlukan. Harus mengandung alamat email yang valid (termasuk @ dan .).
Website Opsional. Jika diisi, maka harus mengandung URL yang valid.
Komentar Opsional. Bidang input teks berbanyak (kotak teks).
Gender Diperlukan. Harus memilih salah satu.

Dulu kita lihat kode HTML asli formulir ini:

Bidang teks

name, email dan website termasuk elemen input teks, bidang comment adalah kotak teks. Kode HTMLnya seperti ini:

Nama: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Komentar: <textarea name="comment" rows="5" cols="40"></textarea>

Tombol pilihan

Bidang gender adalah tombol pilihan, kode HTMLnya seperti ini:

Gender:
<input type="radio" name="gender" value="female">Perempuan
<input type="radio" name="gender" value="male">Laki-laki

Elemen formulir

Kode HTML formulir seperti ini:

<form method="post" action="<?php echo htmlspecialchars(<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>);?>

Ketika mengirim formulir ini, data formulir dikirim melalui method="post".

Apa yang dimaksud dengan variabel $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] adalah variabel global yang mengembalikan nama file skrip yang sedang dijalankan.

Dengan demikian, $_SERVER["PHP_SELF"] mengirimkan data formulir ke halaman yang sama, bukan ke halaman lain. Dengan cara ini, pengguna dapat mendapatkan informasi peringatan kesalahan di halaman formulir.

Apa itu fungsi htmlspecialchars()?

Fungsi htmlspecialchars() mengubah karakter khusus menjadi entitas HTML. Ini berarti karakter HTML seperti < dan > akan diganti dengan < dan >. Ini dapat mencegah penyerang menggunakan HTML atau kode JavaScript (penyerangan cross-site scripting) untuk mempecahkan kode.

Petunjuk penting tentang keamanan formulir PHP

Variabel $_SERVER["PHP_SELF"] dapat dipecahkan penyerang!

Jika halaman Anda menggunakan PHP_SELF, pengguna dapat memasukkan garis bawah dan melaksanakan skrip cross-site (XSS).

Petunjuk:Cross-site Scripting (XSS) adalah jenis kelebihan keamanan komputer, yang sering terjadi di aplikasi Web. XSS dapat membuat penyerang memasukkan skrip klien ke halaman web yang diakses pengguna lain.

Dengan asumsi halaman kami yang bernama "test_form.php" memiliki formulir seperti berikut:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Sekarang, jika pengguna mengakses URL yang normal di bilah alamat: "http://www.example.com/test_form.php" kode di atas akan diubah menjadi:

<form method="post" action="test_form.php">

Sampai saat ini, semuanya normal.

Namun, jika pengguna mengetik URL di bilah alamat seperti berikut:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Dalam kasus ini, kode di atas akan diubah menjadi:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Kode ini menambahkan skrip dan perintah tanda. Dan ketika halaman ini dimuat, kode JavaScript akan dieksekusi (pengguna akan melihat kotak pesan). Ini hanya contoh sederhana dan tanpa bahaya tentang bagaimana variabel PHP_SELF digunakan.

Anda harus menyadari Tag <script> dapat menambahkan kode JavaScript apapun!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等。

如果避免 $_SERVER["PHP_SELF"] 被利用?

通过使用 htmlspecialchars() 函数能够避免 $_SERVER["PHP_SELF"] 被利用。

表单代码是这样的:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);>"

htmlspecialchars() 函数把特殊字符转换为 HTML 实体。现在,如果用户试图利用 PHP_SELF 变量,会导致如下输出:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

无法利用,没有危害!

通过 PHP 验证表单数据

我们要做的第一件事是通过 PHP 的 htmlspecialchars() 函数传递所有变量。

在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:

<script>location.href('http://www.hacked.com')</script>

- 代码不会执行,因为会被保存为转义代码,就像这样:

<script>location.href('http://www.hacked.com')</script>

现在这条代码显示在页面上或 e-mail 中是安全的。

在用户提交该表单时,我们还要做两件事:

  1. (通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
  2. (通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠(\)

接下来我们创建一个检查函数(相比一遍遍地写代码,这样效率更好)。

我们把函数命名为 test_input()。

现在,我们能够通过 test_input() 函数检查每个 $_POST 变量,脚本是这样的:

实例

<?php
// 定义变量并设置为空值
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Contoh Berjalan

Harap dicatat di awal skrip, kami memeriksa apakah formulir sudah disubmit menggunakan $_SERVER["REQUEST_METHOD"]. Jika REQUEST_METHOD adalah POST, maka formulir sudah disubmit - dan harus disahkan. Jika belum disubmit, lompat ke pengesahan dan tampilkan formulir kosong.

Namun, dalam contoh di atas, semua input field adalah opsional. bahkan jika pengguna belum memasukkan data apapun, skrip masih dapat berjalan dengan lancar.

Langkah berikutnya adalah membuat input wajib dan membuat pesan kesalahan yang digunakan saat diperlukan.