代码审计 PHP基础(一)

  • A+

标签格式

```
<?php phpcode ?>    标准格式

<? phpcode ?> 短标签格式

<% phpcode %> ASP风格--配置文件php.ini中的asp_tags=On开启

<script language\="php">phpcode;</script> script脚本格式

```

输出/调试函数

```
<?php
// 输出/打印常量或变量
echo "1\n";
print "12\n";
// var_dump输出变量类型以及值
var_dump("2");
var_dump(2);
// print_r 打印/输出数组
print_r(["1",2,3]);
// exit die程序退出函数具有输出功能
exit("exit!");
// PHP中的注释分别为:单行注释// # 多行注释//
print "//#/
exit(\"exit!\")
/\n";
die("die!");
?>

```

image.png

变量命名方式

以$(学php可能是赚钱太多了,所以用美刀符号)开头,$之后的第一个字符只能为字母或下划线(A-Za-z_)再之后可以使用数字下划线字符(A-Za-z0-9_),变量的定义就是酱紫的(^$[A-Za-z_][0-9A-Za-z_]*$)

```
<?php
$a = null;// 正确
$b = 1;// 正确
$1 = 2;// 这个同学看文章的时候正好看丢了$之后应该是什么,打马虎了
$a-vb1 = 3;// 这个同学敲代码的时候忘了按shift
$number = 1; // 正确
?>

```

有意义的变量命名
```
<?php
/
* 下面我们来定义几个支付类型的变量,瞅瞅哪个更有意义
/
// 采用拼音首字母来为变量命名,拼出来可能是支付利息、字符类型不直观
$zflx = "支付宝";
$zf_lx = "微信";
// 采用中英结合的方式来命名,可能理解为字符类型、做饭类型、支付类型
$zftype = "支付宝";
$zf_type = "微信";
// 以下四种采用全英文或者英文及_的方式较为直观
$paytype = "支付宝";
$pay_type = "微信";
// 在这些变量声明的时候最直观的莫过于当下两个,英文首字母大写,直观明了
$PayType = "支付宝";//大驼峰
$Pay_Type = "微信";
?>

```

数据类型

标准类型:

bool(布尔型)、string(字符串型)、integer(整型)、float(浮点型)

复合数据类型:

array(数组)、object(对象)

特殊数据类型:

resource(资源)、null(空值)

```
<?php
$string = "this is string";//字符串型
$number = 1;//整型
$numfloat = 1.02;//float
// 非零即真
$blind = true;//bool: true or false
// 数组
$arr = array(1,2,3,4);
// class
class A{}
// object
$obj = new A();
// 句柄
$file = fopen("a.txt","w");
// null
$empty = null;
var_dump($string);
var_dump($number);
var_dump($numfloat);
var_dump($blind);
var_dump($arr);
var_dump($obj);
var_dump($file);
var_dump($empty);
?>

```

图片

类型转换

类型转换的函数:

intval floatval boolval

强制转换

(int)variable、(floot)variable、(bool)variable、(string)variable

```
<?php
$number = "123a";
// 临时类型转换
print "转换前{$number}\n";
print "临时类型转换\n";
print (int)$number."\n";
print intval($number)."\n";
// 永久类型转换
print "转换前{$number}\n";
print "永久类型转换\n";
print $number."\n";
$number = (int)$number;
print $number."\n";
// 不建议使用永久转换,可以在参数传递的时候传递临时转换的值
?>

```

图片

判断是什么类型的函数

```

1,
"other" => "Only_rain",
"ip" => "127.0.0.1",
"comment" => "你真棒!"
);
$blind = true;
$numberfloat = 1.02;
$string = "this is string";
var_dump(is_null(null));//是否为null
var_dump(is_array($array));//是否是数组
var_dump(is_bool($blind));//是否是布尔
var_dump(is_float($numberfloat));//是否是浮点类型
var_dump(is_int($number));//是否是整型
var_dump(is_numeric($number));//是否是数字
var_dump(is_string($string));//是否是字符串
?>

```

图片

弱类型对比

```
<?php
$number = "123a";
var_dump($number == 123);
var_dump($number === 123);
var_dump(true == 1);
var_dump(true === 1);
var_dump(true == "aa");
var_dump(true === "aa");
var_dump(0e10 == 0e11);
var_dump(0e10 === 0e11);
var_dump(in_array("11adsa/",[11,2,3]));
// md5及sha1加密函数不支持数组加密所以会返回值为NULL
var_dump(@md5(["12312"]));
var_dump(@sha1(["12312"]));
?>

```

1微信图片_20210125183741.gif

数组

```

var_dump($array[0]);
var_dump($array[1][2]);
// 获取数组长度
var_dump(count($array1,true));

print "顺取\n";
// 遍历数组的方式
foreach($array as $key=>$value){
print "{$key} => {$value}\n";
}
// array_keys
for($i=0;$i".$array[$i]."\n";
}
$i = 0;
while($i".$array[$i]."\n";
$i++;
}
print "倒取\n";
for($i=count($array)-1;$i>=0;$i--){
print array_keys($array)[$i]."=>".$array[$i]."\n";
}

$i = count($array)-1;
while($i>=0){
print array_keys($array)[$i]."=>".$array[$i]."\n";
$i--;
}
?>

```

微信图片_20210125183645.gif

流程控制语句

```
<?php
/
* if...
* if(表达式)...else...
* if(表达式)...else if(表达式)...else...
/
$id = @$argv[1];
// 单if
if($id){
print "从命令行传递过来的参数1值为{$id}\n";
}
// if(表达式)...else...
if($id){
print "从命令行传递过来的参数1值为{$id}\n";
} else {
print "您没有传递参数

";
}
// 嵌套if模拟登录
$admin = @$argv[1];
$passwd = @$argv[2];
if($admin == "admin"){
if($passwd == "123456"){
print "登陆成功\n";
}else{
print "登陆失败\n";
}
}else{
print "用户名错误\n";
}

// if(表达式)...else if(表达式)...else...
$i = @argv[1];
if($i>=1 && $i<=5){
print "1 <= i <= 5\n";
} else if($i>=6 && $i<=10) {
print "6 <= i <= 10\n";
} else if($i>=11 && $i<=15){
print "11 <= i <= 15\n";
}else{
print "您超出了我们的可控范围!\n";
}
// 每一个if都是单独运行的才实现下方动图的效果
?>

```

图片

```
<?php
/
* while(表达式)...
* do...while(表达式)
* for(表达式;表达式;表达式)...
* switch...case 表达式 ... default....
/
// while(表达式)...
$i = 1;
while($i<=10){
if($i==9){
$i++;
continue;
}
print "这是循环的第{$i}次\n";
$i++;
}
// 获取100以内奇偶数的和以及平均数
$i = 1;
$sum = [];
while($i<10){
if($i%2 == 0){
$sum["even"] = isset($sum["even"]) ? $sum["even"]+$i : $i;
} else {
$sum["odd"] = isset($sum["odd"]) ? $sum["odd"]+$i : $i;
}
$i++;
}
/
* tips:三元运算符
* $sum["odd"] = isset($sum["odd"]) ? $sum["odd"]+$i : $i;
* if(isset($sum["odd"])){
* $sum["odd"] = $i;
* } else {
* $sum["odd"] = $i;
* }
/
print "100以内奇数和为:{$sum['odd']}\n";
print "100以内偶数和为:$sum['even']\n";
print "100以内所有数相加的平均数:".($sum["odd"]+$sum["even"])/$i."\n";

//do...while(表达式)
print "do...while()之前\$i的值{$i}\n";
do{
print "\$i的值为{$i}\n";
$i++;
}while($i<100);

// for(表达式;表达式;表达式)...
for($i=0;$i<10;$i++){
print "第{$i}次执行\n";
}
// switch...case 值 ... default.... 注意:每个case后必须加上break退出,不然直到找到下一个break再退出
$i = 11;
switch ($i) {
case 10:
print "{$i}\n";
break;
case 11:
print "{$i}\n";
break;
default:
print "default";
break;
}
?>

```

图片

超全局数组

```
<?php
/
* while(表达式)...
* do...while(表达式)
* for(表达式;表达式;表达式)...
* switch...case 表达式 ... default....
/
// while(表达式)...
$i = 1;
while($i<=10){
if($i==9){
$i++;
continue;
}
print "这是循环的第{$i}次\n";
$i++;
}
// 获取100以内奇偶数的和以及平均数
$i = 1;
$sum = [];
while($i<10){
if($i%2 == 0){
$sum["even"] = isset($sum["even"]) ? $sum["even"]+$i : $i;
} else {
$sum["odd"] = isset($sum["odd"]) ? $sum["odd"]+$i : $i;
}
$i++;
}
/
* tips:三元运算符
* $sum["odd"] = isset($sum["odd"]) ? $sum["odd"]+$i : $i;
* if(isset($sum["odd"])){
* $sum["odd"] = $i;
* } else {
* $sum["odd"] = $i;
* }
/
print "100以内奇数和为:{$sum['odd']}\n";
print "100以内偶数和为:$sum['even']\n";
print "100以内所有数相加的平均数:".($sum["odd"]+$sum["even"])/$i."\n";

//do...while(表达式)
print "do...while()之前\$i的值{$i}\n";
do{
print "\$i的值为{$i}\n";
$i++;
}while($i<100);

// for(表达式;表达式;表达式)...
for($i=0;$i<10;$i++){
print "第{$i}次执行\n";
}
// switch...case 值 ... default.... 注意:每个case后必须加上break退出,不然直到找到下一个break再退出
$i = 11;
switch ($i) {
case 10:
print "{$i}\n";
break;
case 11:
print "{$i}\n";
break;
default:
print "default";
break;
}
?>

```

图片

```

```

图片

```
<?php
/
* 命令行参数获取$argc(获取命令行参数个数) $argv(获取参数值)
/
var_dump($argv);
?>

```

2微信图片_20210125184002.gif

Tips

关于终端GIF动态图片中无中文,因为该工具无法录制中文所以是使用百度来的英文以及小编小学毕业的英文转换。

安装终端视频录制工具
```

[email protected]:~# docker pull asciicast2gif
[email protected]:~# vi /opt/script/auto_rec_asciinema_to_gif.sh

!/bin/bash

rec_date_time=$(date +%F_%H-%M-%S)
asciinema rec ${rec_date_time}.cast

the next line only needed when you install asciicast2gif by docker

alias asciicast2gif='docker run --rm -v $PWD:/data asciinema/asciicast2gif -S 1'
asciicast2gif -S 1 ${rec_date_time}.cast ${rec_date_time}.gif

[email protected]:~# vi ~/.bashrc
alias rec='sh /opt/script/auto_rec_asciinema_to_gif.sh'
[email protected]:~# rec
开始录制终端屏幕啦!

```