表单,文件上传,cookie,session

目录

表单,表单验证

文件包含,文件上传
cookie
session

1.表单,表单验证

表单

表单的基本使用

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

表单数据是通过请求体传递到服务端的,我们在界面上看不到
  可以提交任何类型的数据,包括文件
  由于界面上看不见,浏览器也不储存,所以更安全

常见表单元素处理

1.1. 单选按钮
<!‐‐ 最终只会提交选中的那一项的 value ‐‐>
<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female">
1.2. 复选按钮
<!‐‐ 没有设置 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">
1.3. 选择框
<select name="subject">
  <!‐‐ 设置 value 提交 value ‐‐>
  <option value="1">语文</option>
  <!‐‐ 没有设置 value 提交 innerText ‐‐>
  <option>数学</option>
</select>
1.4文件上传框

表单验证

在处理PHP表单时我们需要考虑安全性。

需求如下: 1、需要一个注册页面的处理系统

字段 验证规则
名字 可以输入字符串
Email 可以输入字符串
爱好 多选(足球、篮球、羽毛球、看书、写字;)
备注 多行输入字段(文本域)
性别 单选(男、女)
首先实现起来,按照我们所学,可以很轻易的写出基本框架
<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 实体。

预定义的字符是:

& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 &#039;
< (小于) 成为 &#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 上传代码

step1:创建一个文件上传表单,并将代码保存到 index.html 文件中

<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" 属性规定了应该把输入作为文件来处理

step2:创建上传脚本upload.php

<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"] - 由文件上传导致的错误代码

step3:保存被上传的文件

上面的实例在服务器的 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)
?>

session

类似三次握手,作用是建立一个通道能一直保持通信

<?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'];
?>
posted @ 2023-08-06 16:54  hacker-dreamer  阅读(41)  评论(0编辑  收藏  举报