一. PHP超全局变量
PHP超全局变量,是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。
PHP 超级全局变量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
1. $_GET
用于收集来自 method="get" 的表单中的值。
从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
2. $_POST
用于收集来自 method="post" 的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
二. PHP表单
1.表单和用户输入
<!DOCTYPE html>
<html lang="en">
<?php include('templates/header.php'); ?>
<section class="container grey-text">
<h4 class="center">添加课程</h4>
<form action="add.php" class="white" method="POST">
<label for="email">邮箱</label>
<input type="text" name="email">
<label for="title">课程名称</label>
<input type="text" name="title">
<label for="points">知识要点(逗号隔开)</label>
<input type="text" name="points">
<div class="center">
<input type="submit" name="submit" value="立即提交" class="btn brand z-depth-0">
</div>
</form>
</section>
<?php include('templates/footer.php'); ?>
</html>
php函数: isset() 检测变量是否已设置并且非 NULL
<?php
//$_GET $_POST 超全局变量
if(isset($_POST['submit'])) {
echo $_POST['email'] . '<br>';
echo $_POST['title'] . '<br>';
echo $_POST['points'] . '<br>';
}
?>
2. XSS(跨站脚本攻击)
恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
例:在上方表单中输入:
<script>window.location="https://www.baidu.com/"</script>

点击立即提交,就会直接打开百度官网。
任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,代码可以修改全局变量或者获取用户的表单数据。
可以通过 htmlspecialchars() 函数来避免被利用。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号) 成为 &
- " (双引号) 成为 "
- ' (单引号) 成为 '
- < (小于) 成为 <
- > (大于) 成为 >
例:在上方示例中加入htmlspecialchats()函数
<?php
//$_GET $_POST 超全局变量
if(isset($_POST['submit'])) {
// xss(跨站脚本攻击)
echo htmlspecialchars($_POST['email']) . '<br>';
echo htmlspecialchars($_POST['title']) . '<br>';
echo htmlspecialchars($_POST['points']) . '<br>';
}
?>
再次往表单中输入:
<script>window.location="https://www.baidu.com/"</script>
点击提交,该代码将不会被执行。

3. 表单基础验证
必须字段:php函数- empty() 检查一个变量是否为空。
<?php
//$_GET $_POST 超全局变量
if(isset($_POST['submit'])) {
//验证邮箱
//是否为空
if(empty($_POST['email'])) {
echo '邮箱不能为空 <br>';
}else {
echo htmlspecialchars($_POST['email']) . '<br>';
}
//验证课程名称
//是否为空
if(empty($_POST['title'])) {
echo '课程名称不能为空 <br>';
}else {
echo htmlspecialchars($_POST['title']) . '<br>';
}
//验证知识要点
//是否为空
if(empty($_POST['points'])) {
echo '至少提交一个知识要点 <br>';
}else {
echo htmlspecialchars($_POST['points']) . '<br>';
}
}
?>
4. 表单过滤
1)php过滤器:用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。
Filter函数:
函数 | 描述 |
filter_has_var() | 检查是否存在指定输入类型的变量。 |
filter_id() | 返回指定过滤器的 ID 号。 |
filter_input() | 从脚本外部获取输入,并进行过滤。 |
filter_input_array() | 从脚本外部获取多项输入,并进行过滤。 |
filter_list() | 返回包含所有得到支持的过滤器的一个数组。 |
filter_var_array() | 获取多个变量,并进行过滤。 |
filter_var() | 获取一个变量,并进行过滤。 |
PHP 过滤器:
ID名称 | 描述 |
FILTER_VALIDATE_EMAIL | 把值作为 e-mail 地址来验证。 |
2)正则表达式
php函数:preg_match() — 进行正则表达式匹配
<?php
//$_GET $_POST 超全局变量
if(isset($_POST['submit'])) {
// xss(跨站脚本攻击)
//验证邮箱
//是否为空
if(empty($_POST['email'])) {
echo '邮箱不能为空 <br>';
}else {
$email = $_POST['email'];
if(!filter_var($email,FILTER_VALIDATE_EMAIL)) {
echo '邮箱格式不正确 <br>';
}
}
//验证课程名称
//是否为空
if(empty($_POST['title'])) {
echo '课程名称不能为空 <br>';
}else {
$title = $_POST['title'];
if(!preg_match('/^[\w\x{4e00}-\x{9fa5}]+$/u',$title)) {
echo '课程名称不能包含特殊字符 <br>';
}
}
//验证知识要点
//是否为空
if(empty($_POST['points'])) {
echo '至少提交一个知识要点 <br>';
}else {
$points = $_POST['points'];
if(!preg_match('/^([\w\x{4e00}-\x{9fa5}]+)(,\s*[\w\x{4e00}-\x{9fa5}\s]*)*$/u',$points)) {
echo '知识要点必须以英文逗号隔开 <br>';
}
}
}
?>
5.错误提示与页面重定向
1)PHP Array函数
PHP Array 函数允许您访问并操作数组。支持简单的数组和多维数组。
函数 | 描述 |
array() | 创建数组。 |
array_filter() | 用回调函数过滤数组中的元素。 |
2)PHP HTTP 函数
HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作。
可用于重定向页面。
函数 | 描述 |
header() | 向客户端发送原始的 HTTP 报头。 |
<?php
//初始化变量
$email = $title = $points = "";
//初始化报错数组
$errors = array('email' => '', 'title' => '', 'points' => '');
//$_GET 超全局变量
if(isset($_POST['submit'])) {
// xss(跨站脚本攻击)
//验证邮箱
//是否为空
if(empty($_POST['email'])) {
$errors['email'] = '邮箱不能为空';
}else {
$email = $_POST['email'];
if(!filter_var($email,FILTER_VALIDATE_EMAIL)) {
$errors['email'] = '邮箱格式不正确';
}
}
//验证课程名称
//是否为空
if(empty($_POST['title'])) {
$errors['title'] = '课程名称不能为空';
}else {
$title = $_POST['title'];
if(!preg_match('/^[\w\x{4e00}-\x{9fa5}]+$/u',$title)) {
$errors['title'] = '课程名称不能包含特殊字符';
}
}
//验证知识要点
//是否为空
if(empty($_POST['points'])) {
$errors['points'] = '至少提交一个知识要点';
}else {
$points = $_POST['points'];
if(!preg_match('/^([\w\x{4e00}-\x{9fa5}]+)(,\s*[\w\x{4e00}-\x{9fa5}\s]*)*$/u',$points)) {
$errors['points'] = '知识要点必须以英文逗号隔开';
}
}
//所有验证通过
if(array_filter($errors)) {
echo '表单中存在错误信息';
}else {
header('Location:index.php');
exit;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<?php include('templates/header.php'); ?>
<section class="container grey-text">
<h4 class="center">添加课程</h4>
<form action="add.php" class="white" method="POST">
<label for="email">邮箱</label>
<input type="text" name="email" value="<?php echo htmlspecialchars($email); ?>">
<div class="red-text"><?php echo $errors['email']?></div>
<label for="title">课程名称</label>
<input type="text" name="title" value="<?php echo htmlspecialchars($title); ?>">
<div class="red-text"><?php echo $errors['title']?></div>
<label for="points">知识要点(逗号隔开)</label>
<input type="text" name="points" value="<?php echo htmlspecialchars($points); ?>">
<div class="red-text"><?php echo $errors['points']?></div>
<div class="center">
<input type="submit" name="submit" value="立即提交" class="btn brand z-depth-0">
</div>
</form>
</section>
<?php include('templates/footer.php'); ?>
</html>
<!-- <script>window.location="https://www.baidu.com/"</script> -->
6.PHP EOF(heredoc)定界符
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。
使用说明:
- 以<<<EOF 开始标记开始,以EOF结束标记结束
- 结束标记必须顶头写,独占一行,不能有缩进和空格
- 在结束标记末尾要加分号
- EOF可以用任意其他字符代替,开始标记和结束标记相同即可。比如:常用大写的 EOF, EOD, EOT 来表示,但是不只限于那几个(也可用:JSON,HTML等),只要保证开始标记和结束标记不在正文中出现即可。
- 位于开始标记和结束标记之间的变量可以被正常解析,但是函数不可以。在heredoc中,变量不需要使用连接符 . 或 , 来拼接
- 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义
<?php
$name = 'Summer';
$age = 25;
//EOF定界符
echo <<<EOF
<h2>$name</h2> is $age years old
EOF;
echo <<<JSON
<h2>$name</h2> is $age years old
JSON;
?>
