欢迎来到《PHP学习》
简单基础入门
代码块格式
<?php //使用双斜线注释
echo 'hello,world!'; /* 多行注释 */
?>
输出
文本
通过 PHP,有两种在浏览器输出文本的基础指令:echo
和 print
echo 'hello,world!';
print 'hello,world,too!';
变量
print_r();
用于打印变量
$a=1;
print_r($a);
>>> 1
var_dump() 输出变量相关信息
显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a); //试一试输出数值
$b = 3.1;
$c = true;
var_dump($b, $c); //输出两个变量的相关信息
?>
输出
> array(3) { //数组将递归展开值
[0]=>int(1)
[1]=>int(2)
[2]=>array(3) {
[0]=>string(1) "a"
[1]=>string(1) "b"
[2]=>string(1) "c"
}
}
float(3.1) //关于一个或多个表达式的结构信息
bool(true)
scandir() 输出目录
扫描目录
scandir(*directory,sorting_order,context*);
directory 必需。规定要扫描的目录。
sorting_order 可选。规定排列顺序。默认是 0,表示按字母升序排列。如果设置为 SCANDIR_SORT_DESCENDING 或者 1,则表示按字母降序排列。如果设置为 SCANDIR_SORT_NONE,则返回未排列的结果。
context 可选。规定目录句柄的环境。context 是可修改目录流的行为的一套选项。
例子
<?php
$dir = "/images/"; //设置变量dir的值为 目录/images/
$a = scandir($dir);
$b = scandir($dir,1); //两种不同的字母顺序
print_r($a);
print_r($b);
?>
输出
Array //print_r($a);的输出结果,(字母升序)
(
[0] => .
[1] => ..
[2] => cat.gif
[3] => dog.gif
[4] => horse.gif
[5] => myimages
)
Array //print_r($b);的输出结果,(字母降序)
(
[0] => myimages
[1] => horse.gif
[2] => dog.gif
[3] => cat.gif
[4] => ..
[5] => .
)
变量
以 $ 符号开始
必须以字母或者下划线字符开始
只能包含字母、数字以及下划线(A-z、0-9 和 _ )
不能包含空格
大小写敏感
数组 Array
$a = array(1, 2, array("a", "b", "c"));
//数组【1,2,【a,b,c】】
//这里套娃了一个数组
关联数组
创建
$age=array("Peter"=>"35","Ben"=>"43","Joe"=>"42")
或者
$age['Peter']=35
$age['Ben']=43
$age['Joe']=42
使用
echo "Peter is " . $age['Peter'] . " years old.";
遍历
$age = array("A"=>"1","B"=>"2","C"=>"3");
foreach($age as $a=>$a_value ) //
{echo "Key=". $a . ",Value=" . $a_value;
echo '<br>';}
???没看懂【这玩意有毒,以后再看】
数组排序
sort(array,sortingtype); //array:要排序的数组【升序】
//sortingtype:0 默认。把每一项按常规顺序排列;1,把每一项作为数字来处理;2,把每一项作为字符串来处理;
例如:$numbers=array(4,6,2,22,11);
rsort(array,sortingtype) //【降序】排序
——————对于关系型——————
ksort(array,sortingtype) //对关联数组按照键名进行升序排序
krsort(array,sortingtype) //对关联数组按照键名进行降序排序
asort(array,sortingtype) //对关联数组按照键值进行升序排序
arsort(array,sortingtype) //对关联数组按照键值进行降序排序
foreach遍历
$x=array(1=>"Google", 2=>"Runoob", 3=>"Taobao");
foreach ($x as $key => $value)
{
echo "key 为 " . $key . ",对应的 value 为: ". $value . PHP_EOL;
}
——————>>>输出为:
key 为 1,对应的 value 为: Google
key 为 2,对应的 value 为: Runoob
key 为 3,对应的 value 为: Taobao
//每一次循环,当前数组元素的键与值就都会被赋值给 $key 和 $value 变量。
在第一步中【1=>"Google"】在【$x as $key => $value】上进行赋值,然后在echo里面输出$key和$value。相当于一个不断移动的指针
浮点数 Float
$a = 1.23456789;
var_dump($a);
>>> float(1.23456789)
整数 Int
$a = 0x7e;
var_dump($b);
>>> int(126)
运算符
+ - * / //加减乘除,不必多说
&& 与 || 或 ! 非 xor 异或
例:
127.0.0.1|ls
127.0.0.1||ls
127.0.0.1&ls
127.0.0.1&&ls
和= md5弱类型
== 弱类型比较,的比较要求式子两边的值相等,类型会自动转化
=== 强类型比较,先判断两种字符串的类型是否相等,再比较
“两边的值为0ex开头的即可,因为0e开头的会自动转化成科学计数法”
CBUUCTF题目: 【Easy MD5】
md5弱类型,为0e开头的会被识别为科学记数法,结果均为0
字符串
$c = '字符串111';
var_dump($c);
>>> string(12) "字符串111"
常用函数
测量长度
strlen(); //返回字符串本身的长度
例如: echo strlen("hello world");
查找位置
strpos(str1,str2); //查找str2在str1中的第一次出现的位置号
例如: echo strpos("hello world","hello");
>>> 0
//返回查找到的位置。注:字符串第一个字符的位置为0
strchr(str1,str2) //查找str2在str1中的第一次出现,并返回此字符串的其余部分
例如: echo strchr("Hello world!","world");
>>> world!
比较大小
strcmp(str1,str2) //比较str1,str2两个字符串
例如: echo strcmp("Hello","hELLo");
>>> -1 //相等返回0,str1>str2返回>0,str1<str2返回<0
返回字符串的一部分
substr(string,start) //从string 的start位置开始提取字符串
字符转化HTML实体(编码)
htmlentities(string,flags,character-set,double_encode) //把一些字符转换为 HTML 实体
例:
$str = "<© W3CSçh°°¦§>";
echo htmlentities($str);
>>> <© W3CSçh°°¦§>
》在浏览器里输出为: <© W3CSçh°°¦§>
比较复杂,建议参考【https://www.runoob.com/php/func-string-htmlentities.html】
addslashes()和addcslashes() 自动加反斜杠
addslashes(str)
例如: $a = "1' or 1=1 #";
echo addslashes($a);
输出>>> 1\' or 1=1 # //单引号前加上了反斜杠,注入语句被拦截
//预定义字符是单引号(')双引号(")反斜杠(\)NULL。默认转义这些字符。
//addslashes(str1,charlist) //升级版,预定义字符为charlist,你自己设定
例如: echo addcslashes("hello d world","d");
>>> hello \d worl\d //在设定的charlist前加上了反斜杠
stripslashes和stripcslashes()
用法和上面的相似,效果相反。
stripslashes(strt) //删除由stripslashes添加的反斜杠
stripcslashes(str1,charlist) //删除由stripcslashes添加的反斜杠
超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
$GLOBALS
$_SERVER
$_REQUEST //用于收集HTML表单提交的数据
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE // $_COOKIE超级全局变量存储了通过HTTP cookie传递到脚本的信息
$_SESSION
介绍参考:http://t.zoukankan.com/Likebard-p-6050550.html
$_GET
$_GET 变量用于收集来自 method=”get” 的表单中的值,直观的的就是浏览器中可以看到的参数
$_GET 变量是一个数组,内容是由 HTTP GET 方法发送的变量名称和值。从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多 100 个字符),所以参数的长度不是无限的。
你的年龄是<?php echo $_GET["age"]; ?>岁。
$_POST
$_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值。
预定义的 $_POST 变量用于收集来自 method=“post” 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制
你的年龄是 <?php echo $_POST["age"]; ?> 岁。
post和get对比
get:参数都体现在url上,可以用于翻页,简单查询,get只能接收2M以下的内容,所以有局限性,另外由于内容是可见的,安全性就下降了,
post:用于页面表单 提交,上传文件,这些操作。大小没有限制,也不会在地址栏上显示。
$_REQUEST
$_REQUEST可以获取以POST方法和GET方法提交的数据,缺点是速度比较慢。
_ R E Q U E S T [ " 参数 " ] 具用 \_REQUEST["参数"]具用 _REQUEST["参数"]具用_POST[“参数”] _ G E T [ " 参数 " ] 的功能 , 通过 p o s t 和 g e t 方法提交的所有数据都可以通过 \_GET["参数"]的功能,通过post和get方法提交的所有数据都可以通过 _GET["参数"]的功能,通过post和get方法提交的所有数据都可以通过_REQUEST数组[“参数”]获得
参考【HTML学习】里面的对表单的实验
$_FILES
$_FILES超级全局变量,包含通过POST方法向服务器上传的数据的有关信息。这个超级全局变量与其他的变量有所不同,它是一个二维数组,包含5个元素。
他是文件上传的重要函数!
$_files["file"]["name"] //被上传文件的名称
$_files["file"]["type"] //被上传文件的类型
$_files["file"]["size"] //被上传文件的大小,以字节计
$_files["file"]["tmp_name"] //存储在服务器的文件的临时副本的名称
$_files["file"]["error"] //由文件上传导致的错误代码
更多参考【前端尝试-upload.php上传脚本】
联动:表单
超级变量会和表单等的配合非常多,这里可以去看HTML笔记关于表单的实验
空值
nul(空值): PHP中一种特殊的数据类型,表示空值,即表示没有为该变量设置任何值null(空值)不区分大小写,null和NULL是一样的,被赋空值可能有三种情况:没有赋什么值、被赋空值null、被unset()函数处理过的变量(
资源类型
PHP常量
设置PHP常量:
1、使用定义常量的函数:define(‘常量名’,常量值);
2、或者const 常量名 = 值;
定义特殊常量:define(‘常量名’,‘值’);
<?php
define('PI',3.1415926); //常量名 PI , 常量值 3.1415926
const A = 3.14;
define('^_^','smile'); //常量名 ^_^ , 常量值 smile
命名规则
1、不用
,
用了就是变量
∗
∗
(
,用了就是变量**(
,用了就是变量∗∗(是区分为变量的重要特征)**
2、不能以数字开头
3、通常以大写字母为主(与变量以示区别)
对象
php是面向对象编程
介绍里面有关概念
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
//“车”是一种事物
对象 − 是类的实例。
//我面前有一辆小汽车,这是现实中“车”的实例
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。
//“车”的变量有速度、重量、颜色。而我的车,速度、重量、颜色是这个实例的属性
成员函数 − 定义在类的内部,可用于访问对象的数据。
//油门是一种函数,他可以访问速度的数据
想象 | 现实 | |
---|---|---|
类(class) | 实例化》 | 对象(object) |
成员变量 | 属性 |
类的创建
class 【类的名字】 {
var $var1; //设置变量
var $var2 = "constant string";
function 【函数名】($arg1, $arg2) { //成员函数
[..]
}
[..]
}
例子
class Site {
/* 成员变量 */
var $url; var $title;
/* 成员函数 */
function setUrl($par){
$this->url = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
} }
变量 $this 代表自身的对象
<?php
class Car { //创建名为汽车的类
public $speed = 0; //设speed属性的值0
public function speedUp(){ //设置speedUp方法
//“->”可以粗糙理解为“的”
$this->speed += 10; //对象的属性为speed,进行+=10
}
}
$car = new Car(); //对象的实例化
$car->speedUp(); //car的加速(即为car进行加速)
echo $car->speed; //输出 car 的 速度
?>
变量的三种属性
private、public、protected。三种属性在序列化的时候会有不同的长度增加
这里在CTF里面的PHP代码审计会用得上
public无标记,变量名不变,长度不变: 【 s:2:"op";i:2;】
protected在变量名前添加标记\00*\00,长度+3: 【s:5:"\00*\00op";i:2;】
private在变量名前添加标记\00(classname类名)\00, 长度+2+类名长度: 【s:17:"\00FileHandler_Z\00op";i:2;】
注意的函数
__sleep()函数在序列化前执行
__wakeup()函数在反序列化前执行
_wakeup()绕过
当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
wakeup函数强行将file赋值为_FILE_
function__wakeup (){
if ($this->file ! == __FILE_)
{$this->file = __FILE__;}
}
O:1:"A":1:{s:4:"file";s:8:"flag.php";} //这里的序列会被过滤
O:1:"A":2:{s:4:"file";s:8:"flag.php";} //修改属性长度,1改成2,即可完成绕过
preg_match() 过滤
有点复杂,先挖个坑
要配合正则表达式
disable_functions 绕过
在中国蚁剑里面有
挖个坑,以后填
数学&时间日期函数
数学函数
max() //返回最大值
abs() //绝对值
min() //返回最小值
floor() //向下舍入为最接近的整数
ceil() //向上舍入为最接近的整数
rand() //返回随机整数。
sqrt() //平方根
时间日期函数
time()
//例
$a = time();
echo '<br>';
echo(date("Y-m-d-l h:i:s",$a));
运行结果: <br>2022-07-16
//d - 表示月里的某天;m - 表示月;Y - 表示年(四位数);l - 表示周几【date("l")】;h - 小时 ;i - 分钟 ; s - 秒
date()
//格式化本地日期和时间,并返回已格式化的日期字符串
mktime()
microtime()
localtime() //以一个数值数组和一个关联数组的形式输出本地时间:
HTTP函数
header() //向客户端发送原始的 HTTP 报头。
//例:header('Location: http://www.4399.com/');
//使用后会跳转到4399网站
headers_sent()
//检查http报头是否发送,发送则返回true,没发送则返回false
headers_list()
//返回已发送的响应头部的一个列表
/*
发送其他的报头
header('Content-type:text/html');
header('User-agent:Mozilla');
header('Cookie:PHPSESSIONID=xxxxx');
header('X-Forwarded-For:127.0.0.1');
var_dump(headers_list());
*/
setcookie() //向客户端发送一个http cookie
setrawcookie() //不对cookie进行url编码,向客户端发送一个http cookie
正则表达式
正则,永远的…烦人
正则表达式语法学习
https://www.runoob.com/regexp/regexp-syntax.html
preg_filter(pattern, replacement, subject)
//执行一个正则表达式的搜索和替换|
preg_match("/【查找的字符】/i","","【要查找的文章】")
//执行一个正则表达式匹配
if(preg_match("/php/i","php is the best language in the world!"))
{echo "find it string php.";
else
{echo "Cannot find it string php.";
/*分解说明:
【"/ php / i"】指的查找“php”。模式分隔符后的"i"标记这是一个大小写不敏感的搜索
【"/ \b web \b "】模式中的 \b 标记一个单词边界,所以只有独立的单词"web"会被匹配,而不会匹配如"webbing"等
【"\w"】匹配字母、数字、下划线
【"/[abc]/"】匹配所有a,b,c字母
【"/[^abc]/"】去掉所有a,b,c字母
【"/[a-z]/"】匹配所有a到z的(小写)字母
【"[^A-Z]"】去掉所有A-Z的(大写)字母
【"/[0-9]/"】去掉所有数字
【"/ \s /"】匹配所有空白符,包括空格、制表符\t \v 换页符\f 换行符\n
》》》等价于[ \f\n\r\t\v]
【"/ \S /"】匹配所有非空白符,不包括换行
【"/0/","A","$subject"】用0替换A
【"/ \b w*b \b "】”*“表示任何字符串的意思,可以匹配到 wob、wab、w0b等等
*/
【更多参考上面的网址进行学习!!!】
// 从URL中获取主机名称
preg_match('@^(?:http://)?([^/]+)@i',"http://sb.com/", $matches);
$host = $matches[1];
// 获取主机名称的后面两部分
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";