香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 94|回复: 0

Web渗透 之 PHP基础

[复制链接]

2

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-5-27 15:37:37 | 显示全部楼层 |阅读模式
===========  PHP 基础  ===========

Web 架构中后端(服务器端)脚本语言。为实现网站动态应用提供支持,通常与Apache(Web 容器)和MySQL(数据库)配合,构建一个免费开源的Web 应用环境(LAMP/WAMP)。
本课程中所使用的环境是phpStudy 。
0x01 初识PHP脚本程序

PHP语言标记

<?php               //开始标记,
//<?                //php的短标记,需要在php.ini 中进行配置。
phpinfo();          //显示php 的详细配置信息,其中包含系统与Apache 服务器信息。
                    //结束标记
?>

  • 只要能够在一个网站中,看到phpinfo() 的内容,说明php 环境'正常';如果是一个在线的网站能够看到该页面,说明存在敏感信息泄露  漏洞,这个漏洞需要体现在后面的渗透测试报告中;再有,如果通过文件上传,能够看到该页面,说明存在文件上传  漏洞,并且能够"完美利用"。
  • <?php ?> 这之间就表示进入PHP模式,在开始和结束标记之外的内容都会被PHP解析器忽略,之外的内容会被作为字符输出到浏览器中。
  • 可以直接嵌入到html代码中,并且可以嵌入到html代码中的任何地方,可以实现PHP 代码与HTML 代码进行混编 ,HTML 代码对于PHP 来说,就是字符串。PHP 负责将字符输出到浏览器中,浏览器负责根据字符中所包含的HTML 代码进行渲染。
  • 在一个html文档中可以嵌入任意多个PHP 标记!
  • 文件末尾的PHP代码段结束标记?> 可以不要,在一些情况下省略掉更好!
  • 建议,不要省略结束标记。
指令分隔符

分号,;。

  • PHP 用分号表示一句话的结束。
  • 结束标志?> 就隐含一个分号,所以PHP 代码最后一行可以不用加分号!
  • 建议,每条PHP 语句都要使用分号结束。
注释

<?php
/*
这是一个多行注释,
可以有多行文字
*/
//这是单行注释
?>
<?php
/*
    This is index.php!
    --AJEST--
*/

// DNSec.com.cn

?>
遇到空白的处理

空白符包括:

  • 空格
  • tab制表符
  • 换行
这些在PHP中都是无关紧要的(注意都是英文输入法下输入的),可以将一个语句展开成任意行,或者紧缩在一行,空格与空行的合理运用可以增强代码的清晰性与可读性,如果运用不合理反而会对阅读产生负担!
不能是用空白符打断PHP 的关键字(函数名,语句名,变量名,类名,方法名等等)。
0x02 变量

现实生活中在家里用柜子来存放衣服、包、书籍或者其他的东西。
中药房。
变量包含四个部分内容:

  • 变量名
  • 内存空间(一般不需要关心,都是程序自动完成创建与销毁的。)
  • 变量值(变化)
  • 数据类型,变量值的类型(可以是抽象的)
变量是用于临时存储值的容器。
变量在任何编程语言中的都是核心地位。
另外,PHP 脚本语言是一种弱类型语言,和其他语言不同的是变量(常量)的数据类型由程序的上下文决定(给一个变量赋予什么样的值,就是什么数据类型)。
变量的声明

PHP的特性之一就是它不要求在使用变量之前声明变量,当第一次给一个变量赋值时,才创建了这个变量,变量用于存储值比如数字、文本字符串或者数组。一旦设置了某个变量,就可以在脚本中重复地使用它。
PHP 中变量必须使用一个美元符号$ 后面跟着变量名来表示,使用赋值操作符= 给一个变量赋值。
<?php
echo $name;             //notice,变量未定义,内存中没有该变量。
$name = "AJEST";        //变量的初始化赋值,会在内存创建该变量。
echo $name;             //AJEST
?>
变量的释放

unset() 函数释放指定的变量。
<?php
echo $name;
$name = "AJEST";
echo $name;
echo "<hr />";
unset($name);           //释放$name
echo $name;             //Notice: Undefined variable: name
?>
变量的命名


  • 变量名是严格区分大小写的。以下变量是完全不同的。
<?php
$name = 'AJEST';
echo $Name;
echo $NAME;
echo $nAme;
?>

  • 变量名由字母、数字、下划线组成,并且不能以数字开头,也不能包含其他字符(空白字符、特殊字符、空白符等等)。
<?php
$name = "AJEST";
$name1 = "ajest";
$my_name = "一统天下";
$_name = "一统天下豪杰";
//$1name;
//$n@me;
//$nam$;
?>

  • 变量命名时,建议使用驼峰式命名法或者下划线命名法,做到变量名"见名知意"。
<?php
$firstName;
$lastName;
$first_name;
$last_name;
?>

  • PHP中有一些标示符是系统定义的,也称为关键字,是PHP语言的组成部分,因此不能使用它们中的任何一个作为常量函数名或类名。但是和其他语言不同的是可以在PHP中作为变量名称使用,不过这样容易混淆,所以最好还是不要用PHP的关键字作为变量名称。
<?php
$echo;                 //建议不要使用
?>
变量的赋值与初始化

在第一次使用变量时,就进行赋值,这个过程叫"初始化"。在后期使用变量的时候,可以随时修改变量的值。
直接用一个等于号=,就可以完成变量的赋值。
<?php
echo $name;                                        //Notice: Undefined variable: name
echo "<hr />";
$name;
echo $name;                                        //Notice: Undefined variable: name
echo "<hr />";
$name = "AJEST";
echo $name;                                        //AJEST
?>
可变变量 - $$

一个变量的名字 可以动态的设置和使用。
$$ 是php 的特性,也是产生php 中变量覆盖漏洞 的原因。
<?php
$name = "AJEST";
$$name = "dnsec.com.cn";        //$AJEST
echo $name;
echo "<hr />";
echo $$name;
echo "<hr />";
echo $AJEST;                                //dnsec.com.cn,定义过$AJEST,并且进行了初始化。
?>
变量引用赋值

引用赋值可以简单的理解为给变量起了个别名。
<?php
$a = 6;
$$a = 100;                        //$6
echo $$a ;                        //100
                                        //$6,这种写法是非法的

echo "<hr />";
$b = $a;
$b +=1;
echo $b;echo "|";echo $a;
echo "<hr />";
$c = &$a;                        //变量的引用赋值,
                                        //相当于给变量名起了一个别名
$c +=1;
echo $c;echo "|";echo $a;
?>
0x03 变量类型

变量类型是指保存在该变量中的数据的数据类型,在计算机编程语言世界中每个数据都有它的类型。
具有相同类型的数据才能被彼此相互操作。
在强类型的语言中例如C语言,变量要先指定类型(变量的声明),然后才可以存储对应指定的数据,就好比现实生活中在制作一个柜子之前,就要决定好这个柜子是什么类型的柜子,是书柜那么以后就只能用来存书,是衣柜以后就只能用来存衣服。
但是PHP 是一种弱类型的语言,和其他语言不同的是,变量或者常量的数据类型由程序的上下文决定,不需要事先声明类型。一个柜子,要是往里面存书籍那么他就是书柜;要是往里面存放衣服,那么它就是衣柜,根本不需要事先说明这个是书柜还是衣柜,一切根据实际需要使用即可!
可以将数据的变量类型输出,使用的函数var_dump()。
<?php
$name= "AJEST";
$age = 24;
var_dump($name);                //string(5) "AJEST"
var_dump($age);                        //int(24)
?>
bool - 布尔型

boolean
这个是最简单的类型,布尔型表达了true 或false ,即真或假。
<?php
$a = true;
$b = false;
var_dump($a);
echo "<hr />";
var_dump($b);
?>
进行if 判断的时候,会有类型转换(PHP 定义好了的),其他类型的之转换成布尔类型的值。以下值被认为是false,其他的值都是被认为是true。

  • bool(false)
  • int(0)
  • float(0)
  • string(0) "" 或者 string(1) "0"
  • array(0) { }
  • NULL
<?php
//$a = true;        //True
//$a = false;        //Fasle
//$a = 0;
//$a = 0.0;
//$a = "0";
//$a = "";
//$a = array();
$a = null;
var_dump($a);
echo "<hr />";

if($a){
        echo 'True';
}else{
        echo 'False';
}
?>
int - 整型

存储整数
<?php
$age = 24;
var_dump($age);
?>
float - 浮点型,也称double

浮点型,指包含小数的数。
<?php
$score = 59.9;
var_dump($score);
?>
string - 字符串

字符串是一系列的字符。
字符串可以使用单引号、双引号、定界符三种方法来定义!

  • 单引号

    • 指定一个简单的字符串最简单的方法是使用一对单引号'括起来。
    • 注意在单引号括起来的字符串中不能再包含单引号,如果实在要用单引号那么就需要用反斜杠()转义。
    • 单引号字符串中出现的变量不会被变量的值替代,即PHP 不会解析单引号中的变量,因此在定义简单字符串的时候,使用单引号会效率更高,因此没有特别的要求,应使用单引号定义字符串!


<?php
$name = 'AJEST';                                //string(5) "AJEST"
$str = 'let\'s go!';                        //string(9) "let's go!"
$str = '{$name},let\'s go!';        //string(17) "{$name},let's go!"
var_dump($name);
?>

  • 双引号

    • 双引号" 括起来
    • 双引号中包含双引号,需要进行转义。
    • 其中的变量名会被变量值所代替,即PHP 会解析双引号之间的变量,最好用{} 将变量名括起来。


<?php
$name = 'AJEST';
$str = "let's go!";                                //string(9) "let's go!"
$str = "Do you like \"me\"?";        //string(17) "Do you like "me"?"
$str = "{$name},let's go!";                //string(15) "AJEST,let's go!"
$str = "{\$name},let's go!";        //string(17) "{$name},let's go!"
var_dump($str);
?>
经常会用PHP 语言写一些HTML 代码。
My name is <span id = 'name' style = "color:pink;">{$name}</span>

  • 定界符

    • 定界符定义的字符串中的单双引号,还有大部分特殊字符不需要进行转义。
    • <<< 之后提供一个标示符开始,然后是字符串的内容最后是同样的标示符表示结束,结束标示符之后必须接; 不可以用其他的任何字符(包括分号之后)。
    • 标示符的命名规则:字母、数字、下划线,并且不能以数字开始。
    • 定界符中的$ 同样会识别成变量,变量名要用{} 括起来。


<?php
$name = 'XJH';
$str = <<<HTML

My name is <span id = 'name' style = "color:pink;">{$name}</span>

HTML;

echo $str;
?>
其他数据类型


  • 数组
  • 对象
  • 资源
变量类型相互转换(了解)


  • 自动类型转换

    • 有布尔值参与运算时,true将转化为整型1,false将转化为整型0
    • 有null值参与运算时,null值转化为整型0再进行运算
    • 有int型和float数据参与运算时,先把int转变为float类型后再进行运算
    • 有字符串和数字型(int或者float)参与运算时的情况 这些都是程序运行中不太可控的部分所以在编写代码时最好不要涉及!



  • 强制类型转换

    • 在要转换的变量之前加上括号括起来目标类型
    • (int)
    • (bool)
    • (float)
    • (string)
    • (array)
    • (object)
    • 转变并不会改变被转换变量本身的类型



  • 变量类型的测试函数

    • is_bool()
    • is_int()
    • is_array() ...


0x04 常量

常量是一个简单值的标示符,如其名称所暗示的。在PHP 脚本执行期间一个常量一旦被定义,就不能被改变或者取消定义,常量的作用于是全局,常量包含bool,int,float,string类型的数据!
定义和使用

define()
常量的命名与变量类似,也遵循PHP标识符的名称规则,按照惯例常量标识符总是大写的
<?php
define('NAME','ZTY');
var_dump(NAME);
NAME='SHK';                        //Parse error: syntax error, unexpected '='
var_dump(NAME);
?>
常量和变量的区别


  • 常量前面没有美元符号$ 。
  • 常量只能用define() 函数定义,不能通过赋值语句。
  • 常量可以不用理会变量范围的规则而在任何地方(函数的内部或者外部)定义和使用。
  • 在PHP 脚本执行期间内,常量一旦被定义就不能被重新定义或者取消定义。
  • 常量的值一般是bool ,int ,float ,string 类型。
预定义常量

预先定义好的常量,就是程序中可以直接使用的常量,一般来完成一些特殊功能!
常量名常量值__FILE__当前的文件名,完整的路径__LINE__当前行号__FUNCTION__当前的函数名__CLASS__当前的类名__METHOD__当前对象的方法名PHP_OSUNIX或WINNT等PHP_VERSION当前PHP 服务器的版本DIRECTORY_SEPARATOR\或/    根据操作系统决定目录的分隔符
<?php
define('NAME','ZTY');
var_dump(NAME);
//NAME='SHK';                        //Parse error: syntax error, unexpected '='//
//var_dump(NAME);
var_dump(__FILE__);                //string(35) "C:\phpStudy\WWW\php\sjlx\define.php"

var_dump(__LINE__);                //int(8)
var_dump(PHP_OS);                //string(5) "WINNT"
var_dump(PHP_VERSION);        //string(6) "5.4.45"
var_dump(DIRECTORY_SEPARATOR);        // string(1) "\"
?>
0x05 运算符

运算符对一个或者多个操作数(变量或者数值)执行某种运算的符号,也称操作符!
算术运算符

例子名称结果-$a取反$a 的负值$a + $b加法$a 和 $b 的和$a - $b减法$a 和 $b 的差$a * $b乘法$a 和 $b 的积$a / $b除法$a 除以 $b 的商$a % $b取模$a 除以 $b 的余数++$a前加$a 的值加一,然后返回 $a$a++后加返回 $a,然后将 $a 的值加一--$a前减$a 的值减一, 然后返回 $a$a--后减返回 $a,然后将 $a 的值减一
<?php
$a = 3;
$b = 5;
var_dump(-$a);                                //int(-3)
var_dump($a+$b);                        //int(8)
var_dump($a-$b);                        //int(-2)
var_dump($a*$b);                        //int(15)
var_dump($a/$b);                        //float(0.6)
var_dump($a%$b);                        //int(3)
$a = 10;var_dump(++$a);                //int(11)
$a = 10;var_dump($a++);                //int(10)
$a = 10;var_dump($a--);                //int(10)
$a = 10;var_dump(--$a);                //int(9)
?>
字符串运算符

对于JS 来说,字符串拼接+ ,另外. 访问对象中的属性或者方法。
但是PHP 中使用. 进行字符串拼接。PHP 中. 也叫连接运算符。
<?php
$name = "AJEST";
$str = "Hello , ".$name; //string(13) "Hello , AJEST"
var_dump($str);
?>
赋值运算符


  • 二元运算符

    • 左边的操作数必须是变量,右边可以是一个表达式,也可以是一个值,一个变量等等!
    • 作用:将右边表达式的值赋给左边变量


二元赋值运算符例子解释=+=-=*=/+%=.=
<?php
$a = 10;
$b = 5;
$c = $a;        $c +=$a;                //$c=$c+$a,int(20)
$c = 5;                $c -=$a;                //$c=$c-$a,int(-5)
$c = 4;                $c *=$a;                //$c=$c*$a,int(40)
$c = 20;        $c /=$a;                //$c=$c/$a,int(2)
$c = 21;        $c %=$a;                //$c=$c%$a,int(1)
$c = "Hello";$a = "World";
$c .=$a;                                        //$c = $c.$a,string(10) "HelloWorld"
var_dump($c);
?>
比较运算符

对操作数(按照比较运算符的要求,规则)进行比较后,得到返回值(boolean)。
如果比较出的结果满足比较运算符的要求那么结果就是true(真,成立,满足),否则就是false (假,不成立,不满足)  
例子说明备注$a == $b等于$a === $b全等值相等并且数据类型相同$a != $b不等$a <> $b不等$a !== $b不全等$a < $b小于$a > $b大于$a <= $b小于等于$a >= $b大于等于
<?php
$a = 10;
$b = 20;
$c = $a <> $b;        //bool(true)
$c = $a == $b;        //bool(false)
//var_dump($c);
echo $c;
?>

  • 注意:

    • PHP 中规定
    • 使用echo 输出布尔类型值的时候
    • echo true; ,它在页面中会输出1
    • echo false; ,它会在页面中什么都不输出
    • 建议使用var_dump() 来输出更明了的结果!


逻辑运算符

逻辑运算符例子解释运算符法则and$a and $b逻辑"与"运算&&$a && $bor$a or $b逻辑"或"运算||$a || $bxor$a xor $b逻辑"异或"运算相同为假,不同为真!!$a逻辑"非"运算
<?php
$a = true;$b = false;$c = ($a xor $b);                //bool(true)
//$a = true;$b = true;$c = ($a xor $b);                //bool(false)   
//$a = false;$b = true;$c = ($a xor $b);        //bool(true)  
//$a = false;$b = false;$c = ($a xor $b);        //bool(false)
var_dump($c);
?>
其他运算符


  • ?:
<?php
$a = 10;
$b = 20;
$max = ($a>$b)?$a:$b;
var_dump($max);                //int(20)
?>

  • 反引号 调用系统命令,
<?php
$cmd = "net user Guest";
echo "<pre>".`$cmd`;                //调用系统命令
?>

  • @ 屏蔽表达式可能发生的错误。
<?php
$name;
echo @$name;                        //屏蔽Notice       
?>
运算符的优先级


  • 优先级的概念:

    • 谁的优先级别高就先算谁!



  • 结合方向

    • 规定了从那个方向开始算的问题!
    • 赋值运算符=,右边的值给左边的值。
    • 减法运算符-,左边的值减去右边的值。



  • 优先级归纳:
结合方向运算符附加信息无clone newclone 和 new左[array()右**算术运算符右++ -- ~ (int) (float) (string) (array) (object) (bool) @类型和递增/递减无instanceof类型右!逻辑运算符左*/%算术运算符左+-.算术运算符和字符串运算符左<<>>位运算符无<<=>>=比较运算符无==!====!==<><=>比较运算符左&位运算符和引用左^位运算符左|位运算符左&&逻辑运算符左||逻辑运算符左??比较运算符左? :ternary右=+=-=*=**=/=.=%=&=|=^=<<=>>=赋值运算符左and逻辑运算符左xor逻辑运算符左or逻辑运算符

  • 圆括号的作用:

    • 用圆括号可以将表达式里面的某一块看成一个整体。
    • 使用括号可以增强代码的可读性。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 03:41 , Processed in 0.731448 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表