PHP表单验证及安全
文章目录
- 一、表单简介
- 二、表单验证实例
- 三、$_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 实体。
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
-->
<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/"><script>alert('hacked')</script>">
PHP表单验证及安全相关推荐
- [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解
模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...
- float js 正则 验证_使用HTML和Vuejs进行表单验证
他们说大多数网络应用只是HTML表单.好吧,表单需要验证,谢天谢地,HTML5带有许多优秀的内置表单验证功能,可用于电子邮件,数字,最大值,分钟等.您甚至可以使用模式编写自己的验证规则.在本文中,我将 ...
- JavaScript 表单与表单验证
JavaScript 表单 JavaScript 表单验证 HTML 表单验证可以通过 JavaScript 来完成. 以下实例代码用于判断表单字段(fname)值是否存在,如果存在,则弹出信息,否则 ...
- jquery 实现表单验证功能代码(简洁)
html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>表单验证页面</title&g ...
- 一款比较实用齐全的jQuery 表单验证插件
一款比较实用,并且验证类型齐全的jQuery表单验证插件.英文版原作者@Vanadium,由我做中文整理.E文水平有限,如果翻译的有问题的,请大家指出,在此感谢~ 可以验证哪些? 文字,日期,邮箱,网 ...
- antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
引言 上一章我讲到了使用FormBuilder让后端开发者快速构建前端表单页面,而为了示例, 直接在store方法内把表单数据一股脑存到了数据库. 这!很!危!险! 本文教你正确地验证用户表单提交的数 ...
- Angular响应式表单及表单验证
1. 什么是响应式表单? 响应式表单提供了一种模型驱动的方式来处理表单输入,其中的值会随时间而变化. 响应式表单使用显示的,不可变的方式,管理表单在特定时间点上的状态.对表单状态的每一次变更都会返回一 ...
- Bootstrap表单验证插件bootstrapValidator使用方法整理
插件介绍 先上一个图: 下载地址:https://github.com/nghuuphuoc/bootstrapvalidator 使用方法:http://www.cnblogs.com/huangc ...
- Angular 表单验证类库 ngx-validator 1.0 正式发布
背景介绍 之前写了一篇 <如何优雅的使用 Angular 表单验证>,结尾处介绍了统一验证反馈的类库 ngx-validator ,由于这段时间一直在新模块做微前端以及相关业务组件库,工具 ...
- 如何优雅的使用 Angular 表单验证
随便说说,这一节可以跳过 去年参加 ngChine 2018 杭州开发者大会的时候记得有人问我: Worktile 是什么时候开始使用 Angular 的,我说是今年(2018年) 3 月份开始在新模 ...
最新文章
- SAP Commerce Impex语法
- JAVA中vector是否存在数据_如何找出std :: vector中是否存在项目?
- 网站白痴的 ASP.NET website 学习日志
- ros发布节点信息python_ROS入门笔记(一): ROS简介
- 指针函数的一个范例,在单片机上运用它能让您的程序结构更明朗清晰,层次感强...
- [转]关于ORA-00979 不是 GROUP BY 表达式错误的解释
- 大学课程为什么不绕过51单片机直接搞STM32来做比赛
- C/C++[算法入门]..
- [NOIP2013]表达式求值
- 怎样在计算机上安装计算器,如何在win10系统电脑上重新安装计算器
- 网易轻舟服务网格数据面性能优化实践
- FreeMarker模板制作
- 如何下载无水印的短视频(python版)
- 人民日报谈美国减税:是在挑起税务战,国际税收秩序将陷混乱(zz)
- GFS —— 分布式文件系统
- MySQL导入数据导致C盘空间不足
- 如何比较两个速度的大小地程序_58安居客小程序平台化与多小程序开发探索与实践...
- 大数据24小时:Salesforce拟65亿美元收购Mulesoft,林志颖加盟小黑鱼科技任首席体验官
- 数据库的范式化和反范式化模型
- Python Numpy库 numpy.corrcoef()函数讲解
热门文章
- 计算机主机主板单元,计算机组成原理——主板篇
- 在线成语接龙答题有奖微信小程序源码V1.5.1
- mysql neq_neq、eq的用法,thinkphp框架下的
- CloudCompare 可视化——Scale Filed
- WLC5508 HA ( AP SSO)
- 22考研初试410数一145上岸上海交通大学819经验分享
- android自定义渐变色,Android如何设置渐变色背景 | 夕辞
- 拍照爱摆“剪刀手”?呵呵,1.5米内100%还原指纹
- googleapis.com替换CDN
- jdbc连接oracle11g