五、WEB安全 05——PHP基础
1、PHP基础 01——PHP基础概念、PhpStorm 、phpstudy 的安装
PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
a. PHP文件可包含文本、HTML、JavaScript代码和PHP代码。
b. PHP代码在服务器上执行,结果以纯HTML形式返回给浏览器。
c. PHP文件的默认文件扩展名是".php"。
a. PHP 可以生成动态页面内容
b. PHP 可以创建、打开、读取、写入、关闭服务器上的文件
c. PHP 可以收集表单数据
d. PHP 可以发送和接收 cookies
e. PHP 可以添加、删除、修改您的数据库中的数据
f. PHP 可以限制用户访问您的网站上的一些页面
g. PHP 可以加密数据
a. PHP脚本的基本格式:
PHP脚本的开始标志:<?php
PHP脚本的结束标志:?>
b. PHP的注释:
<?php
//单行注释
/**
*多行注释
*/
?>
c. 注意:php最后一行语句,可以不写分号,但是一定要有结束标志’?>’
<?php
phpinfo()
?>
d. 变量的命名:变量以 $ 符号开始,后面跟着变量的名称。变量名只能包含字母、数字字符以及下划线(A-z、0-9 和 _ ),变量名不能包含空格。
<?php
$name = "qwsn";
$age = 23;
?>
e. PHP脚本防止中文乱码的方式
<?php
header("Content-type:text/html;charset=utf-8"); //防止中文乱码
?>
f. static关键字的使用:当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字。(跟C语言一样的静态存储方式的变量)
<?php
header("Content-type:text/html;charset=utf-8"); //防止中文乱码
function test_static(){
static $n=0;
$n++;
echo "调用了一次"."n=".$n."<br />";
}
test_static();
test_static();
test_static();
?>
略
二、PHP基础 02——PHP的五种数据类型
php有5种数据类型:String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组/字典), Object(对象), NULL(空值)。
<?php
$a = "字符串类型";
$b = 1234;//整型
$c = -3.1415;//浮点型
$d = 8E-3;
$e = true;//boolean类型
$f = array("A","B","C");//数组类型
$g = array('x'=>1,'y'=>'2');//字典类型
class obj{//php对象的声明
var $num;
function name() {}
}
$h = new obj();//对象实例化类型
$i = NULL;//NULL
var_dump($a);var_dump($b);var_dump($c);
var_dump($d);var_dump($e);var_dump($f);
var_dump($g);var_dump($h);var_dump($i);
?>
a. 常量概念:常量是一个简单值的标识符。该值在脚本中不能改变。(在整个脚本中都能使用) 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
b. 自定义一个常量,使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
//该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
c. 自定义个一个常量示例:
<?php
//设置一个常量,define前面的@是为了不回显报错信息
@define("CL", "这是一个全局常量", true);
echo CL; // 默认false,变量名区分大小写;上面设置的true,就是不区分大小写
echo cl; // true不区分大小写
?>
a. PHP预定义了许多常量,这些常量无需使用define()函数定义,可直接在程序中使用。下面列举了一些常用的PHP预定义常量。
(1)__FILE__(FILE前后分别是两个下画线):当前正在处理的脚本文件名,若该常量使用在一个被引用的文件中(include或require),那么它的值就是被引用的文件名,而不是引用它的那个文件名。
(2)__LINE__(LINE前后分别是两个下画线):正在处理的脚本文件的当前行数。
(3)PHP_VERSION:当前PHP预处理器的版本,如5.4.16。
(4)PHP_OS: PHP所在的操作系统的类型。如Linux。
(5)DIRECTORY_SEPARATOR: 表示目录分隔符,UNIX或Linux操作系统环境时的值为“ / ”, Window操作系统环境时的值为 “ \ ”。
(6)TRUE:表示逻辑真。
(7)FALSE:表示逻辑假。
(8)NULL:表示没有值或值不确定。
b. 预定义常量示例:
<?php
echo __FILE__;
echo "<br/>";
echo __LINE__;
echo "<br/>";
echo PHP_VERSION;
echo "<br/>";
echo PHP_OS;
echo "<br/>";
echo DIRECTORY_SEPARATOR;
echo "<br/>";
?>
a. 整数类型:保存整数数值(范围限制),4个字节(32bit位)存储数据。PHP中默认为有符号。 在PHP中提供四种整形的定义方式,十进制定义,二进制定义,八进制定义和十六进制定义。但是,在使用echo输出时,默认输出为十进制。
<?php
//十进制转为x进制,用划横线的方法。
//x进制转为十进制,用乘的方法。
$a = 23; //十进制
echo $a;
$a = 0b10111; //二进制
echo $a;
$a = 027; //八进制
echo $a;
$a = 0x17; //十六进制
echo $a;
?>
b. 进制转换函数
decbin() //十进制转二进制
decoct() //十进制转八进制
dechex() //十进制转十六进制
bindec() //二进制转十进制
bin2hex() //二进制转十六进制
a. 字符串:字符串变量用于存储并处理文本。
b. 双引号字符串和单引号字符串的区别:双引号字符串会解释里面的变量,单引号字符串不会解释里面的变量
c. 双引号字符串和单引号字符串示例:
<?php
$name='暗月';
//双引号字符串里面有变量,会输出变量的值
$str1 = "这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。";
//单引号字符串,如果里面有变量,都作为一个字符串处理
$str2 = '这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。';
echo $str1.'<br />';
echo $str2;
?>
d. 字符串操作函数:
addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符
addslashes — 使用反斜线引用字符串
bin2hex — 函数把包含数据的二进制字符串转换为十六进制值
chop — rtrim 的别名
chr — 返回指定的字符
chunk_split — 将字符串分割成小块
convert_cyr_string — 将字符由一种 Cyrillic 字符转换成另一种
convert_uudecode — 解码一个 uuencode 编码的字符串
convert_uuencode — 使用 uuencode 编码一个字符串
count_chars — 返回字符串所用字符的信息
crc32 — 计算一个字符串的 crc32 多项式
crypt — 单向字符串散列
echo — 输出一个或多个字符串
explode — 使用一个字符串分割另一个字符串
fprintf — 将格式化后的字符串写入到流
get_html_translation_table — 返回使用 htmlspecialchars 和 htmlentities 后的转换表
hebrev — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
hebrevc — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符
hex2bin — 转换十六进制字符串为二进制字符串
html_entity_decode — Convert HTML entities to their corresponding characters
htmlentities — 将字符转换为 HTML 转义字符
htmlspecialchars_decode — 将特殊的 HTML 实体转换回普通字符
htmlspecialchars — 将特殊字符转换为 HTML 实体
implode — 将一个一维数组的值转化为字符串
join — 别名 implode
lcfirst — 使一个字符串的第一个字符小写
levenshtein — 计算两个字符串之间的编辑距离
localeconv — Get numeric formatting information
ltrim — 删除字符串开头的空白字符(或其他字符)
md5_file — 计算指定文件的 MD5 散列值
md5 — 计算字符串的 MD5 散列值
metaphone — Calculate the metaphone key of a string
money_format — 将数字格式化成货币字符串
nl_langinfo — Query language and locale information
nl2br — 在字符串所有新行之前插入 HTML 换行标记
number_format — 以千位分隔符方式格式化一个数字
ord — 转换字符串第一个字节为 0-255 之间的值
parse_str — 将字符串解析成多个变量
print — 输出字符串
printf — 输出格式化字符串
quoted_printable_decode — 将 quoted-printable 字符串转换为 8-bit 字符串
quoted_printable_encode — 将 8-bit 字符串转换成 quoted-printable 字符串
quotemeta — 转义元字符集
rtrim — 删除字符串末端的空白字符(或者其他字符)
setlocale — 设置地区信息
sha1_file — 计算文件的 sha1 散列值
sha1 — 计算字符串的 sha1 散列值
similar_text — 计算两个字符串的相似度
soundex — Calculate the soundex key of a string
sprintf — Return a formatted string
sscanf — 根据指定格式解析输入的字符
str_contains — Determine if a string contains a given substring
str_ends_with — Checks if a string ends with a given substring
str_getcsv — 解析 CSV 字符串为一个数组
str_ireplace — str_replace 的忽略大小写版本
str_pad — 使用另一个字符串填充字符串为指定长度
str_repeat — 重复一个字符串
str_replace — 子字符串替换
str_rot13 — 对字符串执行 ROT13 转换
str_shuffle — 随机打乱一个字符串
str_split — 将字符串转换为数组
str_starts_with — Checks if a string starts with a given substring
str_word_count — 返回字符串中单词的使用情况
strcasecmp — 二进制安全比较字符串(不区分大小写)
strchr — 别名 strstr
strcmp — 二进制安全字符串比较
strcoll — 基于区域设置的字符串比较
strcspn — 获取不匹配遮罩的起始子字符串的长度
strip_tags — 从字符串中去除 HTML 和 PHP 标记
stripcslashes — 反引用一个使用 addcslashes 转义的字符串
stripos — 查找字符串首次出现的位置(不区分大小写)
stripslashes — 反引用一个引用字符串
stristr — strstr 函数的忽略大小写版本
strlen — 获取字符串长度
strnatcasecmp — 使用“自然顺序”算法比较字符串(不区分大小写)
strnatcmp — 使用自然排序算法比较字符串
strncasecmp — 二进制安全比较字符串开头的若干个字符(不区分大小写)
strncmp — 二进制安全比较字符串开头的若干个字符
strpbrk — 在字符串中查找一组字符的任何一个字符
strpos — 查找字符串首次出现的位置
strrchr — 查找指定字符在字符串中的最后一次出现
strrev — 反转字符串
strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strrpos — 计算指定字符串在目标字符串中最后一次出现的位置
strspn — 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。
strstr — 查找字符串的首次出现
strtok — 标记分割字符串
strtolower — 将字符串转化为小写
strtoupper — 将字符串转化为大写
strtr — 转换指定字符
substr_compare — 二进制安全比较字符串(从偏移位置比较指定长度)
substr_count — 计算字串出现的次数
substr_replace — 替换字符串的子串
substr — 返回字符串的子串
trim — 去除字符串首尾处的空白字符(或者其他字符)
ucfirst — 将字符串的首字母转换为大写
ucwords — 将字符串中每个单词的首字母转换为大写
vfprintf — 将格式化字符串写入流
vprintf — 输出格式化字符串
vsprintf — 返回格式化字符串
wordwrap — 打断字符串为指定数量的字串
e. 字符串操作函数示例1:strlen()、strpos()函数
<?php
//字符串操作函数示例1:
// "."是并置运算符(连接运算符)
//strpos位置计算的时候,从左边开始,且0开始算起
$str1 = "hello";
$str2 = "world";
echo $str1 . " " . $str2 . '<br />';
echo "返回字符串的长度:", strlen($str1) . "<br />";
echo "返回l字符在字符串中的第一次出现的位置:", strpos($str1, "l") .'<br />';
?>
f. 字符串操作函数示例2:trim()、substr()、strpos()、md5()、str_replace()等函数
<?php
//字符串操作函数示例2:
$str1 = " "."qwsn"." ";
echo $str1."<br />";
//去掉字符串首尾空格
echo trim($str1)."<br />";
//截取字符串wsn
echo substr($str1,2,4).'<br />';
echo substr($str1,strpos($str1,'w'),strpos($str1,'n'))."<br />";
//md5加密
echo md5($str1)."<br />";
//字符串替换函数
$str2=str_replace('q','fq',$str1);
echo $str2."<br />";
?>
g. 字符串操作函数示例3:通过下标取指定字符、字符串遍历
<?php
//通过下标,可以取字符串中指定字符(可以结合循环,遍历字符串)
echo $str1[0].'<br />';
echo $str1[1].'<br />';
?>
<?php
//字符串遍历
$str1="qwsn976";
for($i=0;$i<=strlen($str1);$i++){
echo $str1[$i].'</br>';
}
四、PHP基础 04——数组的操作:遍历、排序、合并、增删改销、常用函数
a. 数组是一个能在单个变量中存储多个值的特殊变量。在 PHP 中,使用array() 函数创建数组。
b. 在 PHP 中,有三种类型的数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
c. 数组的声明:
姿势1:
$array1 = array('a','b','c');
姿势2:
$array1 = ['a','b','c'];
d. 打印数组:使用print_r()函数,echo打印不出数组。
<?php
$array1 = array('a','b','c'); //数值数组
$array2 = array('a1'=>'php','a2'=>'python','a3'=>'java'); //关联数组
echo $array1."<br />"; //无效打印数组
print_r($array1);echo "<br />"; //有效打印数组
b. 数组的取值:通过键名下标来取值
<?php
$array1 = array('a','b','c'); //数值数组
$array2 = array('a1'=>'php','a2'=>'python','a3'=>'java'); //关联数组
echo $array1[0]; //打印键名为0的键值
echo $array2['a1']; //打印键名为a1的键值
d. 数组的长度:使用count()函数返回数组长度
<?php
$array1 = array('a','b','c'); //数值数组
$array2 = array('a1'=>'php','a2'=>'python','a3'=>'java'); //关联数组
echo count($array1)."<br />"; //打印数组1的长度
echo count($array2)."<br />"; //打印数组2的长度
a. 遍历数组姿势1:可以遍历数值数组和关联数组
<?php
$array1 = array('a','b','c'); //数值数组
$array2 = array('a1'=>'php','a2'=>'python','a3'=>'java'); //关联数组
foreach($array1 as $k=>$v){ //遍历键值对
echo $k."---".$v."<br />";
}
foreach($array1 as $v){ //也可只遍历值
echo $v."<br />";
}
foreach($array2 as $key=>$value){ //遍历键值对
echo $key."---".$value."<br />";
}
b. 遍历数组姿势2:只可以遍历数值数组
<?php
$array1 = array('a','b','c'); //数值数组
for($i=0;$i<=count($array1);$i++){ //注意此处
echo $array1[$i]."<br />";
}
a. 在PHP 中定义了数组排序的内置函数:
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列
b. 数组排序函数示例:
<?php
$array1 = array('a','b','c'); //数值数组
rsort($array1); //降序排列
print_r($array1); //输出降序后的结果
a. 数组的合并:使用array_merge()函数
<?php
$array1 =array('a','b','c');
$array2 = array('a1'=>'php','a2'=>'python','a3'=>'java');
$array3 = array_merge($array1,$array2);
print_r($array3);
a. 增加数组元素:array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。
<?php
$array1 =array('a','b','c');
array_push($array1,'d','e');
print_r($array1);
b. 可以直接赋值,增加数组元素
<?php
$array1 =array('a','b','c');
$array1[]='d'; //下标为空的,自动添加参数
$array1[4]='e'; //有键值的
print_r($array1);
c. 添加到指定位置:array_splice(数组名,位置,删除几个,增加的元素)
<?php
$array1 =array('a','b','c');
array_splice($array1,1,0,'d'); //1代表的就是1位置,原先的1位置顺移到2位置
print_r($array1);
d. 删除数组元素:array_splice(数组名,位置,删除几个,增加的元素)
<?php
$array1 =array('a','b','c');
array_splice($array1,1,1); //只是删除1位置的元素
//array_splice($array1,1,1,'d') //删除元素的同时,添加元素
print_r($array1);
e. 删除数组元素:array_pop()函数将数组最后一个单元弹出(出栈)
<?php
$array1 =array('a','b','c');
array_pop($array1);
print_r($array1);
f. 更改数组元素
<?php
$array1 =array('a','b','c');
$array1[0]='c';
$array1[1]='b';
$array1[2]='a';
print_r($array1);
d. 销毁指定的数组元素
<?php
$array1 =array('a','b','c');
unset($array1[1]); //将1位置的单元弹出,后面c不向前顺移
print_r($array1);
e. 注意:删除数组元素的比较
array_pop() //出栈操作,只是弹出最外面一个
array_splice() //可以发生顺移
unset() //不可以发生顺移
is_array() - 判断是否为数组。(若是,返回1)(若不是,不返回任何值)
count() - 数组的元素数目。
array_search() - 在数组中搜索给定的值,如果成功则返回相应的键名。
array_key_exists() - 在给定的 key 存在于数组中时返回 1。
array_unshift() - 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元 将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。
array_shift() - 将array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它。 单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。
array_unique() - 接收 array 作为输入并返回没有重复值的新数组。注意键名保留不变。array_unique 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键 名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。
in_array() - 检查数组中是否存在某个值 如果找到指定的值则返回 TRUE,否则返回 FALSE 。 in_array是区分大小写的。
a. is_array() 函数:判断是否为数组。
<?php
$array1=['a','b','c'];
$array2="qwsn";
echo is_array($array1); //返回1
echo is_array($array2); //不返回任何值
b. array_search()函数:在数组中搜索给定的值,如果成功则返回相应的键名。
<?php
$array1=['a','b','c'];
echo array_search('c',$array1); //返回键名2
echo array_search('d',$array1); //不返回任何值
c. array_key_exists()函数:在给定的 key 存在于数组中时返回 1。
<?php
$array1=['a','b','c'];
echo array_key_exists(0,$array1); //key0存在,返回1
echo array_key_exists(3,$array1); //key3不存在,无返回值
d. array_unshift()函数:将传入的单元插入到 array 数组的开头。(会发生顺移)
<?php
$array1=['a','b','c'];
array_unshift($array1,'d'); //开头传入d,也就是0对应d,以后的顺移
print_r($array1);
e. array_unique()函数:接收 array 作为输入并返回没有重复值的新数组。
<?php
$array1=['a','b','c','a'];
print_r(array_unique($array1));
f. in_array()函数:检查数组中是否存在某个值 ,如果找到指定的值则返回 TRUE,否则返回 FALSE
<?php
$array1=['a','b','c'];
echo in_array('a',$array1); //找到了值a,所以返回1
echo in_array('d',$array1); //没有找到值d,无返回值
2021年7月9日