【PHP代码审计】PHP基础知识
🌝博客主页:菜鸟小羊
💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具
php简介
php是什么?
- php(全称:Hypertext Preprocessor,即超文本预处理器)是一种通用开源脚本语言
- php脚本在服务器上执行
- php可免费下载使用
php文件是什么?
- php文件可包含文本、HTML、JavaScript和php代码
- php代码在服务器上执行,结果以纯HTML形式返回给浏览器
- php文件的默认文件扩展名是.php
php能做什么?
- php可以生成动态页面内容
- php可以创建、打开、读取、写入、关闭服务器上的文件
- php可以收集表单数据
- php可以发送和接收cookies
- php可以添加、删除、修改您的数据库中的数据
- php可以限制用户访问您的网站上的一些页面
- php可以加密数据
通过 php,您不再限于输出 HTML。您可以输出图像、PDF 文件,甚至 Flash 电影。您还可以输出任意的文本比如 XHTML 和 XML
为什么使用php?
- 跨平台(windows、linux、Unix等)
- 兼容性好(支持Apache、IIS等)
- 支持数据库
- 免费的且易于学习
基本的php语法
php脚本在服务器上执行,然后将纯HTML结果发送回浏览器
php文件的特点
- 文件扩展名是 .php
- php代码以 <?php** 开始,以 **?> 结束,可以放在文档中的任何位置
- 每句代码以 ; 结束
- php文件通常包含html标签和一些php脚本代码
php基本输出
在php中有两个基本的输出方式:echo和print,二者之间的区别
- echo:可以输出一个或多个字符串
- print:只允许输出一个字符串,返回值总为1
<?php
echo "<h2>php很有趣</h2>";
echo "hello world!<br>";
echo "这是","多个","字符串";print "<h2>php很有趣</h2>";
print "hello world!";
?>
var_dump():会把类型也输出
php中的注释
// 这是php单行注释/* 这是php多行注释 */
php变量
与代数类似
x=5;y=6;z=x+y
从表达式z=x+y,我们可以计算出z的值为11
在 PHP 中,这些字母被称为变量,变量是用于存储信息的 ”容器“,PHP 中没有声明变量的命令,变量在您第一次赋值给它的时候被创建
<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>
php变量
php变量规则
- 变量以$符开始,后面跟着变量的名称
- 变量名只能包含字母、数字以及下划线,必须以字母或下划线开始
- 变量名不能包含空格
- 变量名是区分大小写的
弱类型语言
在上面的实例中,我们注意到,不必向php声明该变量的数据类型,php会根据变量的值,自动把变量转换为正确的数据类型
在强类型语言中,我们必须在使用变量前先声明(定义)变量的类型和名称
php变量作用域
php中有4种不同的变量作用域:
- local:在函数内部访问
- global:被脚本中的任何部分访问
- static
- parameter
要在一个函数中访问一个全局变量,需要使用global关键字
<?php
$x=5; //{}外,全局变量function mytest(){$y=10; //local局部变量echo "$y"
}mytest();echo "$x";
?>
php超级全局变量
超级全局变量在PHP 4.1.0之后被启用,是PHP系统中自带的变量,在一个脚本的全部作用域中都可用
PHP超级全局变量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
$GLOBALS
是一个包含了全部变量的全局组合数组
$_SERVER
包含了诸如头信息、路径、以及脚本位置等信息的数组。这个数组中的项目由web服务器创建
<?php
echo '当前执行脚本的文件名:'.$_SERVER['PHP_SELF'];
echo "<br>";
echo '当前运行脚本所在的服务器的主机名:'.$_SERVER['SERVER_NAME'];
?>
$_POST
收集http协议中post方法传输的数据:
<?php
$name = $_POST['fname'];
echo $name;
?>
burp抓包修改为post请求,给fname传入值
$_GET
<?php
$name = $_GET['fname'];
echo $name;
?>
$_REQUEST
POST和GET之和
php常量
值不会发生变化,用define()或const关键字来定义。一个常量由英文字母、下划线、数字组成,但数字不能作为首字母出现,常量名不需要加$修饰符
常量的特性
- 不变性:一旦定义,其值不能改变
- 全局作用域:常量在定义后,可以在整个脚本的任何地方使用,无需使用
global
关键字 - 数据类型:常量的值可以是标量数据类型(如布尔值、整数、浮点数、字符串)或数组(PHP 7及以上版本)
- 区分大小写:如果需要定义大小写不敏感的常量,可以在
define()
函数的第三个参数设置为true
<?php
//区分大小写
define("STR","hello world");
echo STR;
echo '<br>';
echo str; //str当作字符串进行输出
echo '<br>';
//不区分大小写
define("STR1","hello world",true);
echo str1;
?>
预定义常量
php提供了一些预定义常量,这些常量通常用于获取PHP的配置信息、版本信息等。常见的预定义常量有:
PHP_VERSION
:当前PHP解析器的版本PHP_OS
:服务器的操作系统PHP_INT_MAX
:最大的整数值E_ERROR
、E_WARNING
、E_PARSE
等:错误报告级别
echo PHP_VERSION:
echo PHP_OS;
echo PHP_INT_MAX;
魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变
__LINE__
文件中的当前行号
<?php
echo '该代码的行号:"'.__LINE__.' " ';
__FILE__
文件的完整路径和文件名,如果用在被包含文件中,则返回被包含的文件名
<?php
echo '该文件位于:"'.__FILE__.' " ';
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录
<?php
echo '该文件目录位于:"'.__DIR__.' " ';
如果出现下图这种乱码情况,是因为浏览器识别的编码和文件保存的编码不一致造成的
我们可以在vscode中修改编码
php数据类型
php变量存储不同类型的数据,不同的数据类型可以做不一样的事情
php支持以下几种数据类型:
- string(字符串)
- interger(整型)
- float(浮点型)
- Boolean(布尔型)
- array(数组)
- object(对象)
- null(空值)
- resource(资源类型)
php字符串
是一串字符的序列,就像”hello world!",你可以将任何文本放在单引号和双引号中:
<?php
echo 'hello';
echo "hello";
?>
可以使用并置运算符(.),用于把两个字符串值拼接起来
<?php
$txt1="hello";
$txt2="world";
echo $txt1." ".$txt2;
?>
strlen()可以返回字符串的长度
<?php
echo strlen("hello world");
在字符串中查找一个字符或一段指定的文本,可以用strpos()
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置,如果没找到,则返回FALSE,下面的代码将输出;6
<?php
echo strpos("hello world!","world");
之所以返回6而不是7的原因是:字符串中第一个字符的位置是0,而不是1
php整型
是一个没有小数的数字,整数规则:
- 整数必须至少有一个数字(0~9)
- 整数不能包含逗号或空格
- 整数是没有小数点的
- 整数可以是正数或负数
- 整数可以用三种格式来指定:十进制、十六进制(0X开头)或八进制(0开头)
<?php
$x=100;
var_dump($x);
php浮点型
浮点型是带小数部分的数字,或是指数形式
$x = 10.3435;
$x = 2.4e3;
php布尔型
布尔值为true或false,布尔型通常用于条件判断
$x = true;
$y = false;
php数组
数组是一个能在单个变量中存储多个值的特殊变量
<?php
$arr=array("a","b","c");
var_dump($shuzu);
创建数组
array()用于创建数组,在php中,有三种类型的数组:
- 数值数组 - 带有数字ID键的数组
下面的实例创建一个名为$arr的数值数组,并给数组分配三个元素,然后打印一段包含数组值的文本
<?php
$arr=array("a","b","c");
//$arr[0]="a";
//$arr[1]="b";
//$arr[2]="c";
echo 'i like '.$arr[0].$arr[1].$arr[2];
- 关联数组 - 带有指定的键的数组,每个键关联一个值
关联数组是使用您分配给数组的指定的键的数组
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
//age['Peter']="35";
//age['Ben']="37";
//age['Joe']="43";
echo "Peter is ".$age['Peter']." years old.";
- 多维数组 - 包含一个或多个数组的数组
多维数组是包含一个或多个数组的数组。在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组
php null值
null值表示变量没有值
可以通过设置变量值为null来清空变量数据:
<?php
$x="hello world!";
$x=null;
var_dump($x);
php类型比较
虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较
- 松散比较:使用2个等号
==
比较,只比较值,不比较类型 - 严格比较:使用3个等号
===
比较,除了比较值,也比较类型
例如,“42” 是一个字符串而 42 是一个整数,false 是一个布尔值而 “false" 是一个字符串
<?php
if(42 == "42"){echo '值相等';
}echo PHP_EOL; //换行符if(42 === "42"){echo '类型相等';
}else{echo '类型不相等';
}
php中比较0、false、null
1️⃣比较0和false
<?php
echo 0 == false ? 'true' : 'false';
?>
<?php
echo 0 === false ? 'true' : 'false';
?>
2️⃣比较0和null
<?php
echo 0 == null ? 'true' : 'false';
?>
<?php
echo 0 === null ? 'true' : 'false';
?>
3️⃣比较false和null
<?php
echo false == null ? 'true' : 'false';
?>
<?php
echo false === null ? 'true' : 'false';
?>
php运算符
php算数运算符
+、-、*、/、%、-(取反)、.(并置)
php赋值运算符
=、+=、-=、*=、/=、%=
php递增/递减运算符
++x:先加1再返回x
x++:先返回x再加1
–x:先减1再返回x
x–:先返回x再减1
php比较运算符
运算符 | 名称 | 描述 |
---|---|---|
== | 等于 | 如果x等于y,则返回true |
=== | 绝对等于 | 如果x等于y,且它们类型相同,则返回true |
!= | 不等于 | 如果x不等于y,则返回true |
<> | 不等于 | |
!== | 不绝对等于 | 如果x不等于y,或它们类型不相同,则返回true |
> | 大于 | |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 |
php逻辑运算符
运算符 | 名称 | 描述 |
---|---|---|
and | 与 | 两边都为true,结果才为true |
or | 或 | 只要有一个为true,结果就为true |
xor | 异或 | 有且仅有一个为true,结果为true |
&& | 与 | 两边都为true,结果才为true |
|| | 或 | 只要有一个为true,结果就为true |
! | 非 | 取反,真变假,假变真 |
php数组运算符
运算符 | 名称 | 描述 |
---|---|---|
+ | 集合 | x和y的集合 |
== | 相等 | 如果x和y具有相同的键/值对,则返回true |
=== | 恒等 | 如果x和y具有相同的键/值对,且顺序相同类型相同,则返回true |
!= | 不相等 | 如果x不等于y,则返回true |
<> | 不相等 | 如果x不等于y,则返回true |
!== | 不恒等 | 如果x不等于y,则返回true |
三元运算符
(expr1)?(expr2):(expr3)
如果表达式expr1为真,则返回expr2,否则返回expr3
<?php
//普通写法
$username=isset($_GET['user']) ? $_GET['user'] : 'nobody'; //isset:判断接收参数是否为空,不是返回true
echo $username,PHP_EOL;//PHP 5.3+ 版本写法
$username=$_GET['user'] ?: 'nobody';
echo $username,PHP_EOL;
?>
自PHP 5.3起,可以省略三元运算符中间那部分。表达式 expr1?:expr3
在expr1求值为true时返回expr1,否则返回expr3
运算符优先级
下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序
**说明:**左=从左到右,右=从右到左
结合方向 | 运算符 | 附加信息 |
---|---|---|
clone new | clone和new | |
左 | [ | array() |
右 | ++ – ~ (int)(float)(string)(array)(object)(bool) @ | 类型和递增、递减 |
instancecof | 类型 | |
右 | ! | 逻辑运算符 |
左 | + - . | 算术运算符和字符串运算符 |
左 | << >> | 位运算符 |
左 | == != === !== <> | 比较运算符 |
左 | & | 位运算符和引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ?: | 三元运算符 |
php条件语句
if语句
用于仅当指定条件成立时执行代码
if(条件){条件成立时要执行的代码;
}
if…else语句
在条件成立时执行一块代码,条件不成立时执行另一块代码
if(条件){条件成立时要执行的代码;
}
else
{条件不成立时执行的代码;
}
if…elseif…else语句
在若干
if(条件){if条件成立时执行的代码;
}
elseif(条件)
{elseif条件成立时执行的代码;
}
else(条件)
{else条件不成立时执行的代码;
}
switch语句
分支语句,用于根据多个不同条件执行不同动作
<?php
switch(expression){case value1;break;case value2:break;default://如果没有匹配的值,执行这部分
}
?>
参数说明:
expression
:是表达式case value
:是可能的值,如果expression
的值等于某个case
的值,就执行相应的代码块break
:用于终止switch
语句,防止继续执行下一个case
default
:是可选的,用于指定当没有匹配的case
时执行的代码块
<?php
$favcolor="red";
switch($favcolor){case "red":echo "你喜欢红色";break;case "blue":echo "你喜欢蓝色";break;default:echo "你不喜欢红色或蓝色";
}
?>
php循环语句
在编写代码时,如果需要相同的代码块一次又一次的重复执行,我们可以使用循环语句来完成
while循环
将重复执行代码块,直到条件不成立
语法
while(条件){要执行的代码;
}
实例
<?php
$i=1;
while($i<=5){echo "the number is: ".$i.PHP_EOL;$i++;
}
?>
do…while循环
至少执行一次代码,然后检查条件,只要条件满足继续执行
语法
do
{要执行的代码;
}
while(条件)
实例
先输出i的值,此时i=6,然后i+1变成7,判断7<3不成立,跳出循环
<?php
$i=6;
do{echo $i++;}
while($i<3)
?>
for循环
用于您预先知道脚本需要运行的次数的情况
语法
for(初始值;条件;增量)
{要执行的代码;
}
实例
<?php
for($i=1;$i<5;$i++)
{echo "the number is: ".$i.PHP_EOL;
}
foreach循环
专门用来循环遍历数组
语法
遍历数值数组,每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组的下一个值
foreach($array as $value){要执行代码;
}
遍历关联数组,每一次循环,当前数组元素的键与值就会被赋值给 $key 和 $value 变量(数字指针会逐一地移动),在进行下一次循环时,你将看到数组中的下一个键与值
foreach($array as $key => $value){要执行代码;
}
实例
下面演示了一个输出给定数组的值的循环:
<?php
$x=array("1","2","3");
foreach($x as $value)
{echo $value.PHP_EOL;
}
?>
下面演示了一个输出给定数组键与值的循环:
<?php
$x=array(1=>"hello",2=>"world");
foreach($x as $key => $value)
{echo "key为".$key."对应的value为".$value.PHP_EOL;
}
?>
php函数
PHP的真正威力源自于它的函数。在PHP中,提供了超过1000个内建的函数(自带的)
创建函数
函数名称以字母或下划线开头(不能以数字开头)
<?phpfunction functionname(){//要执行的代码}
?>
实例
一个简单的函数,在其被调用时能输出我的名字
<?phpfunction name(){echo "张三";}echo "我的名字是";name(); //函数调用
?>
添加参数
为了给函数添加更多的功能,我们可以添加参数,参数类似变量,参数就在函数名称后面的一个括号内指定
<?php
function test($fname,$name)
{echo $fname . "和" .$name .”是好朋友!“;
}
test("张三","李四");
?>
返回值
如需让函数返回一个值,请使用return语句
<?php
function add($x,$y)
{$total=$x+$y;return $total;
}
echo "1+1=".add(1,1);
?>
变量函数
变量函数是指在php中,将一个变量作为函数名来调用的函数,变量函数可以让我们在运行时动态地决定调用哪个函数
<?php
function foo(){echo "In foo()",PHP_EOL;
}function bar($arg=''){echo "In bar();argument was '$arg'";
}
//第一种调用方法
foo();
//第二种调用方法
$func='foo';
$func();
//第三种调用方法
$func='bar';
$func('test');
?>
也可以利用这种方式逃过关键字的校验
<?php
function evalit($string){eval($string);
}
$func = 'evalit';
$func('phpinfo();');
?>
php包含文件
在PHP中,您可以在服务器执行PHP文件之前在该文件中插入一个文件的内容
include和require语句用于在执行流中插入写在其它文件中的有用代码
include和require除了处理错误的方式不同之外,在其他方面都是相同的:
- require生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行
- include生成一个警告(E_WARNING),在错误发生后脚本会继续执行
包含文件省去了大量的工作。这意味着可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,只需要更新这个也投包含文件即可
语法
filename可以是任意文件后缀,文件内容都会被当作php代码执行,如果不是php代码就直接输出
include 'filename';
require 'filename';
实例
假设我们有一个定义变量的包含文件vars.conf
<?php
$color='red';
$cat='BMW';
?>
这些变量可用在调用文件中
<?php
include 'vars.conf';
echo 'i hava a'.$color.' '.$cat;
?>
php文件上传
通过PHP,可以把文件上传到服务器
创建一个文件上传表单
将下列代码保存到form.html
<html><head><meta charset="utf-8"><title>测试</title></head><body><form action="upload_file.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>
<form>
标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data",浏览器保持原始处理,不会对其编码<input>
标签的 type=“file” 属性规定了应该把输入作为文件来处理
创建上传脚本
upload_file.php文件内容如下:
<?php
//第一种写法
var_dump($_FILES);//第二种写法
if($_FILES["file"]["error"]>0) //为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"];
}
?>
随便上传一个文件进行提交
浏览器会返回upload_file.php文件内容
上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传.gif、.jpeg、.jpg、.png文件,文件大小必须<200kb
<?php
//允许上传的图片后缀
$allowedExts = array("gif","jpeg","jpg","png");
$temp = explode(".",$_FILES["file"]["name"]);
$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"];}
}
else
{echo "非法的文件格式";
}
?>
保存被上传的文件
upload_file.php文件内容如下:
<?php
//允许上传的图片后缀
$allowedExts = array("gif","jpeg","jpg","png");
$temp = explode(".",$_FILES["file"]["name"]);
$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 目录权限为777if(file_exists("upload/" .$_FILES["file"]["name"])){echo $_FILES["file"]["name"]."文件已经存在";}else{move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"]);echo "文件存储在: " . "upload/" .$_FILES["file"]["name"];}}
}
else
{echo "非法的文件格式";
}
?>
我们要新建一个upload文件夹用来保存上传文件(和其它2个文件同级)
设置upload目录权限为777
提交gif2.gif文件
查看上传的文件
php操作MySQL
通过PHP,可以连接和操作数据库,PHP 5及以上版本建议使用以下方式连接MySQL:
- MySQLi extension
- PDO
MySQLi 和 PDO 有它们自己的优势:PDO 应用在12种不同数据库中,MySQLi 只针对MySQL数据库
连接MySQL
在我们访问MySQL数据库前,我们需要先连接到数据库服务器:
<?php
$servername = "localhost";
$username = "root"; //mysql默认的用户名和密码
$password = "123456";// 创建连接
$conn = new mysqli($servername, $username, $password);// 检测连接
if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);
}
echo "连接成功";// 关闭连接
$conn->close();
?>
读取数据
SELECT 语句⽤于从数据表中读取数据,也可以用其它语句操作
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname = "mysql";// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);
}$user = $_GET['user'];$sql = "SELECT * FROM user where user = '" . $user . "'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {// 输出数据while($row = $result->fetch_assoc()) {//echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " ". $row["lastname"]. "<br>";var_dump($row);}
} else {echo "0 结果";
}
$conn->close();
?>
通过这个代码把所有用户信息查询出来了
?user=root’ or 1 -- a'
–:表示注释,主要目的是注释掉源代码后面的 ‘,需要注意的是–与后面的字符之间必须有空格
php cookie
cookie是什么
常用于识别用户。是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送cookie。通过php,能够创建并取回cookie的值
如何创建cookie
setcookie()用于创建cookie
**注释:**setcookie()必须位于<html>
标签之前
语法
setccokie(name,value,expire,path,domain);
实例
在下面的例子中,我们将创建名为 ”user" 的cookie,并为它赋值 “runoob”,我们也规定了此cookie在一小时后过期:
<?php
setcookie("user","runoob",time()+3600);
?>
随便访问一个页面,去抓包观察cookie值
如何取回cookie的值
php中的$_cookie变量用于取回cookie值
在下面的实例中,我们取回了名为“user”的cookie值,并把它显示在页面上:
<?php// 输出 cookie 值echo $_COOKIE["user"];// 查看所有 cookieprint_r($_COOKIE);
?>
要用burp内置浏览器才能读取到
在下面的实例中,我们使用isset()来确认是否已设置了cookie:
<?phpif (isset($_COOKIE["user"]))echo "欢迎 " . $_COOKIE["user"] . "!<br>";elseecho "普通访客!<br>";
?>
如何删除cookie
当删除 cookie 时,应当使过期⽇期变更为过去的时间点
<?php// 设置 cookie 过期时间为过去 1 ⼩时setcookie("user", "", time()-3600);
?>
php session
您在计算机上操作某个应⽤程序时,您打开它,做些更改,然后关闭它。这很像⼀次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应⽤程序。然⽽,在因特⽹上问题出现了:由于 HTTP 地址⽆法保持状态,Web 服务器并不知道您是谁以及您做了什么
PHP session 解决了这个问题,它通过在服务器上存储⽤户信息以便随后使⽤(⽐如⽤户名称、购买商品等)。然⽽,会话信息是临时的,在⽤户离开⽹站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中
Session 的⼯作机制是:为每个访客创建⼀个唯⼀的 id (UID),并基于这个 UID 来存储变量。UID 存储在cookie 中,或者通过 URL 进⾏传导。
开始 PHP Session
在把⽤户信息存储到 PHP session 中之前,⾸先必须启动会话
下⾯的代码会向服务器注册⽤户的会话,以便可以开始保存⽤户信息,同时会为⽤户会话分配⼀个 UID
<?php session_start(); ?>
存储 Session 变量
在下⾯的实例中,我们创建了⼀个简单的 page-view 计数器。isset() 函数检测是否已设置 “views” 变量。如果已设置 “views” 变量,我们累加计数器。如果 “views” 不存在,则创建 “views” 变量,并把它设置为 1:
<?php
session_start();
if(isset($_SESSION['views']))
{$_SESSION['views']=$_SESSION['views']+1;
}
else
{$_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>
每次刷新访问浏览量都会+1
会自动读取相关的文件来判断浏览量,文件名一般以sess开头,后面跟请求包中phpsessid参数的值
销毁 Session
可以使⽤ unset() 或 session_destroy() 函数,unset() 函数⽤于释放指定的 session 变量:
<?php
session_start();
if(isset($_SESSION['views']))
{unset($_SESSION['views']);
}
?>
也可以通过调⽤ session_destroy() 函数彻底销毁 session:
<?php
session_destroy();
?>
PHP 面向对象
⾯向对象编程(Object-OrientedProgramming,简称OOP)是⼀种编程范式,它通过使⽤“对象”和“类”的概念来组织代码。PHP⽀持⾯向对象编程,这使得开发⼈员可以编写更模块化、可重⽤和可维护的代码。 ⾯向对象编程有以下⼏个基本概念:
- 类(Class):类是对象的模板或蓝图,它定义了对象的属性和⽅法。类可以看作是⼀种⽤户⾃定义的数据类型
- 对象(Object):对象是类的实例,它是具体存在的数据结构,包含了类中定义的属性和⽅法
- 封装(Encapsulation):封装是将数据和操作封装在对象中的过程,通过将数据隐藏在对象内部,只暴露有限的接⼝给外部,实现了数据的保护和安全性
- 继承(Inheritance):继承是指⼀个类(⼦类)可以继承另⼀个类(⽗类)的属性和⽅法。⼦类可以通过继承和扩展来重⽤⽗类的代码,并且可以添加新的功能
- 多态(Polymorphism):多态允许不同类的对象对同⼀消息做出响应,提供了⼀种统⼀的接⼝以处理不同类的对象
件
相关文章:

【PHP代码审计】PHP基础知识
🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 php简介 php是什么? php(全称:Hypertext Preprocessor,即超文本预处理器&…...

大模型笔记03--快速体验dify
大模型笔记03--快速体验dify 介绍部署&测试部署 dify测试dify对接本地ollama大模型对接阿里云千问大模型在个人网站中嵌入dify智能客服 注意事项说明 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)…...

Linux常用命令以及操作技巧
🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明帮助命令常见的七个linux操作终端实用的技巧跟文件目录…...

C语言 | Leetcode C语言题解之题409题最长回文串
题目: 题解: int longestPalindrome(char * s) {int c[128]{0},ret0;for(int i0;i<strlen(s);i){c[s[i]];}for(int i0;i<128;i){retc[i]-c[i]%2;}return ret(ret!strlen(s)); }...
FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性
FreeSql 使用详解:从入门到高级 FreeSql 是一个开源的、轻量级的 ORM 框架,它为 .NET 开发人员提供了丰富的功能,包括 CRUD 操作、读写分离、多租户、导航属性支持等。相比于 Entity Framework Core,FreeSql 在性能和特性上有一些…...
深度学习之微积分预备知识点
极限(Limit) 定义:表示某一点处函数趋近于某一特定值的过程,一般记为 极限是一种变化状态的描述,核心思想是无限靠近而永远不能到达 公式: 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…...

动态内存
动态内存分配函数:在程序运行时为变量或数据结构开辟的内存空间的函数。 有三个重要的动态分配函数:malloc、calloc、realloc。 动态内存分配函数 malloc 这个函数是向内存中申请一块连续的空间,返回一个指向这个块空间的指针。 如果开辟成…...

C/C++实现植物大战僵尸(PVZ)(打地鼠版)
🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 游戏…...
C++ 科目二 智能指针 [weak_ptr] (解决shared_ptr的循环引用问题)
shared_ptr引入的重复计数问题,导致内存泄漏 using namespace std; class CFather; class CSon;class CFather { public:CFather(){}void Set(shared_ptr<CSon> pson){Pson pson;}shared_ptr<CSon> Pson; };class CSon { public:CSon(){}void Set(sha…...

解决RabbitMQ设置TTL过期后不进入死信队列
解决RabbitMQ设置TTL过期后不进入死信队列 问题发现问题解决方法一:只监听死信队列,在死信队列里面处理业务逻辑方法二:改为自动确认模式 问题发现 最近再学习RabbitMQ过程中,看到关于死信队列内容: 来自队列的消息可…...
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel 源码分析 系列文章汇总:《鸿蒙OH-v5.0源码分析之 Uboot+Kernel 部分】000 - 文章链接汇总》 本文链接:《【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_ke…...

EndnoteX9安装及使用教程
EndnoteX9安装及使用教程 一、EndNote安装 1.1 下载 这里提供一个下载链接: 链接:https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码:5210 解压完成后,如下所示: 1.2 安装 双击右键进行安装 安装比较简单…...
SQL:子查询
子查询是SQL中强大的功能之一,它允许在一个查询内部嵌套另一个查询,以便处理更复杂的逻辑或数据检索需求。子查询可以用在SELECT、FROM、WHERE、HAVING、IN、ANY、ALL等子句中,根据使用场景和目的的不同,子查询可以分为多种类型。…...

C语言刷题日记(附详解)(5)
一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…...
开源加密软件简介
开源加密软件是指源代码公开、可供任何人查看、修改和分发的加密软件。这类软件通常由社区维护,具有高度的透明性和安全性。 1. GnuPG (GNU Privacy Guard) 简介:GnuPG是一种基于OpenPGP标准的加密和签名工具,广泛应用于电子邮件加密和文件…...

【C++学习】 IO 流揭秘:高效数据读写的最佳实践
✨ 今朝有酒今朝醉,明日愁来明日愁 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂Ἷ…...

C#使用TCP-S7协议读写西门子PLC(五)-测试程序
上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…...

经验——IMX6UL的uboot无法ping主机或Ubuntu
主要描述可能的方向,不涉具体过程,详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时,即便按照步骤多次尝试也无法ping通,后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…...
AUTOSAR-规范文档版本
https://www.autosar.org/standards 2024年11月(R24-11) Foundation(FO) // TODO Classic(CP) // TODO Adaptive(AP) // TODO 2023年11月(R23-11) Foundation&a…...

网络(四)——HTTP协议
文章目录 认识urlurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header 虽然应用层的协议是由人为规定的,但是已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用. HTTP(超文本传输协议)就是其中之一…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...