表单,表单验证
文件包含,文件上传 cookie session
php上传表单,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元素自动变成可供 PHP 脚本使用。
HTML 中有一个专门用于提交数据的标签:
form 标签有两个必要属性: action:表单提交地址(填完了,交给谁) method:表单以什么方式提交
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF‐8"> <title>登录</title> </head> <body> <form action="login.php" method="post"> <div> <label for="username">用户名</label> <input type="text" id="username" name="username"> </div> <div> <label for="password">密码</label> <input type="password" id="password" name="password"> </div> <button type="submit">登录</button> </form> </body> </html>
action 提交地址指的是这个表单填写完成过后点击提交,发送请求的请求地址是什么。 从便于维护的角度考虑,一般我们最常见的都是提交给当前文件,然后在当前文件中判断是否是表单提交请求:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 表单提交请求 }
另外,建议使用 $_SERVER['PHP_SELF'] 动态获取当前页面访问路径,这样就不用因为文件重命名或者网站目录结构调整而修改代码了:
<!‐‐ 通过 `$_SERVER['PHP_SELF']` 获取路径,可以轻松避免这个问题 ‐‐> <form action="<?php echo $_SERVER['PHP_SELF']; ?>"> <!‐‐ ... ‐‐> </form>
GET 表单数据是通过 URL 中的 ? 参数传递到服务端的 可以在地址栏中看到提交的内容
POST
表单数据是通过请求体传递到服务端的,我们在界面上看不到 可以提交任何类型的数据,包括文件 由于界面上看不见,浏览器也不储存,所以更安全
<!‐‐ 最终只会提交选中的那一项的 value ‐‐> <input type="radio" name="gender" value="male"> <input type="radio" name="gender" value="female">
<!‐‐ 没有设置 value 的 checkbox 选中提交的 value 是 on ‐‐> <input type="checkbox" name="agree"> <!‐‐ 设置了 value 的 checkbox 选中提交的是 value 值 ‐‐> <input type="checkbox" name="agree" value="true">
如果需要同时提交多个选中项,可以在 name 属性后面 跟上 [] :最终提交到服务端,通过 $_POST 接收到的是一个索引数组.
<input type="checkbox" name="funs[]" id="" value="football"> <input type="checkbox" name="funs[]" id="" value="basketball"> <input type="checkbox" name="funs[]" id="" value="world peace">
<select name="subject"> <!‐‐ 设置 value 提交 value ‐‐> <option value="1">语文</option> <!‐‐ 没有设置 value 提交 innerText ‐‐> <option>数学</option> </select>
在处理PHP表单时我们需要考虑安全性。
<head> <meta charset="utf-8"> </head> <form action="" method="post"> 名字: <input type="text" name="name" > <br> 邮件: <input type="text" name="email" ><br> 爱好: <input type="checkbox" name="aihao[]" value="足球" >足球 <input type="checkbox" name="aihao[]" value="篮球">篮球 <input type="checkbox" name="aihao[]" value="羽毛球">羽毛球 <input type="checkbox" name="aihao[]" value="看书">看书 <input type="checkbox" name="aihao[]" value="写字">写字 <input type="checkbox" name="aihao[]"><br> 备注: <textarea name="beizhu" ></textarea><br> 性别: <input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br> <input type="submit" value="提交"> </form> value="提交"> </form>
<?php $name=$_REQUEST['name']; $email=$_REQUEST['email']; $aihao=$_REQUEST['aihao']; $beizhu=$_REQUEST['beizhu']; $xingbie=$_REQUEST['xingbie']; echo "名字为:".$name."</br>"; echo "邮箱为:".$email."</br>"; echo "爱好为:"; foreach($aihao as $ah){ echo $ah." "; }; echo "</br>备注为:".$beizhu."</br>"; echo "性别为:".$xingbie."</br>"; ?>
但是其实只是这样简单的写,就已经产生了安全漏洞,这就是安全漏洞的由来 一般的程序员只会考虑用户的需求,不会考虑安全问题
XSS攻击代码:
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 &#gt > (大于) 成为 &#gt
加固后的代码:
<head> <meta charset="utf-8"> </head> <?php $name=htmlspecialchars($_REQUEST['name']); $email=htmlspecialchars($_REQUEST['email']); $aihao=$_REQUEST['aihao']; $beizhu=htmlspecialchars($_REQUEST['beizhu']); $xingbie=htmlspecialchars($_REQUEST['xingbie']); echo "名字为:".$name."</br>"; echo "邮箱为:".$email."</br>"; echo "爱好为:"; if($aihao!=""){ foreach($aihao as $ah){ echo htmlspecialchars($ah)." ";} }else{ echo "没有爱好</br>"; } echo "</br>备注为:".$beizhu."</br>"; echo "性别为:".$xingbie."</br>"; ?> <form action="" method="post"> 名字: <input type="text" name="name" > <br> 邮件: <input type="text" name="email" ><br> 爱好: <input type="checkbox" name="aihao[]" value="足球" >足球 <input type="checkbox" name="aihao[]" value="篮球">篮球 <input type="checkbox" name="aihao[]" value="羽毛球">羽毛球 <input type="checkbox" name="aihao[]" value="看书">看书 <input type="checkbox" name="aihao[]" value="写字">写字 <input type="checkbox" name="aihao[]"><br> 备注: <textarea name="beizhu" ></textarea><br> 性别: <input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br> <input type="submit" value="提交"> </form>
思路:在以下代码中我们加入了一些新的变量: $nameErr, $emailErr, $genderErr, 和 $websiteErr.。这些 错误变量将显示在必需字段上。 我们还为每个$_POST变量增加了一个if else语句。 这些语句将检 查 $_POST 变量是 否为空(使用php的 empty() 函数)。如果为空,将显示对应的错误信息。 如 果不为空,数据将传递给test_input() 函数:
empty()函数
<?php $a="123321"; echo empty($a); ?>
完整代码:
<head> <meta charset="utf-8"> </head> <?php $name=htmlspecialchars($_REQUEST['name']); $email=htmlspecialchars($_REQUEST['email']); $aihao=$_REQUEST['aihao']; $beizhu=htmlspecialchars($_REQUEST['beizhu']); $xingbie=htmlspecialchars($_REQUEST['xingbie']); if ($_SERVER["REQUEST_METHOD"] == "POST") { if(empty($name)){ $nameErr="名字不能为空"; }elseif(empty($email)){ $emailErr="邮件不能为空"; } elseif(empty($xingbie)){ $xingbieErr="性别不能为空"; }else{ $name="名字为:".$name."</br>"; $email="邮箱为:".$email."</br>"; $beizhu="</br>备注为:".$beizhu."</br>"; $xingbie="性别为:".$xingbie."</br>"; }} ?> <form action="" method="post"> 名字(*): <input type="text" name="name" > <br> <?php echo $nameErr."<br>";?> 邮件(*):<?php echo $emailErr;?> <input type="text" name="email" ><br> <?php echo $nemailErr."<br>";?> 爱好: <input type="checkbox" name="aihao[]" value="足球" >足球 <input type="checkbox" name="aihao[]" value="篮球">篮球 <input type="checkbox" name="aihao[]" value="羽毛球">羽毛球 <input type="checkbox" name="aihao[]" value="看书">看书 <input type="checkbox" name="aihao[]" value="写字">写字 <input type="checkbox" name="aihao[]"><br> 备注: <textarea name="beizhu" ></textarea><br> 性别(*):<?php echo $xingbieErr;?> <input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br> <?php echo $xingbieErr."<br>";?> <input type="submit" value="提交"> </form> <?php echo $name; echo $email; if($aihao!=""){ foreach($aihao as $ah){ echo "爱好:".$ah=htmlspecialchars($ah)." ";} }else{ echo "没有爱好</br>"; } echo $beizhu; echo $xingbie; ?>
应用场景
1.有大量文件需要开发的时候开发一个页面处理调用多个页面的内容 2.引用conn.php即数据库连接文件
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的: require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。 include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。 因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否 则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文 件
包含文件里的变量能传到本文件中
包含语言 最终包含的格式会以主文件格式打开----》文件包含漏洞(在包含文件写脚本能侵入整个主文件)
<?php require 'a.txt'; //注意:require后直接会打开并将里面的内容作为本文件内容 //一句话木马 system($_GET['aaa']) , @eval($_GET['aaa']) echo '<br>'.$a; ?>
通过 PHP,可以把文件上传到服务器。
实例:
实站要求:目录结构
|-----upload # 文件上传的目录 |-----index.html # 表单文件 |-----upload.php # php 上传代码
<html> <head> <meta charset="utf-8"> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="file" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
注意: 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时, 比如文件内容,请使用 "multipart/form-data"。
标签的 type="file" 属性规定了应该把输入作为文件来处理
<head> <meta charset="utf-8"> </head> <?php if ($_FILES["file"]["error"] > 0) { echo "错误:" . $_FILES["file"]["error"] . "<br>"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件类型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]; } ?>
$_FILES["file"]结构:
$_FILES["file"]["name"] - 上传文件的名称 _
_$_FILES["file"]["type"] - 上传文件的类型
$FILES["file"]["size"] - 上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。 这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位 置:
<head> <meta charset="utf-8"> </head> <?php // 允许上传的图片后缀 $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["file"]["name"]); echo $_FILES["file"]["size"]; $extension = end($temp); // 获取文件后缀名 if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 204800) // 小于 200 kb && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "错误:: " . $_FILES["file"]["error"] . "<br>"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件类型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>"; // 判断当前目录下的 upload 目录是否存在该文件 // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777 if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " 文件已经存在。 "; } else { // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "文件存储在: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "非法的文件格式"; } ?>
用户第一次登录后服务器发给用户端的,有了cookie之后登陆就不需要再输入密码账号了
<?php //浏览器开发工具控制台document.cookie可手动查看 setcookie('username','betty',time()+3600) ; //var_dump($_COOKIE); foreach ($_COOKIE as $a=>$b){ echo $a.'<br>'; echo $b.'<br>'; } if(isset($_COOKIE['username'])){ echo "欢迎回来!"; } else{ echo '普通访客<br>'; } //删除cookie即设置为过去时间负数 //setcookie('username','betty',time()-3600) ?>
类似三次握手,作用是建立一个通道能一直保持通信
<?php //类似三次握手,作用是建立一个通道能一直保持通信 session_start(); //$_SESSION['view']=0;初始值,php代码化理解 //var_dump($_SESSION); if(isset($_SESSION['view'])){ $_SESSION['view']+=1; //unset($_SESSION['view']);销毁session } else $_SESSION['view']=1; echo '浏览量:'.$_SESSION['view']; ?>