【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 "

    php很有趣

    "; echo "hello world!
    "; echo "这是","多个","字符串";

    print "

    php很有趣

    ";
    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 复制代码
<?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 复制代码
<?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 复制代码
<?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个内建的函数(自带的)

创建函数

函数名称以字母或下划线开头(不能以数字开头)

复制代码
<?php
	function functionname()
	{
	//要执行的代码
	}
?>

实例

一个简单的函数,在其被调用时能输出我的名字

复制代码
<?php
	function 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 目录权限为777
        if(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'

--:表示注释,主要目的是注释掉源代码后面的 ',需要注意的是--与后面的字符之间必须有空格

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"];
 // 查看所有 cookie
 print_r($_COOKIE);
?>

要用burp内置浏览器才能读取到

在下面的实例中,我们使用isset()来确认是否已设置了cookie:

复制代码
<?php
 if (isset($_COOKIE["user"]))
 echo "欢迎 " . $_COOKIE["user"] . "!<br>";
 else
 echo "普通访客!<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):多态允许不同类的对象对同⼀消息做出响应,提供了⼀种统⼀的接⼝以处理不同类的对象

相关推荐
小白狮ww13 分钟前
Retinex 算法 + MATLAB 软件,高效率完成图像去雾处理
开发语言·人工智能·算法·matlab·自然语言处理·图像识别·去雾处理
liuxizhen200922 分钟前
thinkcmf搭建
php
cwtlw24 分钟前
java基础知识面试题总结
java·开发语言·学习·面试
西元.31 分钟前
多线程循环打印
java·开发语言·jvm
高林雨露31 分钟前
Kotlin 基础语法解析
android·开发语言·kotlin
ml1301852887438 分钟前
DeepSeek 助力心理医生小程序赋能!心理咨询小程序 线上咨询平台搭建
java·开发语言·小程序
不辉放弃38 分钟前
零基础讲解pandas
开发语言·python
tangweiguo030519871 小时前
(Kotlin)Android 高效底部导航方案:基于预定义 Menu 和 ViewPager2 的 Fragment 动态绑定实现
android·开发语言·kotlin
ChiaWei Lee1 小时前
【C语言】深入理解指针(三):C语言中的高级指针应用
c语言·开发语言
最后一个bug1 小时前
教你快速理解linux中的NUMA节点探测是干什么用的?
linux·c语言·开发语言·arm开发·嵌入式硬件