文章目录

  • 一、表单简介
  • 二、表单验证实例
  • 三、$_SERVER["PHP_SELF"] 变量的跨站脚本利用与避免

一、表单简介

表单(Form)在网页中主要负责数据采集功能。

一个表单有三个基本组成部分:

表单标签:这里面包含了处理表单数据所用CGI(公共网关接口)程序的URL以及数据提交到服务器的方法。

表单:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。

表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

二、表单验证实例

<!DOCTYPE HTML>
<html>
<head><meta charset="utf-8"><title>表单验证实例(信息收集)</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"])) // 使用empty()函数检测如为空,将显示对应的错误信息{$nameErr = "名字是必需的";}else{$name = test_input($_POST["name"]);// 检测名字是否只包含大小写字母跟空格,preg_match进行正则表达式匹配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) // 将过滤函数写在自定义函数test_input()中,以提高代码的复用性
{$data = trim($data); // 去除输入数据中不必要的字符(如:空格,tab,换行)。$data = stripslashes($data); // 去除输入数据中的反斜杠 (\)$data = htmlspecialchars($data);return $data;
}
?><h2>PHP 表单验证实例</h2>
<p><span class="error">* 必需字段。</span></p>
<!--
该表单使用 method="post" 方法来提交数据。
$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,会发送表单数据到当前页面,而不是跳转到不同的页面。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 &amp;
" (双引号) 成为 &quot;
' (单引号) 成为 '
< (小于) 成为 &lt;
> (大于) 成为 &gt;
-->
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"><!--"名字"、"E-mail"、"网址"字段为文本输入元素,"备注"字段是 textarea(标签定义多行的文本输入控件)-->名字: <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>

三、$_SERVER[“PHP_SELF”] 变量的跨站脚本利用与避免

当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。
因为跨网站脚本附在执行文件的路径后面$_SERVER["PHP_SELF"]的字符串会包含HTTP链接后面的JavaScript程序代码。

任何JavaScript代码可以添加在<script>标签中!

黑客可以利用这点重定向页面到另外一台服务器的页面上,用恶意代码修改全局变量或者获取用户的表单数据。

例如要指定以下表单文件名为 “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.xxx.com/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代码(用户会看到弹出框)。

$_SERVER["PHP_SELF"] 可以通过 htmlspecialchars() 函数来避免被利用:

<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表单验证及安全相关推荐

  1. [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解

    模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...

  2. float js 正则 验证_使用HTML和Vuejs进行表单验证

    他们说大多数网络应用只是HTML表单.好吧,表单需要验证,谢天谢地,HTML5带有许多优秀的内置表单验证功能,可用于电子邮件,数字,最大值,分钟等.您甚至可以使用模式编写自己的验证规则.在本文中,我将 ...

  3. JavaScript 表单与表单验证

    JavaScript 表单 JavaScript 表单验证 HTML 表单验证可以通过 JavaScript 来完成. 以下实例代码用于判断表单字段(fname)值是否存在,如果存在,则弹出信息,否则 ...

  4. jquery 实现表单验证功能代码(简洁)

    html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>表单验证页面</title&g ...

  5. 一款比较实用齐全的jQuery 表单验证插件

    一款比较实用,并且验证类型齐全的jQuery表单验证插件.英文版原作者@Vanadium,由我做中文整理.E文水平有限,如果翻译的有问题的,请大家指出,在此感谢~ 可以验证哪些? 文字,日期,邮箱,网 ...

  6. antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势

    引言 上一章我讲到了使用FormBuilder让后端开发者快速构建前端表单页面,而为了示例, 直接在store方法内把表单数据一股脑存到了数据库. 这!很!危!险! 本文教你正确地验证用户表单提交的数 ...

  7. Angular响应式表单及表单验证

    1. 什么是响应式表单? 响应式表单提供了一种模型驱动的方式来处理表单输入,其中的值会随时间而变化. 响应式表单使用显示的,不可变的方式,管理表单在特定时间点上的状态.对表单状态的每一次变更都会返回一 ...

  8. Bootstrap表单验证插件bootstrapValidator使用方法整理

    插件介绍 先上一个图: 下载地址:https://github.com/nghuuphuoc/bootstrapvalidator 使用方法:http://www.cnblogs.com/huangc ...

  9. Angular 表单验证类库 ngx-validator 1.0 正式发布

    背景介绍 之前写了一篇 <如何优雅的使用 Angular 表单验证>,结尾处介绍了统一验证反馈的类库 ngx-validator ,由于这段时间一直在新模块做微前端以及相关业务组件库,工具 ...

  10. 如何优雅的使用 Angular 表单验证

    随便说说,这一节可以跳过 去年参加 ngChine 2018 杭州开发者大会的时候记得有人问我: Worktile 是什么时候开始使用 Angular 的,我说是今年(2018年) 3 月份开始在新模 ...

最新文章

  1. SAP Commerce Impex语法
  2. JAVA中vector是否存在数据_如何找出std :: vector中是否存在项目?
  3. 网站白痴的 ASP.NET website 学习日志
  4. ros发布节点信息python_ROS入门笔记(一): ROS简介
  5. 指针函数的一个范例,在单片机上运用它能让您的程序结构更明朗清晰,层次感强...
  6. [转]关于ORA-00979 不是 GROUP BY 表达式错误的解释
  7. 大学课程为什么不绕过51单片机直接搞STM32来做比赛
  8. C/C++[算法入门]..
  9. [NOIP2013]表达式求值
  10. 怎样在计算机上安装计算器,如何在win10系统电脑上重新安装计算器
  11. 网易轻舟服务网格数据面性能优化实践
  12. FreeMarker模板制作
  13. 如何下载无水印的短视频(python版)
  14. 人民日报谈美国减税:是在挑起税务战,国际税收秩序将陷混乱(zz)
  15. GFS —— 分布式文件系统
  16. MySQL导入数据导致C盘空间不足
  17. 如何比较两个速度的大小地程序_58安居客小程序平台化与多小程序开发探索与实践...
  18. 大数据24小时:Salesforce拟65亿美元收购Mulesoft,林志颖加盟小黑鱼科技任首席体验官
  19. 数据库的范式化和反范式化模型
  20. Python Numpy库 numpy.corrcoef()函数讲解

热门文章

  1. 计算机主机主板单元,计算机组成原理——主板篇
  2. 在线成语接龙答题有奖微信小程序源码V1.5.1
  3. mysql neq_neq、eq的用法,thinkphp框架下的
  4. CloudCompare 可视化——Scale Filed
  5. WLC5508 HA ( AP SSO)
  6. 22考研初试410数一145上岸上海交通大学819经验分享
  7. android自定义渐变色,Android如何设置渐变色背景 | 夕辞
  8. 拍照爱摆“剪刀手”?呵呵,1.5米内100%还原指纹
  9. googleapis.com替换CDN
  10. jdbc连接oracle11g