PHP学习笔记(持续更新)
0x00LAMP网站概念介绍
L:Linux
A:Apache
M:Mysql
P:PHP
这四种技术组合起来搭建动态网站或服务器软件具有越来越高的兼容度,引起广泛的关注
下面简单介绍一些相关的概念
脚本语言:使用一种特定得到描述性语言、依据一定的格式编写的可执行文件。脚本是批处理文件的延伸,是一种纯文本保存的程序。简单来说就是一条条的文字命令,在执行前会经过一道“翻译”的过程,因此会比二进制程序的执行效率要稍微低一些。但具有语法结构比较简单(学习使用简单),不需要编译的特点
动态网站开发所需的web构件
1.客户端:各种浏览器
2.超文本标记语言(html):通过利用各种“标记”来标识文档的结构和超链接、图片、文字、段落、表单等信息,再通过浏览器读取HTML文档中这些不同的标签来显示页面
3.层叠样式表(CSS):为网站添加布局效果的工具,可定义HTML元素如何被显示
4.客户端脚本编程语言javascript:可在html页面中放入动态的文本内,能够对时间进行反应,可读取并修改html元素
5.web服务器:Apache/Nginx/TomCat/IIS:专门处理http请求,可以解析HTTP协议
6.服务器端编程语言PHP/JSP/ASP等中的一种:web服务器功能的拓展,用在服务器端执行并完成服务器的业务处理功能
7.数据库管理系统MySQL/Oracle/SQL Server:快速,安全地处理大量数据
0x01PHP的基本语法
一、php的变量
(一)变量的声明
不需要使用前进行声明 $a=100
变量有一定的适用范围(类似于全局局部的概念),可
使用unset()释放指定的变量,
使用isset()检查变量是否设置,
使用empty()检查一个变量是否为空
注意,empty()使用时,对于0,“0”,null,false,array(),var,“”等没有任何属性的对象都将被认为是空的
(二)变量的命名
①内置结构和关键字及用户自定义的类名和函数名是不区分大小写的
比如echo,while 等等
②变量名是严格区分大小写的
③php中的关键字可用作为变量名称使用,不过容易混淆,因此不推荐使用
④可变变量:变量的值作为新的一个变量名,因为第一个变量的值可以发生变化,因此被称为可变变量
例:
$hi ="hello"
$$hi="world"
这里相当于$$hi=$($hi)=$(hello)=world
(三)变量的引用赋值
变量一般来说采用传值赋值,而在PHP中可以使用引用赋值,使新变量可以简单的引用
$foo='bob';
$bar=&$foo;
需要注意的是,只有有名字的变量才能引用赋值,另外,这里的引用赋值与c语言中的指针不一样,两个变量并没有在内存上同体,只是把各自的值关联起来了
(四)变量的类型
php是一种弱类型检查语言,有8种原始类型。
可以使用函数var_dump()来查看某个表达式的值和类型
①字符串String
1.单引号引起来的字符串中不能再包含单引号,除非使用反斜杠进行转义,此外在单引号字符串中出现的变量不会被变量的值替代,因此使用单引号定义字符串效率会更高
2.对于双引号括起的字符串,其中的变量名会被变量值替换,即双引号内的包含变量会被解析
3.定界符
例:在“<<<”后提供一个标识符开始,之后接包含的字符串,最后用同样的标识符结束字符串
$String=<<<a
"……………………"
a;
②数组array
可以使用另一个php数组作为值
array{
key1=>value1
key2=>value2
}
例:$arr =array("foo"=>"bar",12=>true)
③对象
由一组属性值和一组方法构成
④资源类型
保存了到外部资源的一个引用,通过专门的函数来建立和使用
$file_handle=fopen("info.txt","w");
var_dump($file_handle) =>这里将输出资源类型
(五)强制类型转换
(int),(integer);转换成整型
(bool),(boolean);转换成布尔型
(float),(double),(real);转换成浮点型
(string);转换成字符串型
(array);转换成数组型
(object);转换成对象型
————————————
转换函数:
intval();转整型
floatval();转浮点型
strval();转字符串型
————————————
以上两种都是通过转换得到新类型的数据赋给新的变量,原来变量的值和类型都不变
如果需要改变原来变量的类型,可以使用settype()函数进行
$foo=1.2
settype($foo,"float"),现在foo为浮点型了
(六)变量类型的测试函数
is_bool()
is_int()
is_float()
is_string()
is_array()
is_object()
is_resource()
is_null()
is_scalar()判断是否为标量
is_numeric()判断是否为任何类型的数字或数字字符串
is_callable()判断是否为有效的函数名
(七)PHP中的常量
①通过define()函数来定义常量
boolean define(string name,mixed value [,bool case_insensitive]);
如果设置第三个参数为true,则常数会定义为不区分大小写的
②系统的预定义常量
PHP_OS 执行PHP解析的操作系统名称
PHP_VERSION 当前PHP服务器的版本
③魔术常量
_FILE_当前文件名
_LINE_当前行数
_FUNCION_当前函数名
_CLASS_当前的类名
_METHOD_当前对象的方法名
(八)算术运算符
==:等于,会进行自动类型转换后再对比
===:全等于,数值和类型都需要相等
这里其实很容易因为人为的疏忽造成漏洞,在一些ctf小题目中也常出现这种题目,比如a要求输入的是纯字符串,b要求输入的是纯数字,最后要求md5(a)==md5(b)
这里一般就利用等于“==”没有对类型进行比较的漏洞进行答题,举两个例子
a='QNKCDZO'
b=240610708
这里md5(a)=0e830400451993494058024219903391
md5(b)=0e462097431906509019562988736854