Pengesahan borang PHP
Kita perlu mempertimbangkan keselamatan apabila berurusan dengan borang PHP.
Dalam bab ini kami akan menunjukkan pemprosesan keselamatan data borang PHP Untuk mengelakkan penggodam dan spam, kami perlu melakukan pengesahan keselamatan data pada borang.
Borang HTML yang diperkenalkan dalam bab ini mengandungi medan input berikut: Mesti dikaitkan dengan medan teks pilihan, butang radio , dan butang serah:
Instance
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>PHP.cn</title> </head> <body> <h2>PHP 表单验证实例</h2> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value=""> <br> E-mail: <input type="text" name="email" value=""> <br> 网址: <input type="text" name="website" value=""> <br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
Hasil berjalan program:
Peraturan pengesahan borang di atas adalah seperti berikut:
| <🎜> Peraturan pengesahan<🎜><🎜> | ||||||||||||
Name | Diperlukan. +Hanya boleh mengandungi huruf dan ruang | ||||||||||||
E-mel | Diperlukan; . + Mestilah alamat e-mel yang sah (mengandungi '@' dan '.') | ||||||||||||
Pilihan. Jika ada, ia mesti mengandungi URL yang sah | |||||||||||||
Catatan | Pilihan; . Medan input berbilang baris (medan teks) |
Mari kita pecahkan kod tersebut dan lihat:
Medan teks
Medan "Nama", "E-mel" dan "Laman Web" ialah elemen input teks dan medan "Catatan" ialah kawasan teks kawasan teks.
Kod HTML adalah seperti berikut:
Nama: <input type= " text" name="name" value="">
E-mel: <input type="text" name="email" value="">
Tapak web: <input type= " text" name="website" value="">
Nota: <textarea name="comment" rows="5" cols="40"></textarea>
Butang radio
Medan "Jantina" ialah butang radio
Kod HTML adalah seperti berikut:
Jantina:
<jenis input= " radio" name="gender" value="female">Perempuan
<input type="radio" name="gender" value="lelaki">Lelaki
Elemen borang
Kod borang HTML adalah seperti berikut:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"])";?>
Borang menggunakan kaedah method="post" untuk menyerahkan data.
Apakah pembolehubah $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] ialah pembolehubah superglobal yang mengembalikan nama fail skrip yang sedang dilaksanakan.
Oleh itu, $_SERVER["PHP_SELF"] menghantar data borang ke halaman itu sendiri dan bukannya melompat ke halaman lain. Dengan cara ini, pengguna boleh mendapatkan maklumat mesej ralat pada halaman borang.
Apakah fungsi htmlspecialchars()?
fungsi htmlspecialchars() menukar aksara khas kepada entiti HTML. Ini bermakna aksara HTML seperti < Ini menghalang penyerang daripada mengeksploitasi kod dengan menyuntik kod HTML atau JavaScript ke dalam bentuk (serangan skrip merentas tapak).
Petua Penting Mengenai Keselamatan Borang PHP
Pembolehubah $_SERVER["PHP_SELF"] boleh dieksploitasi oleh penggodam!
Jika halaman anda menggunakan PHP_SELF, pengguna boleh memasukkan garis bawah dan melaksanakan skrip merentas tapak (XSS), juga dikenali sebagai css. dengan XSS membolehkan penyerang memasukkan skrip sebelah klien ke dalam halaman web yang dilihat oleh pengguna lain.
Andaikan kita mempunyai halaman bernama "test_form.php" dengan borang berikut:
< ;form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Sekarang, kami menggunakan URL untuk menentukan alamat penyerahan "test_form.php", kod di atas diubah suai seperti berikut:
<form method=" post " action="test_form.php">Walau bagaimanapun, pertimbangkan bahawa pengguna akan memasukkan alamat berikut dalam bar alamat penyemak imbas:http://www.php.cn/test_form.php/% 22 %3E%3Cscript%3Ealert('hacked')%3C/script%3EBaiklah.
<form method="post" action="test_form.php/"><script>alert('digodam')</script>
URL di atas akan dihuraikan ke dalam kod berikut dan dilaksanakan:
Teg skrip telah ditambahkan pada kod dan arahan amaran telah ditambahkan. Kod Javascript ini akan dilaksanakan apabila halaman dimuatkan (pengguna akan melihat kotak pop timbul). Ini hanyalah contoh mudah bagaimana pembolehubah PHP_SELF boleh dieksploitasi oleh penggodam.
Sila ambil perhatian bahawa sebarang kod JavaScript boleh ditambah dalam teg <skrip> Penggodam boleh menggunakan ini untuk mengubah hala halaman ke halaman pelayan lain Fail kod halaman boleh melindungi kod hasad, dan kod itu boleh mengubah suai pembolehubah global atau mendapatkan data borang pengguna.
Bagaimana untuk mengelakkan $_SERVER["PHP_SELF"] dieksploitasi?
$ _SERVER ["PHP_SELF"] boleh dielakkan dengan menggunakan fungsi htmlspecialchars().
kod borang adalah seperti berikut:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]) ;?>">
htmlspecialchars() Tukar beberapa aksara yang dipratentukan kepada entiti HTML. Sekarang jika pengguna ingin menggunakan pembolehubah PHP_SELF, hasilnya akan dikeluarkan seperti berikut:
<form method="post" action="test_form.php/"> <skrip> makluman('digodam')</skrip>">
Gagal mencuba kerentanan ini!
Sahkan data borang melalui PHP
Perkara pertama yang perlu kita lakukan ialah lulus semua pembolehubah melalui fungsi htmlspecialchars() PHP.
Selepas kami menggunakan fungsi htmlspecialchars(), jika pengguna cuba menyerahkan perkara berikut dalam medan teks:
<script>location.href('http :/ /www.hacked.com')</script>
- Kod tidak akan dilaksanakan kerana ia akan disimpan sebagai kod yang dilepaskan, seperti ini:
<skrip>location.href('http://www.hacked.com')</script>
Kini kod ini ialah dipaparkan pada halaman Ia selamat dalam talian atau melalui e-mel.
Apabila pengguna menyerahkan borang, kita perlu melakukan dua perkara lagi:
1 (Melalui fungsi trim() PHP) Alih keluar aksara yang tidak diperlukan (ruang tambahan) dalam data input pengguna. , tab, baris baharu)
2. (melalui fungsi PHP stripslashes()) Alih keluar garis miring ke belakang dalam data input pengguna ()
Seterusnya kami mencipta fungsi semak (berbanding dengan Menulis kod berulang kali menjadikannya lebih cekap).
Kami menamakan fungsi test_input().
Sekarang, kita boleh menyemak setiap pembolehubah $_POST melalui fungsi test_input(), skripnya seperti ini:
Contoh
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>PHP中文网(php.cn)</title> </head> <body> <?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; } ?> <h2>PHP 表单验证实例</h2> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name"> <br><br> E-mail: <input type="text" name="email"> <br><br> 网址: <input type="text" name="website"> <br><br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br><br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <br><br> <input type="submit" name="submit" value="提交"> </form> <?php echo "<h2>您输入的内容是:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body>
Jalankan program dan lihat
Nota: Apabila kami melaksanakan skrip di atas, kami akan menggunakan $_SERVER["REQUEST_METHOD"] untuk mengesan sama ada borang telah diserahkan. Jika REQUEST_METHOD ialah POST, borang akan diserahkan - dan data akan disahkan. Jika borang tidak dihantar pengesahan akan dilangkau dan dipaparkan kosong.
Penggunaan item input dalam contoh di atas adalah pilihan dan boleh dipaparkan seperti biasa walaupun pengguna tidak memasukkan sebarang data.
Dalam bab seterusnya kami akan memperkenalkan cara untuk mengesahkan data yang dimasukkan oleh pengguna.