【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_ERRORE_WARNINGE_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 newclone和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):多态允许不同类的对象对同⼀消息做出响应,提供了⼀种统⼀的接⼝以处理不同类的对象

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142633.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

数据与结构算法平衡二叉树详解叉树--基本概念

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;又被称为AVL树&#xff08;有别于AVL算法&#xff09;&#xff0c;且具有以下性质&#xff1a;它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1&#xff0c;并且左右两个子树都是一棵平衡二叉树。这个方案很好…

图解Redis 01 | 初识Redis

什么是 Redis&#xff1f; Redis 是一种基于内存的数据库&#xff0c;所有的数据读写操作都在内存中完成&#xff0c;因此读写速度非常快。它被广泛应用于缓存、消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务需求&#xff0c;如 String、Hash、List、…

环形数组与单向链表的队列实现(Queue)

什么是队列 队列是一种重要的线性数据结构&#xff0c;具有先进先出&#xff08;FIFO&#xff09;的特性。元素的插入操作称为入队&#xff0c;删除操作称为出队。队列在许多计算机科学应用中非常常见&#xff0c;如任务调度和数据缓冲等。 在实现队列时&#xff0c;可…

路由策略PBR

文章目录 策略路由PBR概述本地流量接口策略 策略路由 策略路由和路由策略的区别&#xff1a; 策略路由可以不按照路由表进行转发路由策略主要控制路由信息的引入、发布和接受等&#xff0c;主要靠 RIB和FIB PBR概述 比路由策略耗资源&#xff0c;直接跳过路由表&#xff0c;数…

Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)

Pytorch详解-模型模块 Module & parameterModule初认识forward函数 ParameterPytorch中的权重、参数和超参数 Module容器-ContainersSequentialModuleListModuleDictParameterList & ParameterDict 常用网络层LSTM输入和输出 GRUConvolutional Layers卷积层的基本概念常…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为&#xff1a; 接下来我们将对其中较重要的部分进行介绍。 4位版本&#xff1a;这里的四位版本只有两个取值 分别为IPv4和IPv6&#xff0c;这两个额分别为不同的IP协议&#xff0c;但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

linux系统如何通过进程PID号找到对应的程序在系统中的路径

linux系统如何通过进程PID号找到对应的程序在系统中的路径 首先我们用ps -aux​命令找到对应进程的PID号&#xff0c;比如我这里要得就是xmrig这个进程的PID号 ​​ 通过lsof命令查看对应进程的关联的文件&#xff0c;并找到可执行文件的路径 lsof -p 22785 | grep txt​​ 或…

棉花叶片病害检测数据集

【棉花叶片病害检测数据集】nc: 5 names: [blight, curl, healthy, wilt, wilt_png] 名称&#xff1a;【枯萎病, 卷叶病, 健康&#xff0c;萎蔫病&#xff0c;‘萎蔫病图像’】共3474张&#xff0c;8:1:1比例划分&#xff0c;&#xff08;train;2888张&#xff0c;val&#xff…

MVCC机制解析:提升数据库并发性能的关键

MVCC机制解析&#xff1a;提升数据库并发性能的关键 MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 多版本并发控制 。 MVCC只在事务隔离级别为读已提交(Read Committed)和可重复读(Repeated Read)下生效。 MVCC是做什么用的 MVCC是为了处理 可重复读 和…

C++ 带约束的Ceres形状拟合

C 带约束的Ceres形状拟合 一、Ceres Solver1.定义问题2. 添加残差AddResidualBlockAutoDiffCostFunction 3. 配置求解器4. 求解5. 检查结果 二、基于Ceres的最佳拟合残差结构体拟合主函数 三、带约束的Ceres拟合残差设计拟合区间限定 四、拟合结果bestminmax 五、完整代码 对Ce…

无法将ggplot图保存为PDF文件怎么办

即serif代表Times New Roman字体&#xff0c;sans代表Arial字体&#xff0c;mono代表Courier New字体。这种映射关系在基础绘图系统和ggplot2系统中均可使用。 既然字体找不到&#xff0c;那么就导入我们电脑的字体咯&#xff1a; # 这个代码只需运行一次 extrafont::font_im…

使用GitHub Actions实现前后端CI/CD到云服务器

一、静态站点部署&#xff08;前端&#xff09; 如果你要部署到github pages或者你不用SSR&#xff08;服务端渲染&#xff09;&#xff0c;那就构建&#xff08;SSG&#xff09;静态站点 配置 nextjs配置SSG&#xff08;静态站点&#xff09;next.config.mjs&#xff0c;其…

跨域训练评估BEVal:自动驾驶 BEV 的跨数据集评估框架

跨域训练评估BEVal&#xff1a;自动驾驶 BEV 的跨数据集评估框架 Abstract 当前在自动驾驶中的鸟瞰图语义分割研究主要集中在使用单个数据集&#xff08;通常是nuScenes数据集&#xff09;优化神经网络模型。这种做法导致了高度专业化的模型&#xff0c;可能在面对不同环境或…

孙溟㠭浅析中国碑帖〈曹全碑〉

孙溟㠭浅析中国碑帖《曹全碑》 《曹全碑》 《曹全碑》亦称《郃阳令曹全碑》&#xff0c;东汉时期的碑刻。属于隶书体&#xff0c;东汉中平二年&#xff08;公元158年&#xff09;立碑。 《曹全碑》 于明代万历初年在陕西郃阳县莘里村被发现&#xff0c;碑文记载了东汉末年曹全…

2025秋招LLM大模型多模态面试题(七)- 思维链CoT

1.思维链(cot) 论文名称:Chain-of-Thought Prompting Elicits Reasoningin Large Language Models论文连接:Chain-of-Thought Prompting Elicits Reasoningin Large Language Models1.什么是思维链提示? 思维链(CoT)提示过程是一种最近开发的提示方法,它鼓励大语言模型解…

GUI编程14:Icon(图标)、ImageIcon(图像图标)标签

视频链接&#xff1a;16、Icon、ImageIcon标签_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p16&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.在Label上添加Icon package com.yundait.lesson04;import javax.swing.*; import java.awt.*;public cl…

C++数据结构-树的深度优先搜索及树形模拟法运用(进阶篇)

1. DFS简介 深度优先搜索算法&#xff08;英语&#xff1a;Depth-First-Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件&am…

Vue2电商平台项目 (三) Search模块、面包屑(页面自己跳自己)、排序、分页器!

文章目录 一、Search模块1、Search模块的api2、Vuex保存数据3、组件获取vuex数据并渲染(1)、分析请求数据的数据结构(2)、getters简化数据、渲染页面 4、Search模块根据不同的参数获取数据(1)、 派发actions的操作封装为函数(2)、设置带给服务器的参数(3)、Object.assign整理参…

comfyui中报错 Cmd(‘git‘) failed due to: exit code(128) 如何解决

&#x1f388;背景 comfyui今天在安装插件的过程中&#xff0c;发现有个插件第一次安装失败后&#xff0c;再次安装就开始报错了&#xff0c;提示&#xff1a; ComfyUI-Inpaint-CropAndStitch install failed: Bad Request 截图如下&#xff1a; 看下后台的报错&#xff1a; …