Pengesahan borang PHP

Pengesahan Borang PHP

Dalam bab ini kami akan memperkenalkan cara menggunakan PHP untuk mengesahkan data borang yang dihantar oleh pelanggan.

Input pengguna hendaklah disahkan (melalui skrip klien) apabila boleh. Pengesahan penyemak imbas lebih pantas dan mengurangkan beban pada pelayan.

Jika input pengguna perlu dimasukkan ke dalam pangkalan data, anda harus mempertimbangkan untuk menggunakan pengesahan pelayan. Cara yang baik untuk mengesahkan borang pada pelayan adalah dengan menghantar borang itu kepada dirinya sendiri, dan bukannya melompat ke halaman lain. Dengan cara ini pengguna boleh mendapatkan mesej ralat pada halaman borang yang sama. Ia akan lebih mudah bagi pengguna untuk mencari ralat.

Kita 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 tersebut.

Contoh pengesahan borang PHP

QQ图片20161009114426.png

Borang di atas menggunakan peraturan pengesahan berikut:

QQ图片20161009114556.png

Mula-mula kita lihat kod HTML tulen borang ini:

Medan teks

nama, e-mel dan tapak web ialah elemen input teks dan medan ulasan ialah kotak teks. Kod HTML adalah seperti ini:

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



Butang radio

Medan jantina ialah butang Pilih tunggal, kod HTML adalah seperti ini:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Elemen borang

Kod HTML untuk borang adalah seperti ini:

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

Apabila borang ini diserahkan, data borang dihantar melalui method="post".


Apakah pembolehubah $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] ialah pembolehubah super global yang mengembalikan nama fail bagi 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).


Peringatan penting tentang keselamatan borang PHP

$_SERVER["PHP_SELF"] boleh dieksploitasi oleh penggodam!

Jika halaman anda menggunakan PHP_SELF, pengguna boleh memasukkan garis bawah dan melaksanakan skrip merentas tapak (XSS).

Petua: Penskripan silang tapak (XSS) ialah sejenis kerentanan keselamatan komputer yang biasa ditemui dalam aplikasi web. XSS membolehkan penyerang memasukkan skrip sebelah klien ke dalam halaman web yang dilihat oleh pengguna lain.


Andaikan kita mempunyai borang berikut dalam halaman bernama "test_form.php":

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

Sekarang, jika pengguna memasukkan URL biasa dalam bar alamat: "http://www.php.cn /test_form.php", kod di atas akan ditukar kepada:

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

Sehingga kini , semuanya normal.

Walau bagaimanapun, jika pengguna menaip URL berikut dalam bar alamat:

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

Dalam kes ini, kod di atas akan ditukar kepada:

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

Kod ini menambah skrip dan arahan segera. Dan apabila halaman dimuatkan, kod JavaScript akan dilaksanakan (pengguna akan melihat petua alat). Ini hanyalah contoh mudah dan tidak berbahaya tentang cara pembolehubah PHP_SELF boleh dieksploitasi.


Anda harus sedar bahawa teg <skrip> boleh mengandungi sebarang kod JavaScript! Penggodam boleh mengubah hala pengguna ke fail pada pelayan lain dan kod hasad dalam fail itu boleh menukar pembolehubah global atau menyerahkan borang ke alamat lain untuk menyimpan data pengguna, dsb.


Bagaimana untuk mengelakkan $_SERVER["PHP_SELF"] daripada dieksploitasi?

Menggunakan fungsi htmlspecialchars() boleh menghalang $_SERVER["PHP_SELF"] daripada dieksploitasi.

Kod borang adalah seperti ini:

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

fungsi htmlspecialchars() menukar aksara khas kepada entiti HTML. Sekarang, jika pengguna cuba mengeksploitasi pembolehubah PHP_SELF, ia akan menghasilkan output berikut:

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

Tidak boleh dieksploitasi, tiada bahaya!


Sahkan data borang melalui PHP

Kita perlu lakukan Perkara pertama ialah lulus semua pembolehubah melalui fungsi htmlspecialchars() PHP

Selepas kita menggunakan fungsi htmlspecialchars(), jika pengguna cuba menyerahkan perkara berikut dalam teks. medan:

< ;script>location.href('http://www.php.cn')</script>

- Kod tidak akan dilaksanakan kerana ia akan disimpan sebagai kod melarikan diri, seperti Seperti ini:

<script>location.href('http://www.php.cn')</script>

Kini kod ini dipaparkan pada halaman atau dalam e- mel selamat.

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().


Meneruskan pembelajaran
||
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</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>
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!