Pengesahan formulir PHP
- Halaman Sebelumnya Pemrosesan Formulir PHP
- Halaman Berikutnya Formulir PHP Wajib Diisi
本节和下一节讲解如何使用 PHP 来验证表单数据。
Pengesahan formulir PHP
Petunjuk:Ketika memproses formulir PHP, harap perhatikan keamanan!
Halaman ini akan menunjukkan bagaimana untuk memproses formulir PHP dengan aman. Pemvalidan data formulir HTML untuk mencegah penyerangan hacker dan spam adalah penting!
Formulir HTML yang akan digunakan nanti mengandung berbagai jenis bidang input: bidang teks diperlukan dan pilihan, tombol pilihan dan tombol kirim:
Formulir di atas menggunakan aturan pengesahan berikut:
Kolom | Aturan pengesahan |
---|---|
Nama | Diperlukan. Harus mengandung huruf dan spasi. |
E-mel | Diperlukan. Harus mengandung alamat email yang valid (termasuk @ dan .). |
Laman web | Pilihan. Jika diisi, maka harus mengandung URL yang valid. |
Komentar | Pilihan. Bidang input teks berbaris berbagai. |
Gender | Diperlukan. Harus memilih salah satu. |
Pertama-tama lihat kode HTML asli formulir ini:
Kolom teks
name, email dan website adalah elemen input teks, comment adalah kotak teks. Kode HTMLnya seperti ini:
Nama: <input type="text" name="name"> E-mel: <input type="text" name="email"> Laman web: <input type="text" name="website"> Komentar: <textarea name="comment" rows="5" cols="40"></textarea>
Tombol pilihan
gender adalah tombol pilihan tunggal, kode HTMLnya seperti ini:
Gender: <input type="radio" name="gender" value="female">Female <input type="radio" name="gender" value="male">Male
Elemen formulir
Kode HTML formulir seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>
Ketika mengirim formulir ini, data formulir akan diirimkan melalui method="post".
Apa itu variabel $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] adalah variabel global yang mengembalikan nama berkas skrip yang sedang dijalankan.
Sebagai contoh, $_SERVER["PHP_SELF"] akan mengirimkan data formulir ke halaman sendiri, bukannya melompat ke halaman lain. Dengan cara ini, pengguna dapat memperoleh informasi peringatan kesalahan di halaman formulir.
Apakah fungsi htmlspecialchars()?
Fungsi htmlspecialchars() mengubah huruf khas menjadi entiti HTML. Ini berarti huruf HTML seperti < dan > akan diganti dengan < dan >. Ini dapat mencegah penyerang menggunakan HTML atau kod JavaScript (penyerangan cross-site scripting) untuk mengeksploitasi kod.
Petunjuk penting tentang keselamatan formulir PHP
Variable $_SERVER["PHP_SELF"] boleh digunakan 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 kelemahan keamanan komputer, biasa terdapat di aplikasi Web. XSS dapat memungkinkan penyerang untuk memasukkan skrip klien ke halaman web yang diunggah pengguna lain.
Dengan asumsi halaman kami yang dinamakan "test_form.php" mempunyai formulir seperti berikut:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Sekarang, jika pengguna memasuki URL yang normal di papan alamat: "http://www.example.com/test_form.php", kod di atas akan diubah menjadi:
<form method="post" action="test_form.php">
Sampai kini, semuanya normal.
Walau bagaimanapun, jika pengguna memasukkan URL seperti berikut di papan alamat:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
Dalam keadaan ini, kod di atas akan diubah menjadi:
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
Kod ini menambahkan satu skrip dan perintah pemberitahuan. Dan apabila halaman ini dimuatkan, kod JavaScript akan dijalankan (pengguna akan melihat kotak pemberitahuan). Ini hanya satu contoh yang sederhana dan tanpa bahaya tentang bagaimana variable PHP_SELF digunakan.
Anda sepatutnya menyedari Tanda <script> boleh menambahkan mana-mana kod JavaScript!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等。
如果避免 $_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 中是安全的。
在用户提交该表单时,我们还要做两件事:
- (通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
- (通过 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; } ?>
Perhatikan di awal skrip, kami memeriksa sama ada formulir digunakan $_SERVER["REQUEST_METHOD"] untuk disampaikan. Jika REQUEST_METHOD adalah POST, maka formulir telah disampaikan - dan seharusnya disahkan. Jika belum disampaikan, lompatkan pengesahan dan tunjukkan formulir kosong.
Bagaimanapun, dalam contoh di atas, semua medan input adalah pilihan. Ia mengandungi pengguna yang belum memasukkan sebarang data, skrip masih akan beroperasi dengan baik.
Langkah berikutnya adalah membuat medan input wajib diisi, dan membuat pesan kesalahan yang digunakan sewaktu diperlukan.
- Halaman Sebelumnya Pemrosesan Formulir PHP
- Halaman Berikutnya Formulir PHP Wajib Diisi