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

相关推荐
疯一样的码农5 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
&岁月不待人&27 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove31 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道39 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒42 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE1 小时前
【Java SE】StringBuffer
java·开发语言
就是有点傻1 小时前
WPF中的依赖属性
开发语言·wpf
洋2401 小时前
C语言常用标准库函数
c语言·开发语言
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel