四种表单验证方法的分析和比较

后端基础PHP—表单验证 php基础 阅读详情
对交互站点而言,快速、高效、友好的表单验证有利于用户体验及站点维护。本文主要通过分析比较表单验证方法的优缺点,得出各方法相应的适用场合。

前言

任何可以交互的站点都有输入表单,只要有可能,就应该对用户输入的数据进行验证。无论服务器后端是什么样的系统,都不愿意把时间浪费在一些无效的信息上,必须对表单数据进行校验,若有不符合规定的表单输入,应及时返回并给出相应的提示信息。本文将列举四种不同原理的表单验证方法,并给出各方法在 PHP 服务器上的实现。

 




回页首


浏览器端验证

传统上,表单数据一般都通过浏览器端的 Javascript 验证。浏览器端的验证速度快,若有不符合要求的输入,响应信息快速的返回给用户。由于验证数据不需要提交给服务器,不会加重服务器的负载。一个浏览器端验证的过程如图 1 所示,表单提交,若通过验证则提交服务器处理,不成功则回馈给用户。


图 1. 浏览器端验证原理图
图 1. 浏览器端验证原理图

本文给出的各种表单验证方法 源代码 均以一个简单的表单为例,该表单包含“UserName”和“Password”两个文本输入框,及一个“Submit”按钮。代码清单 1 给出了浏览器端 Javascript 验证的例子。若“UserName”或“Password”输入不符合要求,通过弹出框的形式提示用户,并返回 false, 停止表单提交。


清单 1. 浏览器端 Javascript 验证代码

				  
 function validform(thisForm) 
   { 
      error_string = ""; 
      if((message=checkusername(thisForm.username))!="") 
        { 
          error_string="UserName:"
          error_string += message; 
          alert(error_string); 
          return false; 
         } 
      if((message = checkpassword(thisForm.pass))!="") 
        { 
          error_string="Password:"
          error_string += message; 
          alert(error_string); 
          return false; 
         }   
       return true;
    } 

 

从图 1 可以看出这种表单验证方法有一个致命的缺点,很多工具可以在表单检验过后、浏览器发送请求前截取表单数据,攻击者可以修改请求中的数据,从而绕过 JavaScript,将恶意数据注入服务器,这样会增加 XSS(全称 Cross Site Scripting)攻击的机率。对于一般的网站,都不赞成采用浏览器端的表单验证方法。

 




回页首


浏览器端和服务器端双重验证

浏览器端和服务器端双重验证方法在浏览器端验证方法基础上增加服务器端的验证,其原理如图 2 所示,该方法增加服务器端的验证,弥补了传统浏览器端验证的缺点。若表单输入不符合要求,浏览器端的 Javascript 验证能很快地给出响应,而服务器端的验证则可以防止恶意用户绕过 Javascript 验证,保证最终数据的准确性。


图 2. 浏览器端和服务器端双重验证原理图
图 2. 浏览器端和服务器端双重验证原理图

除了客户端 Javascript 验证,该方法增加了服务器端的 PHP 验证,示例代码如清单 2 所示,checkusername() 和 checkpassword() 是 PHP 语言 编写的两个验证接口函数,根据 $error 结果,确定表单的有效性。


清单 2. 服务器端表单的 PHP 验证

				  
 if(isset($_POST['username'])) 
 { 
  $usermsg  = checkusername($_POST['username']); 
  if($usermsg != '') 
    $error = true; 
  if(isset($_POST['pass'])) 
  { 
    $passmsg = checkpassword($_POST['pass']); 
    if($passmsg != '') 
    $error = true; 
  } 
 } 

 

此方法的缺点一目了然,必须维护两份代码实现相同的功能,增加开发人员的工作量,不利于后续开发。浏览器端和服务器端双重验证方法也存在一个风险,对有些表单验证的规则服务器也许不想公开给用户,而浏览器拷贝了服务器端验证的功能,向用户公布验证规则。

 




回页首


服务器端验证

综合上述两种验证方法,现在考虑使用服务器端的验证方法,该方法结构非常简单,其原理如图 3 所示。客户端负责表单提交,服务器端验证表单,若发现错误数据,则回传表单页面,错误信息被加到同一页面中。若验证通过,则处理表单。


图 3. 服务器端验证原理图
图 3. 服务器端验证原理图

此方法在遇到非法输入需要回传表单时,除了加载错误提示信息在此页面上,还必须注意,此时表单内容必须维持表单提交时的用户输入,这样用户才能将错误的表单输入与错误提示信息联系起来,有助于用户填入正确的输入。可以借助 DOM 技术 中的 appendChild 功能追加显示相关的错误的提示信息,其实现如代码清单 3 所示,其效果可以参考图 4。


清单 3. 利用 DOM 技术实现提示信息代码

				  
 find_obj = document.getElementsByName("username"); 
  var sp1 = document.createElement('span'); 
  sp1.className= 'formerror'; 
  sp1.appendChild(document.createTextNode(usermsg)); 
  find_obj[0].parentNode.appendChild(sp1); 

  find_obj = document.getElementsByName("pass"); 
  var sp2 = document.createElement('span'); 
  sp2.className= 'formerror'; 
  sp2.appendChild(document.createTextNode(passmsg)); 
  find_obj[0].parentNode.appendChild(sp2); 



图 4. 加载错误信息效果图
图 4. 加载错误信息效果图

由于验证交由服务器端处理,该方法的输入响应速度不如浏览器端验证,主要受网络繁忙及服务器荷载的影响。同时,若同一页面的其他表单耗时较大,此回传页面方法的响应时间会进一步加大。

 




回页首


基于 Ajax 技术的验证

基于 Ajax 技术的表单验证技术综合了服务器端验证,浏览器端及服务器端双重验证方法的优点,摒弃了两者的缺点。服务器端验证方法结构清晰,可以防止恶意攻击,其主要问题在于若输入错误表单信息,需重传整个页面,同时若同一页面有多个表单,回传整个页面可能会增加用户等待的时间。浏览器端及服务器端的双重验证响应速度快,其问题在于代码冗余。

基于 Ajax 技术的验证方法也需要做两次验证:首先是回馈验证,无论表单数据准确与否,服务器均给出反馈信息,其作用等同于双重验证中的浏览器端的验证;表单处理前的验证防止恶意修改,其作用等同于双重验证中的服务器端的验证。其原理如图 5 所示,一旦有表单提交,首先构建表单信息字段,交由 Ajax engine 发送给服务器端验证,服务器将验证结果发送给用户,客户端根据回馈信息,判断表单输入是否正常,在 Ajax 技术下,对用户而言,以上操作均在后台运行,不会影响当前页面各表单的状态。若是非法输入,则回馈提示信息给用户;若是正常输入,客户端将按照正常方法提交表单。为了防止恶意修改,表单处理之前还需验证,此步验证与之前验证共用代码。


图 5. 基于 Ajax 技术验证原理图
图 5. 基于 Ajax 技术验证原理图

有关 Ajax 技术的知识,可以参考 developerWorks 上的 系列文章。Ajax 核心概念之一是 XMLHttpRequest 对象,这是一个 JavaScript 对象,创建该对象时,各种浏览器方法有所不同,具体实现可以参考 源代码。

回馈验证主要涉及两个问题:首先是构建验证字段,其次是回馈信息的格式。

由于验证字段和正常表单字段共用验证代码,验证字段格式完全遵循表单提交时的格式。为某表单构建验证字段代码如清单 4 所示。其中 checkflag 字段的作用是区分两种验证。


清单 4. 构建验证字段代码

				  
 var postData = ""; 
 var fields = form.elements; 
 for (var i=0; i < fields.length; i++) { 
 if (fields[i].name != "") { 
	  type = fields[i].type; 
	   if ((type == 'radio') || (type == 'checkbox')) { 
	  	 if (!fields[i].checked) { continue; } 
    } 
 if ((type == 'submit')&&(!(fields[i].name == submitName))) { 
	   continue; 
 } 
 if (postData) { postData += "&"; } 
 postData += fields[i].name + "=" + encodeURIComponent(fields[i].value); 
          } 
 } 
     postData += "&checkflag=1"; 

 

回馈信息主要在浏览端的 Javascript 中处理,不同的格式需要不同的处理方法。在传统 Ajax 动态页面处理中,回馈信息包含大量信息,采用 xml 格式,可以借助 DOM 技术处理,简化程序。在本例中,回馈信息只包含验证结果信息,简单数据格式就能满足要求,客户端的 Javascript 分析回馈信息,根据结果确定是否提交完整的表单,具体实现请参考源代码。

基于 Ajax 技术的验证方法代码相对比较复杂,错误的表单需要来回两次网络交互,而正确的提交则需要三次网络交互。该验证方法的响应时间与网络繁忙程度有很大的关系。相对于纯服务器端验证,该方法在验证阶段不需要重新下载整个页面,在多个表单共存在同一页面的场合,基于 Ajax 技术的验证方法不会影响同一页面的其它表单。

 




回页首


小结

上述四种验证方法各有优缺点,用户应该根据需求选择不同的方法。浏览器端验证方法适用于对表单输入要求并不是特别严格的场所;浏览器端和服务器端双重验证应用比较广泛,但是该方法不利于后续开发;服务器端验证方法结构简单,但是开发代码相对复杂;基于 Ajax 技术的验证方法,对网络的要求高,但是该方法结构清晰,表单验证与表单处理过程分离但共用验证代码,简化开发人员的工作。





回页首


下载

描述名字大小下载方法
示例代码code.zip2.8KBHTTP
关于下载方法的信息


参考资料


关于作者

 

胡丽霞,IBM 中国开发中心软件工程师,主要从事 BladeCenter 相关的开发测试工作。

掌握jQuery实现表单验证 本文还有配套的精品资源,点击获取 简介:表单验证是网页开发的关键环节,确保用户输入数据的准确性和格式正确性。jQuery提供了一套简单的API来进行前端表单验证,通过编写JavaScript代码来检查用户输入的有效性。本教程将介绍jQuery基础、自定义验证逻辑以及如何使用jQuery Validation Plugin来简化验证流程。学员将学习如何为表单添加验证规则、处理... 阅读详情

相关推荐

CRMEB商城系统任意文件下载漏洞(CVE-2024-52726)分析与修复

在Web应用安全领域,API接口安全是保障系统边界安全的核心环节。其原理在于通过签名验证、参数校验等机制,确保请求的合法性与完整性。这项技术的价值在于为系统间数据交互提供安全通道,防止未授权访问和数据泄露。典型的应用场景包括电商系统的对外数据接口、第三方服务集成等。然而,当签名验证逻辑存在缺陷或文件路径处理不当,便会引发严重的安全风险。本文以CRMEB开源商城系统为例,深入剖析其对外API模块中因签名验证绕过和路径遍历导致的任意文件下载漏洞。该漏洞允许攻击者下载服务器敏感文件,如数据库配置文件、日志和源码,

weixin_27722377的博客 378

form表单校验

表单校验的基本步骤--简单校验,可以在基础上添加if判断校验成功跳转路由......

m0_65132206的博客 8055

将ue4程序嵌入qt界面显示

需求:将ue4程序嵌入qt界面显示 思路:通过使用 windowsAPI 对ue4窗口进行设置跟随qt界面以及活动窗口时的位置层序设置

weixin_44342705的博客 5847

el-element form表单组件 对非表单内字段做校验

在日常开发写表单的时候,可能会遇到某一个form-Item中绑定的值不在表单绑定的数据对象中。用于表单域验证错误信息,设置该值会使表单验证状态变为error,并显示该错误信息。此时用prop绑定该字段名是无效的,需要单独对这个字段进行校验。在 form-Item 中有一个属性。

gp_911014的博客 1427

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1185

英飞凌TC377的Flash管理、UCB配置与HSM安全机制解析

本文深入解析了英飞凌TC377微控制器的Flash存储结构、UCB配置机制与HSM安全模块。详细阐述了带Cache与不带Cache的PFlash地址访问差异、利用SOTA与AB Swap实现无感OTA更新的原理,以及如何通过UCB安全配置启动流程与写保护。重点剖析了HSM硬件安全模块在密钥管理、安全启动与安全OTA中的核心作用,为开发高可靠性嵌入式系统提供实战指南。

weixin_29170327的博客 524

element表单验证常用的几种规则

{// rule:采用的规则 // value: 被校验的值 // callback是回调函数, // 如果通过了规则检验,就直接调用callback() // 如果没有通过规则检验,就调用callback(错误对象,在错误对象中说明原因) // 例如:callback(new Error('错误说明')) if(value === '123456') {callback(new Error('密码不能为123456')) } else {

greed 7236

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

如何使用PHP进行表单验证?

但请注意,客户端验证不是安全的,必须配合服务器端验证以确保数据的安全性和有效性。需要注意的是,验证逻辑应随应用程序的需求和安全要求的变化而更新和调整。表单验证可以确保用户输入的数据符合特定的格式或要求,从而提高数据的质量和安全性。最后,当验证失败时,应将错误消息显示给用户,以便他们可以纠正输入。使用预处理语句来防止SQL注入,对于用户输入的数据,进行适当的转义和过滤。在进行验证时,通常将验证逻辑封装在函数中,以便复用和更好的代码组织。例如,如果期望一个数字,但用户输入了文本,那么应该进行验证。

Xs_layla的博客 697

【C2000系列DSP的Bootloader详解】如何打包源文件为库文件且加密仅授权使用,一步步教你如何实现

如果想要在 TI 的 CCS 开发环境中为 C2000 系列 MCU 生成 lib 库文件,并对这些库文件进行加密保护,确保只有授权方(持有密钥)才能调用和使用,以此保护源代码的知识产权。

昔时扬尘处 177

基于Dijkstra算法的共享单车调度优化系统设计与实现

根据最新统计数据,全球共享单车市场规模已超过300亿美元,中国作为最大的共享单车市场,日订单量超过5000万次。Dijkstra算法由荷兰计算机科学家Edsger W. Dijkstra于1956年提出,用于解决带权有向图中的单源最短路径问题。本文详细介绍了基于Dijkstra算法的共享单车调度优化系统的设计与实现。本文将详细介绍基于Dijkstra算法的共享单车调度优化系统的设计与实现,采用Java 17、Spring Boot 3.x等最新技术栈。

2201_76125393的博客 622

表单验证

手工实现表单验证               用户注册页面                                          用户名:                         密码:                     确认密码:   email地址:

u011563656的博客 421

lammps 案例:高熵合金FeNiCrCoCu建模及拉伸模拟

高熵合金力学性能模拟包括拉伸、剪切、摩擦等模拟,本文以高熵合金FeNiCrCoCu为例介绍高熵合金建模及拉伸过程模拟。 FeNiCrCoCu原子数量比为1:1:1:1:1 高熵合金的拉伸与单晶拉伸过程类似,主要包含以下步骤: 1.建模 高熵合金含有原子类型较多,建模时,一般以含量最多的原子为主建立初始模型。 使用set type/ratio或者set type/fraction的方式按一定比例替换为其它合金原子。 如随机选择20%的原子1,将其转换为原子2: set type 1 type/ratio 2

lammps_jiayou的博客 6068

JavaScript表单验证

表单验证是JavaScript的高级选项之一.我们可以通过JavaScript在网页中对即将送往服务器的HTML表单中的输入数据进行验证.如果所输入内容与所需不符,我们就在页面中进行提示.这样就使得我们不用频繁的与服务器进行交互,减少了IO的频率,提高了效率.在表单验证中,我们通常使用如下的验证功能:验证用户名与密码为指定格式在验证用户名与密码时,我们通常验证用户名与密码不能为空,用户名和密码必须在指定长度范围内,用户名和密码由数字和字母组成(使用正则表达式)等等验证单选框所选内容最常见的验证单选框就是验证

weixin_52629592的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JS进行简单的表单验证(附详细代码)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、JS表单验证是什么?一、JS表单验证需求分析?三、表单验证所需事件设置from表单及其文本框,代码如下(示例):2.设置触发事件函数JS代码3.结果展示总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、JS表单验证是什么? 表单验证是javascript中的高级选项之一。JavaScript 可用来在数du据被送往服务器前对 HTML 表单中的这些输入数据进行验证。 一、JS表单验证需求分析? 表单

qq_45228201的博客 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JavaScript中的表单验证

文章目录1.什么是表单验证2.常见的表单验证 1.什么是表单验证 大多数网站的注册页面中,都会要求用户输入生日,我们知道日期的格式是yyyy-MM-dd并且由数字组成,中间不允许出现字母或是其他符号,如果填写格式与日期格式不符合,name注册将失败,这种操作就是表单验证的体现。 表单验证就是js在数据被送往服务器前,对html表单中的数据进行验证的过程,在验证所有信息均符合要求之后,经表单提交到服务器由服务器进行数据处理。常见的表单验证有:表单中的必填项目、输入的邮件是否合法,输入日期是否合法等。 2.常见

ren__wei_的博客 5999

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

javaScript-06 表单验证 详细易懂,加案例分析

JavaScript表单验证,全网最详细

YZZdear的博客 2766
上一篇: 嫁个收入多少的男人你才幸福-------转载
下一篇: Windows XP自动登录设置
JavaAlpha
博客等级 码龄18年 910粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值