pengesahan borang
Pengesahan Borang PHP
Dalam bab ini kami akan memperkenalkan cara menggunakan PHP untuk mengesahkan data borang yang dihantar oleh pelanggan.
Kita perlu mempertimbangkan keselamatan apabila berurusan dengan 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.
Borang HTML yang diperkenalkan dalam bab ini mengandungi medan input berikut: Mesti dengan medan teks pilihan, butang radio dan butang hantar:
<!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; } ?>
Mula-mula mari kita lihat kod Borang HTML tulen:
Medan teks
"名字", "E-mail", 及"网址"字段为文本输入元素,"备注"字段是 textarea。HTML代码如下所示: “名字”: <input type="text" name="name"> E-mail: <input type="text" name="email"> 网址: <input type="text" name="website"> 备注: <textarea name="comment" rows="5" cols="40"></textarea>
Butang radio
Medan "Jantina" ialah butang radio, kod HTML Seperti yang ditunjukkan di bawah:
Jantina:
<input type="radio" name="gender" value="female">Wanita
<input type= "radio" name ="gender" value="male">Lelaki
Elemen borang
Kod borang HTML adalah seperti Paparan berikut:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Borang ini menggunakan method=" kaedah pos" untuk menyerahkan data.
Apakah pembolehubah $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] ialah pembolehubah super global yang mengembalikan nilai skrip yang sedang dilaksanakan, yang berkaitan dengan akar dokumen.
Jadi, $_SERVER["PHP_SELF"] akan menghantar data borang ke halaman semasa dan bukannya melompat ke halaman lain.
Apakah kaedah htmlspecialchars()?
Fungsi htmlspecialchars() menukar beberapa aksara yang dipratentukan kepada entiti HTML.
· & (Dia) menjadi & amp; · 'Quote Single) menjadi ' >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 JavaScript di belakang kod Program HTTP
XSS, juga dikenali sebagai CSS (Skrip Merentas Tapak). , ialah serangan skrip merentas tapak di mana penyerang berniat jahat memasukkan kod HTML berniat jahat ke dalam halaman Web Apabila halaman dihalakan, kod html yang dibenamkan dalam Web akan dilaksanakan untuk mencapai tujuan khas pengguna jahat
.
Nyatakan nama fail borang berikut sebagai "test_form.php":
<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">
Ini tidak mengapa.
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%3E
URL di atas akan dihuraikan ke dalam kod berikut dan dilaksanakan:
<form method="post" action="test_form. php/"><script>alert('digodam')</script>
Teg skrip ditambah pada kod dan arahan amaran ditambah. 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"] daripada dieksploitasi?
$_SERVER["PHP_SELF"] boleh dielakkan dengan menggunakan htmlspecialchars( ) fungsi .
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 mengeksploitasi 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!
Gunakan PHP untuk mengesahkan data borang
Pertama sekali, kami memproses semua data yang diserahkan oleh pengguna melalui fungsi htmlspecialchars() PHP.
Apabila kami menggunakan fungsi htmlspecialchars(), pengguna cuba menyerahkan medan teks berikut:
<script>location.href('http://www.php.cn' )< ;/script>
Kod ini tidak akan dilaksanakan kerana ia akan disimpan sebagai kod HTML melarikan diri, seperti yang ditunjukkan di bawah:
<script>location.href('http: / /www.php.cn')</script>
Kod di atas adalah selamat dan boleh dipaparkan seperti biasa pada halaman atau dimasukkan ke dalam e-mel.
Apabila pengguna menyerahkan borang, kami akan melakukan dua perkara berikut:
1 Gunakan fungsi PHP trim() untuk mengalih keluar aksara yang tidak diperlukan (seperti ruang, tab) dalam pengguna. data input , baris baharu).
2. Gunakan fungsi PHP stripslashes() untuk mengalih keluar garis miring ke belakang dalam data input pengguna ()
Seterusnya, mari kita tulis fungsi penapisan ini dalam fungsi yang kita tentukan sendiri, yang boleh meningkatkan kebolehgunaan semula kod dengan banyak.
Namakan fungsi test_input().
Sekarang, kita boleh mengesan semua pembolehubah dalam $_POST melalui fungsi test_input() Kod skrip adalah seperti berikut:
Contoh
<?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 bahawa kami sedang melaksanakan. skrip di atas Apabila, $_SERVER["REQUEST_METHOD"] akan digunakan 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.
1. Gunakan fungsi PHP trim() untuk mengalih keluar aksara yang tidak diperlukan (seperti ruang, tab, baris baharu) dalam data input pengguna.
2. Gunakan fungsi PHP stripslashes() untuk mengeluarkan backslashes() dalam data input pengguna()
3. Gunakan fungsi test_input() untuk mengesan semua pembolehubah dalam $_POST