Tutorial asas pembangunan PHP Pengesahan borang PHP
1. Pengesahan borang PHP
Dalam bab ini kami akan memperkenalkan cara menggunakan PHP untuk mengesahkan data borang yang dihantar oleh pelanggan.
Nota: Kami perlu mempertimbangkan keselamatan semasa memproses borang PHP. Dalam bab ini kami akan menunjukkan pemprosesan data borang PHP yang selamat Untuk mengelakkan penggodam dan spam, kami perlu melakukan pengesahan keselamatan data pada borang.
Borang HTML yang diperkenalkan dalam bab ini mengandungi medan input berikut: Medan teks yang diperlukan dan pilihan, butang radio dan butang hantar.
2. Contoh paparan
Kod adalah seperti berikut:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>php.cn</title> <style> .error {color: #FF0000;} </style> </head> <body> <?php // 定义变量并默认设置为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的"; } else { $name = test_input($_POST["name"]); // 检测名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "邮箱是必需的"; } else { $email = test_input($_POST["email"]); // 检测邮箱是否合法 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法邮箱格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 检测 URL 地址是否合法 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "非法的 URL 的地址"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必需的"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 表单验证实例</h2> <p><span class="error">* 必需字段。</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?php echo $name;?>"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?php echo $email;?>"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website" value="<?php echo $website;?>"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您输入的内容是:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
Kesan output adalah seperti yang ditunjukkan di sebelah kanan
3. Penjelasan praktikal
1.
2. Medan teks
Medan "Nama", "E-mel" dan "Laman Web" ialah elemen input teks dan "Catatan "medan ialah kawasan teks. Kod HTML adalah seperti berikut:"Nama": <input type="text" name="name">
E-mel: <input type="text" name ="email">Tapak web: <input type="text" name="website">Catatan: <textarea name="comment" rows="5 " cols="40"></textarea> 3. Butang radio"Jantina" Medan ialah butang radio dan kod HTML kelihatan seperti ini: Jantina:
<input type="radio" name="gender" value="female">Perempuan<input type="radio" name="gender" value="lelaki">Lelaki
4 Elemen bentuk
Kod borang HTML adalah seperti berikut:
- <form method="post" action="<?php echo htmlspecialchars($_SERVER[ "PHP_SELF "]);?>">
- Nota: Apakah pembolehubah $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] ialah pembolehubah super global yang mengembalikan nama fail yang sedang dilaksanakan skrip, dan berkaitan akar Dokumen.
Jadi, $_SERVER["PHP_SELF"] akan menghantar data borang ke halaman semasa dan bukannya melompat ke halaman lain.
Nota:
htmlspecialchars() menukar beberapa aksara yang telah ditetapkan kepada entiti HTML.
Watak yang dipratentukan ialah:
" Sebutharga) Menjadi '-
-
- 5.
- Pembolehubah $_SERVER["PHP_SELF"] boleh digunakan oleh penggodam!
Apabila penggodam menggunakan pautan HTTP skrip merentas tapak untuk menyerang, pembolehubah pelayan $_SERVER["PHP_SELF"] juga akan dibenamkan dalam skrip. Sebabnya ialah skrip rentas tapak dilampirkan pada laluan fail boleh laku, jadi rentetan $_SERVER["PHP_SELF"] akan mengandungi kod program JavaScript di belakang pautan HTTP. Nota: XSS juga dipanggil CSS (Cross-Site Skrip), serangan skrip merentas tapak. Penyerang berniat jahat memasukkan kod HTML berniat jahat ke dalam halaman Web Apabila pengguna menyemak imbas halaman, kod HTML yang dibenamkan dalam halaman Web akan dilaksanakan, dengan itu mencapai tujuan khas pengguna berniat jahat.
- Nyatakan nama fail borang berikut sebagai "test_form.php":
- <form method="post" action="test_form.php">
- Walau bagaimanapun, pertimbangkan bahawa pengguna akan memasukkan alamat berikut dalam bar alamat penyemak imbas:
- <form method="post" action="test_form.php/"><script>alert('digodam')</script>
-
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.
6. Bagaimana untuk mengelakkan $_SERVER["PHP_SELF"] dieksploitasi?
$_SERVER["PHP_SELF"] boleh lulus fungsi htmlspecialchars() untuk mengelak daripada dieksploitasi.
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/">< ;script>alert ('digodam')</script>">
Percubaan untuk mengeksploitasi kelemahan ini gagal!
7. Gunakan PHP untuk mengesahkan data borang
Mula-mula, kami memproses semua data yang diserahkan oleh pengguna melalui fungsi htmlspecialchars() PHP
Apabila kami menggunakan fungsi htmlspecialchars(). , pengguna cuba menyerahkan teks berikut:
<script>location.href('//m.sbmmt.com')</script>
Kod ini tidak akan dilaksanakan kerana ia akan disimpan sebagai kod melarikan diri HTML, seperti yang ditunjukkan di bawah:
<script>location.href('http:// m.sbmmt.com') </script>
Kod di atas selamat dan boleh dipaparkan seperti biasa pada halaman atau dimasukkan ke dalam e-mel
Apabila pengguna menyerahkan borang, kami akan melakukan dua perkara berikut:
Gunakan fungsi PHP trim() untuk mengalih keluar aksara yang tidak diperlukan (seperti ruang, tab. , baris baharu) dalam data input pengguna
- Gunakan fungsi PHP stripslashes() untuk mengalih keluar garis miring ke belakang dalam data input pengguna()
<?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; } ?>4. Ringkasan
Perhatikan bahawa 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 mengesahkan data yang dimasukkan oleh pengguna