`

PHP表单教程(2)

    博客分类:
  • PHP
PHP 
阅读更多

【前言】

       在之前文章PHP表单教程(1) 的基础上,今天继续总结PHP表单相关的知识点,在这里记录总结下

 

【列表】

 (1)表单验证安全相关

         包含PHP表单安全性,超全局变量$_SERVER["PHP_SELF"] ,htmlspecialchars(特殊字符) 函数

 (2)验证表单数据

 (3)表单必填验证及错误提示

 (4)表单数据验证及错误提示

 (5)防止表单提交数据后清空

 (6)完整的表单实例

 

【主体】

 (1)表单验证安全相关

处理PHP表单时安全性十分重要,下面介绍下如何安全的处理PHP表单。

对于HTML表单信息进行适当验证,对于防止垃圾信息和黑客十分重要。

 

   ①表单验证案例

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
    Name: <input type="text" name="name"><br>
    E-mail: <input type="text" name="email"><br>
    Website: <input type="text" name="website"><br>
    Comment: <textarea name="comment" rows="5" cols="40"></textarea><br>
Gender:
    <input type="radio" name="gender" value="female">Female
    <input type="radio" name="gender" value="male">Male
</form>

    当提交此表单时,通过 method="post" 发送表单数据

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

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

     ③什么是 htmlspecialchars() 函数?

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

     ④PHP 表单安全性

     $_SERVER["PHP_SELF"] 变量能够被黑客利用!如果您的页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS),关于XSS我在后面文章做介绍

      黑客可以在地址栏中键入更改的URL,在其后植入一段脚本,当此页面加载后,就会执行代码。而且<script> 标签内能够添加任何JS代码(15-50k)!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等

     注意:不要用Chrome测试,因为Chrome会自动拦截,踩了一下午坑才查出来问题是浏览器拦截

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

   通过使用 htmlspecialchars(html特殊字符) 函数能够避免 $_SERVER["PHP_SELF"] 被利用,

   原理:htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体,如果用户试图利用 PHP_SELF 变量,会输出实体字符,使得植入的脚本无法执行

   & (和号) 成为 &

   " (双引号) 成为 "

   ' (单引号) 成为 '

   < (小于) 成为 <

   > (大于) 成为 >

     

(2)验证表单数据

   了解了表单验证安全相关后,我们要做的第一件事是通过 PHP 的 htmlspecialchars() 函数传递所有变量。

   在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:

<script>location.href('http://www.baidu.com')</script>

   即使这样导入脚本,代码不会执行,因为会被保存为转义代码,就像这样:

&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;

   在用户提交该表单时,我们还要做两件事:

       ①去除用户输入数据中不必要的字符(多余的空格、制表符、换行,通过 PHP trim() 函数)

       ②删除用户输入数据中的反斜杠(\,通过 PHP stripslashes() 函数)

    接下来我们创建一个检查函数test_input(相比一遍遍地写代码,这样效率更好)。现在,我们能够通过 test_input() 函数检查每个 $_POST 变量,脚本是这样的:

    案例:

<!DOCTYPE html>
<html>
<title>PHP测试demo</title>
<style type="text/css">
        *{margin:0;padding:0}
</style>
<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>
   电邮:<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."<br>";
echo $email."<br>";
echo $website."<br>";
echo $comment."<br>";
echo $gender;
?>
</body>
</html>

   代码详解:

   ①超全局变量$_SERVER的元素$_SERVER['REQUEST_METHOD'],作用:返回访问页面使用的请求方法(例如 POST)

    ②$_POST 变量用于收集来自 method=”post” 的表单中的值

$_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值。$_POST 变量用于收集来自 method=”post” 的表单中的值,带有 POST 方法的表单发送的信息,任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制

 

(3)表单必填验证及错误提示

   在上面的例子中,所有输入字段都是可选的。即使用户未输入任何数据,脚本也能正常工作。接下来制作必填输入字段,并创建需要时使用的错误消息。

   在下面的代码中我们增加了新变量:$nameErr。错误变量会保存被请求字段的错误消息,接下来为每个 $_POST 变量添加了一个 if else 语句。这条语句检查 $_POST 变量是否为空(通过 PHP empty() 函数)。如果为空,则错误消息会存储于不同的错误变量中。如果不为空,则通过 test_input() 函数发送用户输入数据:

   案例:

<!DOCTYPE html>
<html>
<title>PHP测试demo</title>
<style type="text/css">
        *{margin:0;padding:0}
        .error {color: #FF0000;}
    </style>
<body>
<?php
// 定义变量并设置为空值
$nameErr = = "";
$name =  = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
   if (empty($_POST["name"])) {
     $nameErr = "姓名是必填的";
   } else {
     $name = test_input($_POST["name"]);
   }
}
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">
   <span class="error">* <?php echo $nameErr;?></span><br>
   <input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name;
?>
</body>
</html>
   详解:

   上个案例,还有一个问题:检验数据的函数放到HTML布局标签后的时候,会运行异常,暂未解决疑惑??

 

(4)表单数据验证及错误提示

   接下来是验证具体输入数据,例如“Name 字段是否只包含字母和空格?”,以及“E-mail 字段是否包含有效的电子邮件地址语法?”,并且如果填写了 Website 字段,“这个字段是否包含了有效的 URL?”等

   例如验证名字:

   以下代码展示的简单方法检查 name 字段是否包含字母和空格。如果 name 字段无效,则存储一条错误消息。preg_match() 函数检索字符串的模式,如果模式存在则返回 true,否则返回 false

if ($_SERVER["REQUEST_METHOD"] == "POST") {
   $name = test_input($_POST["name"]);
   if (!preg_match("/^[a-zA-Z ]*$/",$name)) {//检索字符串的模式
     $nameErr = "只允许字母和空格!";
   }else if(empty($name)){
     $nameErr = "不允许为空";
   }else{
        $name = test_input($_POST["name"]);
   }
}
   注意:除了if...elseif....else 条件语句执行,我还试过switch,不过有局限性(switch只能传递一个值)

 

(5)接下来讲解下如何防止表单在用户提交表单后清空所有输入字段 

以下为提交表单后保留输入字段中的值详解

   如果想保留显示提交的数据,仅需在输入字段的 value 属性中增加一小段 PHP 脚本即可,例如

姓名:<input type="text" name="name" value="<?php echo $_POST["name"]?>">
  另外附上一段防止单选清空的代码:
<input type="radio" name="gender"
   <?php if (isset($gender) && $gender=="female") echo "checked";?>
   value="female">Female
   <input type="radio" name="gender"
   <?php if (isset($gender) && $gender=="male") echo "checked";?>
   value="male">Male<br>
   代码解析:isset()一般用来检测变量是否设置,例如单选是否选定状态

 

(6)完整的表单实例

<!DOCTYPE HTML> 
<html>
<head>
<title>PHP测试demo</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 = "无效的 email 格式"; 
     }
   }
   if (empty($_POST["website"])) {
     $website = "";
   } else {
     $website = test_input($_POST["website"]);
     // 检查 URL 地址语法是否有效(正则表达式也允许 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">
   <span class="error">* <?php echo $nameErr;?></span>
   <br><br>
   电邮:<input type="text" name="email">
   <span class="error">* <?php echo $emailErr;?></span>
   <br><br>
   网址:<input type="text" name="website">
   <span class="error"><?php echo $websiteErr;?></span>
   <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">男性
   <span class="error">* <?php echo $genderErr;?></span>
   <br><br>
   <input type="submit" name="submit" value="提交"> 
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name."<br>";
echo $email."<br>";
echo $website."<br>";
echo $comment."<br>";
echo $gender;
?>
</body>
</html>
 

 

 

【总结】

(1)PHP常用函数

     ①empty()检验是否为空;

         对比:isset()一般用来检测变量是否设置,例如单选是否选定状态

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

     ③trim()去除输入数据中不必要的字符(多余的空格、制表符、换行)

     ④stripslashes()去除输入数据中的反斜杠(\)

     ⑤preg_match() 检索字符串的模式,如果模式存在则返回 true,否则返回 false

(2)变量

     ①预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值

     ②超全局变量$_SERVER,许多属性,以下列举了几个常见的

     ③$_SERVER["PHP_SELF"] 是一种超全局变量,它返回当前执行脚本的文件名

     ④$_SERVER['REQUEST_METHOD']超全局变量,返回访问页面使用的请求方法(例如 POST)

 

.

分享到:
评论

相关推荐

    头歌PHP语言之表单进阶

    头歌PHP语言之表单进阶 教程 四关教程

    PHP 基础实例教程(PHP网页实例版)

    PHP nl2br()格式化输出 PHP 打印格式化输出 PHP 字符串的整理 PHP 改变字符串中字母的大小写 PHP 处理特殊字符 访问表单变量 PHP 表单变量(POST方法) PHP 表单变量(GET方法) PHP 字符串的连接 PHP heredoc语法 PHP ...

    form_php简单表单验证页面_

    总结起来,"form_php简单表单验证页面"项目是一个基础的PHP教程,涵盖了HTML表单创建、PHP接收和验证表单数据、错误处理以及用户体验优化等多个方面,是学习PHP web开发的良好起点。通过这个项目,初学者可以理解...

    web表单设计器扩展 php示例

    总的来说,"web表单设计器扩展 php示例"是一个关于如何在PHP环境下开发和扩展表单设计功能的实践教程。通过学习和实践,开发者不仅可以创建出功能丰富的表单,还能提升自己在前端和后端开发方面的能力,更好地服务于...

    php教程 php教程

    这个“PHP教程”显然涵盖了学习PHP编程的基础和进阶内容,让我们来深入探讨一下PHP的核心概念、语法结构以及在实际应用中的重要性。 1. PHP基础: - **安装与配置**:PHP可以在多种操作系统上运行,如Windows、...

    HTML5系列教程-HTML5表单提交和PHP环境搭建

    在"HTML5系列教程-HTML5表单提交和PHP环境搭建"中,我们将深入探讨两个核心主题:HTML5表单的新特性以及如何配置PHP开发环境。 首先,HTML5对表单元素进行了大幅度的升级,提供了更多的输入类型,如`...

    PHP基础到高级开发教程-24 PHP的表单.mp4

    PHP基础到高级开发教程-24 PHP的表单.mp4

    表单验证详细教程(chm)

    《表单验证详细教程》是一本专注于Web开发中表单验证技术的指南,主要针对HTML、JavaScript以及服务器端验证进行深入讲解。表单验证在Web应用程序中起着至关重要的作用,它确保用户输入的数据符合预设的规范,从而...

    PHP与HTML表单的综合应用.rar

    本教程以"PHP与HTML表单的综合应用"为主题,旨在教你如何设计并处理一个基于PHP的个人简历登记表,帮助用户输入和提交个人信息。 一、HTML表单基础 HTML表单是网页中用于用户输入数据的元素集合,通过`&lt;form&gt;`标签...

    PHP v4 动态网站开发实用教程

    这本教程覆盖了PHP的基础语法、数据库交互、表单处理、session与cookie管理、错误与日志处理、文件操作以及安全防护等多个关键领域。 1. PHP基础语法:PHP是一种服务器端脚本语言,其语法结构清晰,易于学习。教程...

    PHP Web应用开发教程.rar

    2. POST和GET方法:理解这两种HTTP请求方法,以及如何在PHP中接收和处理表单数据。 3. 验证和过滤:使用PHP对用户输入进行验证,防止SQL注入和XSS攻击。 五、PHP文件操作 1. 文件系统操作:包括文件的创建、读取、...

    PHP初级入门教程二本

    5. **表单处理**:讲解如何使用PHP接收和处理HTTP表单数据,进行用户输入验证。 6. **错误与异常处理**:指导如何正确地捕获和处理运行时错误,以及利用异常处理机制提高代码健壮性。 第二本教程《PHP基础教程.pdf...

    PHP自学教程 详细教程

    **PHP自学教程 详细教程** PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛应用于Web开发的开源脚本语言,尤其适用于服务器端编程。它具有语法简单、功能强大、学习曲线平缓等优点,使得许多初学者选择...

    传智播客_韩顺平_php从入门到精通 视频教程 第006讲

    传智播客_韩顺平_php从入门到精通 视频教程 第006讲 浮动窗口 表单及表单控件

    php十大项目php开发教程

    PHP支持多种数据库系统,如MySQL,可以处理表单数据、生成动态网页、执行数据库操作等。其语法结构与C语言相似,易于学习,但同时也具备强大的功能。 "PHP经典教程"部分,可能包含了一系列的基础教学,比如变量声明...

    PHP专业基础教程PHP专业基础教程

    **PHP专业基础教程** PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛使用的开源脚本语言,尤其适用于Web开发,可以嵌入到HTML中使用。PHP的设计目标是使创建动态生成页面变得简单,其语法吸收了C语言、...

    史上最全PHP5基础精讲教程

    ...Output Control输出函数.doc ...PHP表单处理.doc PHP语法-数组.doc PHP随机显示目录下图片的源码.doc strlen与mb_strlen字符串长度函数.doc strtok()函数实际应用.doc 文件函数.txt 研究批量删除数据的方法.doc

    PHP网站开发案例教程

    2. **MySQL数据库**:讲解如何创建、管理数据库以及操作表,包括SQL查询语言的基础知识,如SELECT、INSERT、UPDATE和DELETE语句,以及如何在PHP中与MySQL交互,实现数据的读取、写入和更新。 3. **PHP与MySQL结合**...

    PHP英文教程

    2. PHP的基础功能和应用 教程指出了PHP能够为开发者带来的便利,包括但不限于: - 减少构建大型网站所需时间。 - 基于从用户那里搜集的信息,为访问者提供定制化的用户体验。 - 为在线工具开启无限可能性,PHP网站...

    PHP学习视频教程 由浅入深.zip

    PHP实战部分可能包括创建动态网站、实现用户注册登录系统、处理表单数据、构建CMS(内容管理系统)等常见Web应用开发任务。通过实战项目,学习者可以将所学理论知识运用到实际场景中,从而增强解决问题的能力。 ...

Global site tag (gtag.js) - Google Analytics