首页 > 其他分享 >表单,文件上传,cookie,session

表单,文件上传,cookie,session

时间:2023-08-06 17:00:19浏览次数:29  
标签:FILES 文件 echo session cookie file 表单 上传

目录

表单,表单验证

文件包含,文件上传
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'];
?>

标签:FILES,文件,echo,session,cookie,file,表单,上传
From: https://www.cnblogs.com/betty-123/p/17609569.html

相关文章

  • session与token
    1.base64Base64是一种用于将二进制数据编码为文本的编码方案,它使用ASCII字符串格式来表示二进制数据。Base64常用于在只能处理ASCII字符的系统上传输数据,如电子邮件系统、web服务器以及编码媒体文件。在Base64中,每个字符代表6个数据位,因此可以将3个字节的二进制数据编码为4......
  • cookie封装
    cookie封装当提到"cookie封装",通常是指在开发中对浏览器cookie的处理进行封装和管理,以简化代码和提高可维护性。在Web开发中,cookie是一种用于存储少量数据的小文件,存储在用户的浏览器中。它们被广泛用于跟踪用户会话,记录用户偏好,进行用户身份验证等。在进行cookie封装时,你可......
  • cookie和localStorage和sessionStorage的区别
    cookie和localStorage和sessionStorage的区别下面从几个方向区分一下cookie,localStorage,sessionStorage的区别生命周期:cookie:可设置失效时间,否则默认为关闭浏览器后失效。localStorage:除非被手动清除,否则永久保存。sessionStorage:仅在当前网页会话下有效,关闭页面或关......
  • cookie和服务器Session的区别
    cookie和服务器Session的区别cookie和服务器Session都可用来存储用户信息,cookie存放于客户端,Session存放于web服务器端。因为cookie存放于客户端有可能被窃取,所以cookie一般用来存放不敏感的信息,比如用户设置的网站主题。敏感的信息用Session存储,比如用户的登陆信息。Se......
  • JS中BOM事件,JS样式特效,表格对象和表单操作
    DOM事件1.DOM中的事件可以分为两类1.浏览器行为如:文档加载完成,图片加载完成2.用户行为如:输入框输入数据,点击按钮(2).常见的DOM事件onload浏览器已完成页面的加载支持事件的对象windowimageonchangeHTML元素改变onclick用户点击HTML元素o......
  • 前端学习笔记202305学习笔记第二十一天-vue3.0-自定义form表单的验证
       ......
  • 蓝图,flask-session,数据库连接池
    1蓝图#blueprint:蓝图,flask都写在一个文件中,项目这样肯定不行,分目录,分包,使用蓝图划分目录#不用蓝图,划分目录 -一直使用app对象,会出现循环导入问题-项目名statictemplatesorder_detail.htmlviews__init__.py......
  • 浅谈-HttpSession session = request.getSession(false)
    当使用request.getSession(false)方法时,如果当前请求没有关联的会话,则不会创建新的会话,而是返回null。这意味着,如果当前客户端没有携带有效的会话标识符(如JSESSIONID),或者会话已过期或被销毁,则request.getSession(false)方法将返回null。下面是一个示例来解释这个方法的用......
  • Oralce中processes和sessions的设置关系
    一,基本概念Sessions:指定了一个Instance中能够同时存在的sessions数量,或者说,就是能同时登陆到数据库的并发用户数。通常,我们设定这个参数时需要考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数,最后乘以1.1。processes:指定了Instance在OS层面所能同时运......
  • 【Jmeter】跨线程获取cookie值
    1、设置配置文件:apache-jmeter-5.5\bin\jmeter.properties#CookieManagerbehaviour-shouldCookiesbestoredasvariables?#DefaultisfalseCookieManager.save.cookies=true2、线程_登录:2.1、http请求右键_添加_后置处理器_正则表达式提取器 正则表达式:satoken=(......