Manual belajar ...login
Manual belajar kendiri lengkap PHP
pengarang:php.cn  masa kemas kini:2022-04-15 13:53:54

Pengesahan borang PHP



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


Pengesahan borang PHP

Note
Note在处理PHP表单时我们需要考虑安全性。

本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。

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

1021.pngBorang HTML yang diperkenalkan dalam bab ini mengandungi medan input berikut: Mesti digunakan dengan medan teks pilihan, butang radio dan butang serah:

Instance
<!DOCTYPE HTML> 
<html>
<head>
<meta charset="utf-8">
<title>PHP中文网(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>

Jalankan Instance»

Klik butang "Run Instance" untuk melihat contoh dalam talian

字段验证规则
名字必须。 +只能包含字母和空格
E-mail必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')
网址必须。如果存在,它必须包含一个有效的URL
备注必须。 多行输入字段(文本域)
性别必须。 必须选择一个

Peraturan pengesahan borang di atas adalah seperti berikut:


Mula-mula mari lihat HTML tulen Kod borang:

Medan teks

Medan "Nama", "E-mel" dan "Laman Web" ialah elemen input teks dan " Catatan" medan ialah textarea. Kod HTML kelihatan seperti ini:

“名字”: <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 dan kod HTML kelihatan seperti ini:
Jantina :
<input type="radio" name="gender" value="female">女
<input type="radio" name="gender" value="male">男

Elemen borang
Kod borang HTML adalah seperti berikut:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Borang ini menggunakan
method= "post"
Note什么是 $_SERVER["PHP_SELF"] 变量?

$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。
kaedah untuk menyerahkan data. <🎜><🎜>
Note<🎜>Apakah pembolehubah $_SERVER["PHP_SELF"]?<🎜><🎜>< 🎜 > $_SERVER["PHP_SELF"] ialah pembolehubah super global yang mengembalikan nama fail skrip yang sedang dilaksanakan dan berkaitan dengan akar dokumen.

Jadi, $_SERVER["PHP_SELF"] akan menghantar data borang ke halaman semasa dan bukannya melompat ke halaman lain.

NoteApakah kaedah htmlspecialchars()?
Note什么是 htmlspecialchars()方法?

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号) 成为 &amp;

  • " (双引号) 成为 &quot;

  • ' (单引号) 成为 &#039;

  • < (小于) 成为 <

  • > (大于) 成为 >


fungsi htmlspecialchars() Tukar beberapa aksara yang dipratentukan kepada entiti HTML.
Aksara yang dipratentukan ialah:

& (ampersand) menjadi &

  • " (petikan berganda) menjadi "

  • ' (petikan tunggal) menjadi '
    NoteXSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
  • <🎜>(kurang daripada) menjadi< ;<🎜>
  • <🎜>> (lebih besar daripada) menjadi><🎜>
  • < 🎜><🎜><🎜>Apakah yang perlu kita perhatikan dalam bentuk PHP <🎜><🎜>$_SERVER["PHP_SELF"] boleh digunakan oleh penggodam <🎜><🎜>Apabila penggodam menggunakan silang Apabila HTTP? pautan skrip tapak web diserang, pembolehubah pelayan $_SERVER["PHP_SELF"] juga akan diimplan dalam skrip Sebabnya ialah skrip rentas tapak dilampirkan pada laluan fail boleh laku, jadi aksara $. _SERVER["PHP_SELF"] Rentetan akan mengandungi kod JavaScript di belakang pautan HTTP <🎜><🎜>.

    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, memandangkan 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('hacked')</script>
    menambahkan teg skrip pada kod dan menambah arahan amaran. 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. Kod hasad boleh dilindungi dalam fail kod 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 fungsi htmlspecialchars().

    Kod borang kelihatan seperti ini:

    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
    htmlspecialchars() Tukar beberapa aksara yang dipratentukan kepada entiti HTML. Sekarang jika pengguna ingin mengambil kesempatan daripada Pembolehubah PHP_SELF, hasilnya akan dikeluarkan seperti berikut:
    <form method="post" action="test_form.php/"><script>alert('hacked')</script>">
    gagal mencuba kelemahan ini!

    Gunakan PHP untuk mengesahkan data borang

    Pertama sekali, kami memproses semua data yang diserahkan oleh pengguna melalui fungsi htmlspecialchars() PHP.

    Apabila kita menggunakan fungsi htmlspecialchars(), apabila pengguna cuba menyerahkan medan teks berikut:

    <script>location.href('http://www.php.cn')</script>
    kod tidak akan dilaksanakan kerana ia akan disimpan sebagai HTML escape Kodnya adalah seperti berikut:
    <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. 1 Gunakan fungsi PHP trim() untuk mengalih keluar maklumat yang tidak berkaitan data input pengguna (seperti ruang, tab, baris baharu).

    2. 2 Gunakan fungsi PHP stripslashes() untuk membuang garis miring ke belakang dalam data input pengguna()

    Seterusnya mari kita menapis ini Fungsinya ialah ditulis dalam fungsi yang ditakrifkan oleh kami sendiri, yang boleh meningkatkan kebolehgunaan semula kod dengan banyak.

    Namakan fungsi test_input().

    Kini, kita boleh mengesan semua pembolehubah dalam $_POST melalui fungsi test_input() Kod skrip adalah seperti berikut:

    Instance

    <!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="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>

    Jalankan Instance»

    Klik butang "Run Instance" untuk melihat contoh dalam talian

    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.

    Tutorial praktikal yang disyorkan: "Pengesahan Borang PHP"

    Dalam bab seterusnya kami akan memperkenalkan cara melakukan pengesahan pada data yang dimasukkan oleh pengguna.

    Laman web PHP Cina