技术专区 \ PHP

【PHP 零基础入门教程】第二章 PHP表单 (2-2PHP 表单验证)

单选按钮 表单元素 Server-Php-Self ⋅ 2017-05-19 14:44:38

PHP 表单验证

 

  在处理PHP表单时我们需要考虑安全性。
  本章节将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。
  在本章节介绍的HTML表单中包含以下输入字段:必须与可选文本字段,单选按钮,及提交按钮。
实例:

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

程序运行结果:

上述表单验证规则如下:

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

 

文本字段:

  “名字”, “E-mail”, 及“网址”字段为文本输入元素text,“备注”字段是文本域textarea。
HTML代码如下所示:
名字: <input type="text" name="name" value="">
    E-mail: <input type="text" name="email" value="">
网址: <input type="text" name="website" value="">
备注: <textarea name="comment" rows="5" cols="40"></textarea>

表单元素:

HTML 表单代码如下所示:
  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"])";?>
  该表单使用 method="post" 方法来提交数据。

单选按钮:

  "性别"字段是 radio单选按钮。
HTML代码如下所示:
性别:
    <input type="radio" name="gender"  value="female">女
    <input type="radio" name="gender"  value="male">男


什么是htmlspecialchars()函数?

  htmlspecialchars()函数把特殊字符转换为HTML实体。这意味着< 和 >之类的HTML字符会被替换为&lt;和&gt;。这样可防止攻击者通过在表单中注入HTML或JavaScript代码(跨站点脚本攻击)对代码进行利用。

 

什么是$_SERVER["PHP_SELF"]变量?

  $_SERVER["PHP_SELF"]是一种超全局变量,它返回当前执行脚本的文件名。
  因此,$_SERVER["PHP_SELF"]将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。


关于 PHP 表单安全性的重要提示:

  $_SERVER["PHP_SELF"] 变量能够被黑客利用!
  如果您的页面使用了PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)又叫css。                          
  提示:跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于Web应用程序。XSS能够使攻击者向其他用户浏览的网页中输入客户端脚本。

假设我们的一张名为"test_form.php"的页面中有如下表单:
  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
  现在,我们使用URL来指定提交地址"test_form.php",以上代码修改为如下所示:
  <form method="post" action="test_form.php">
  这样做就很好了。
但是,考虑到用户会在浏览器地址栏中输入以下地址:
  http://www.php.cn/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
以上的URL中,将被解析为如下代码并执行:
  <form method="post"action="test_form.php/"><script>alert('hacked')</script>
  代码中添加了script标签,并添加了alert命令。当页面载入时会执行该Javascript代码(用户会看到弹出框)。这仅仅只是一个简单的实例来说明PHP_SELF变量会被黑客利用。

请注意:任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,代码可以修改全局变量或者获取用户的表单数据。


如何避免$_SERVER["PHP_SELF"]被利用?

  $_SERVER["PHP_SELF"]可以通过 htmlspecialchars()函数来避免被利用。
form 代码如下所示:
  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 把一些预定义的字符转换为 HTML 实体。现在如果用户想利用 PHP_SELF 变量, 结果将输出如下所示:
  <form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">
尝试该漏洞失败!

通过 PHP 验证表单数据:

  通过PHP的htmlspecialchars()函数传递所有变量。
  在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:
  <script>location.href('http://www.hacked.com')</script>
—代码不会执行,因为会被保存为转义代码,就像这样:
  &lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;
  现在这条代码显示在页面上或e-mail中是安全的。
在用户提交该表单时,我们还要做两件事:
1.  (通过PHP trim()函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
2.  (通过PHP stripslashes()函数)删除用户输入数据中的反斜杠(\)。
  接下来我们创建一个检查函数(相比一遍遍地写代码,这样效率更好)。
  我们把函数命名为test_input()。
  现在,我们能够通过test_input()函数检查每个$_POST 变量,脚本是这样的:
实例:

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

注意:我们在执行以上脚本时,会通过$_SERVER["REQUEST_METHOD"]来检测表单是否被提交 。如果REQUEST_METHOD是POST,表单将被提交—数据将被验证。如果表单未提交将跳过验证并显示空白。
  在以上实例中使用输入项都是可选的,即使用户不输入任何数据也可以正常显示。