【web基础】php开发相关

目录

一、开发工具

二、代码规范

三、基础基础知识

四、数据传输和接收

五、burp suite

六、php选择结构和一些函数的使用

七、php与mysql,以及js代码简述

1、php连接mysql

如果字符串里面有变量,单引号里面的字符串不会解析变量,直接原样输出,如果是放在双引号里面,则会解析变量,所以一般情况下,用双引号包裹字符串会很方便,但是似乎多个变量在同一个双引号中就不可以了,还是建议用点号连接保险一点

2、传递sql语句的函数,对象名->query(sql语句)

3、关闭连接的语句:对象名->close()

4、mysqli结果集读取方法

八、函数:实现某种功能(实际上学php就是学一些php函数)

九、重点——cookie与session

1、cookie

2、session(可以说是对传统cookie的改进)

十、php与html、javascript等关系

十一、html套模板取模板

十二、Ajax和jQuery Ajax:优化用户体验

十三、json

十四、mvc形式架构


一、开发工具

选择vscode,一款编写脚本语言的软件

  • 下载好vscode复制到虚拟机中安装,因为之前配置好了php的相关环境,只需要在vscode界面简单设置即可(汉化等等),选择从myWebsite文件夹打开

二、代码规范

(1)php代码位置

<?php

//php代码放在这里

?>

(2)每一条代码以英文分号结束(;)

(3)字符串需要放在单引号或者双引号里面

三、基础基础知识

1、echo表示输出echo后面的内容到屏幕上

2、字符衔接“.”

例如echo '77'.'hello';

会输出77hello

3、变量名和其他的字符要隔开,空格都可以隔开,不然粘一起,php也不认识

四、数据传输和接收

(1)数据传输方法

一般用的最多的两种是GETPOST方法

  • GETPOST区别

GET是请求资源,POST是向服务器传输资源

实际上是一个数组,php预定义的数组$_GET[参数名]和$_POST[参数名],而数组里面放的应该是“键值对”

  • GET接受的参数有长度限制,POST理论上不限制参数长度
  • GET方法接受的参数可见,POST不可见
  • GET方法接受参数

 第一个参数以?开头,如果有多个参数,后面的参数以&分割

比如访问页面127.0.0.1/admin.php?a=1&b=2&c=3

此处接受三个参数a、b、c

  • $ab=$_GET['a'];

表示接受一个参数,参数名为a,把这个参数传递给ab这个变量

 在页面中应该是127.0.0.1/admin.php?a=1    

  •    REQUEST方法

我们通过html表单提交数据时,需要在html页面指定method的值为post或者get来确定数据提交到哪一个数组里,而提交到的相应的php页面就需要指定接收参数的方法,现在我们不想指定,就用$_REQUEST[参数名]去接受,该数组会依次到POST、GET、COOKIE中去查找有无提交的数据,当然,这样遍历必然会使效率降低                                                                          

(2)什么是变量

  • 举例$abc=‘123456’
    • $表示声明变量
    • abc表示变量名称
    • =表示给变量赋值
    • ‘123456’表示变量值
  • 变量类型
    • 常量
    • 普通变量
    • 全局变量
    • 静态变量
  • 变量命名规则

不能数字开头,变量名由数字、字母、下划线组成

(3)什么是函数

一个函数可以理解为一个功能

(4)html和php

html是浏览器负责解析的,是前端的语言,php是后端脚本语言

要学习一点html的知识,比如表单的知识

  • 类似php有代码开始和结束的标识,html也有专门的区域

快捷键生成vscode中:感叹号+tab

标签快捷键:标签名+回车键

  • 有的标签是双标签(即有标识开始标签也有结尾标签)有的标签比如<br/>就是单标签,可以这样理解,双标签是需要作用于中间那一个部分,而单标签本身是相当于一个作用,例如<br/>就是换行的意思)
  • meta标签中的charset是设置字符编码,防止乱码出现

  • 表单知识
    • 例如

  • 相应的php源码

五、burp suite

Burp suite是一款抓包软件,抓取数据包,相当于用户端和服务器端之间的一个代理,便于我们分析,测试

Burp suite是用java编写的,所以我们要先配置好Java环境

burp只能抓取到基于http协议和https协议的数据包

  • Burp suite原理

本地端口发送出去的数据包,端口号是随机的,但是用了burp后,数据包全部从8080端口出去,相当于以前有几个门可以出去。现在只让从一个门出去

  • Burp Suite安装和配置
    • 这里我们下载的是jre版本,用于一些其他的配置等,还有一个jdk版本主要用于java开发
    • Burp suite用的破解版的老版本,追求新版本没有意义,安装成功如下

  • 接下来配置火狐浏览器(开启代理才能抓包)
    • 打开火狐的扩展,搜索Foxy Proxy,添加到火狐浏览器

  • 添加完毕后,如下图,浏览器右上角有小狐狸图标

  • 点击小狐狸图标添加代理

这里我们了解一下大致过程:添加了代理后开启这个代理后,我们的所有的http/https数据包会发送到127.0.0.1的8080端口,而burp suite会和这个端口做一个连接(监听),所以相当于我们把数据包发送到burp上面去了

  • 此刻我们去burp看看

  • burp使用教程
    • 首先简单认识一下burp

  • 使用1(先用自己写的登陆页面试一试http)
    • 在火狐点击小狐狸开启代理,选择burp
    • 在burp点击使intercept is on(而不是off)
    • 访问127.0.0.1/form.html

  • burp已经抓到http数据包如下

  • 就可以进行分析啦,也可以修改数据(关闭代理可以正常上网)
  • 点击forward放过数据包,此时我们输入信息后点击登录在抓包

上述是单面拦截抓包,也可以抓服务器返回来的包

  • 使用2(https:以百度网站为例)
    • 在火狐点击小狐狸开启代理,选择burp
    • 在burp点击使intercept is on(而不是off)
    • 访问www.baidu.com,出现下图所示

  • 我们还要再设置一下,才能抓取https数据包
    • 百度搜索https://burp

下图点击下载证书

然后在文件夹中打开,然后在火狐浏览器点击设置

打开导入刚刚下载的文件,点击“两个信任”然后“确定”

  • 此时在抓访问百度的包,就可以抓到啦

  • 应用教程
    • 如何拦截服务器返回给浏览器的数据包

在拦截到的请求包界面,单击右键选择do intercept中的response to this request

  • don't intercept requests相当于黑名单

To this host表示对发送到这个域名的数据包不进行拦截

To this ip address 表示只要解析到这个ip的域名都不拦截数据包

For this file extension表示不抓取该后缀的数据包

For this directory表示不抓取这个目录下的数据包

  • 数据重放

我们一直在网址输入信息抓包看结果很麻烦,直接在burp中重放

六、php选择结构和一些函数的使用

1、if_else结构

2、switch_case结构

3、empty()函数:检查一个变量值是否是空值,是一个返回boolean型函数,为空返回true。

4、include()函数和include_once():参数是所包含文件的路径,前者是可以多次包含,后者不管写多少个include_once()都是只包含一次,包含函数相当于将其源代码复制粘贴到当前位置。

5、三元运算符

上述的综合运用

上述第六行代码为echo include_once('./form.html');时,出现的页面尾巴始终会出现一个数字1,因为本来include系列函数就是把所include的文件复制粘贴到当前位置,再echo一下就是输出这个函数执行的返回值,可能是返回了1。如下图

exit()函数:直接退出程序,执行exit()后下面的代码将不会执行,exit()函数可以有参数值,作用是输出参数值后退出。

例如exit('退出程序');会输出退出程序后退出

die()函数与exit()用法相同

7、var_dump()函数打印参数的详细信息,变量类型和变量值等等

七、php与mysql,以及js代码简述

1、php连接mysql

有两种方式可以连接,面向对象和面向过程,面向对象中又分mysqli和pdo方式。根据php版本可能有些差异

这里我们使用面向对象的mysqli方式

  • 一个关于字符串的小知识
    • 字符串在引号里面,出现字符串嵌套的情况时,要用单双引号区分,例如两层嵌套时,外面用双引号里面就用单引号,外面是单引号里面就用双引号,都用一种引号会报错。
    • 如果字符串里面有变量,单引号里面的字符串不会解析变量,直接原样输出,如果是放在双引号里面,则会解析变量所以一般情况下,用双引号包裹字符串会很方便,但是似乎多个变量在同一个双引号中就不可以了,还是建议用点号连接保险一点

2、传递sql语句的函数,对象名->query(sql语句)

3、关闭连接的语句:对象名->close()

上述的简单练习如下

Num_rows中的数据表示返回了几条数据

下面读取返回的数据的内容

接下来我们尝试模仿一些网站出现‘弹窗’的界面->使用javascript代码

(明白html、css、javascript都是前端语言,即都是由浏览器负责解析的)

首先就像php、html一样,代码都是在被“框住”的,js代码也是一样是放在script标签中,如下所示

<script>

//js代码

</script>

现在又有一个问题,出现弹窗后怎么回去呢,回到重新输入账户密码的界面

就可以点击出来的弹窗后返回啦,其中第11行还可以用empty($result->fetch_row())来判断

4、mysqli结果集读取方法

之前经常使用fetch_row()和fetch_assoc()函数都是只抓取一行记录(一条记录),即使我们返回了多条记录,只抓取第一条;

八、函数:实现某种功能(实际上学php就是学一些php函数)

分为php自带函数和自定义函数

  • 自定义函数:先声明再使用
    • 声明函数格式:

function 函数名([参数名]){

函数体;
}

九、重点——cookie与session

cookie:存储在浏览器端的凭据

session:存储在服务端的凭据

1、cookie

  • 通过setcookie(cookie名,cookie值,过期时间)
    • 过期时间常常写为time()+秒数,time()函数表示当前时间比如time()+60表示六十秒之后过期
  • 用户在请求网站时,浏览器会查找数据库有不有该网站的cookie值,如果有就在请求的时候会自动带上就可以实现登录了,如果没有cookie就要输入账户密码

2、session(可以说是对传统cookie的改进)

  • session的出现是因为cookie存储在浏览器端,一旦客户机被入侵,会窃取cookie里面的账户密码,而且是处于明文状态。
  • session存储在服务端
  • session工作原理是在服务端会生成一个PHPSESSID值,这个值每个用户都是唯一的,也是随机生成的,由若干字母数字随机生成,且这个值也会以文件名存储在服务端,文件内容就是账户密码等信息,然后会将PHPSESSID值发送给浏览器端存储,然后每次访问就会带上这个cookie值(PHPSESSID值)访问,然后服务端会去查找这个值对应的文件名在不在以及里面的内容,然后实现登录
  • session可能存在窃取客户端cookie实现登录的情况,后面的xss攻击会详细讲述,但是session是有有效期的,过期了服务端会自动删除对应文件,实现session文件的更新与管理
  • 需要使用session_start()函数启动,最好在文件第一行就使用
  • 设置session就是用$_SESSION[cookie名]=cookie值写入,然后这些值就会存储在对应的session文件中

这里要说的是如果我们通过burp suite修改了PHPSESSID值肯定就找不到对应文件就不能实现登录,但是会创建一个修改后的名字的session文件,但是里面应该没有内容的

上述知识实践

  • 首先,是cookie的实践,终于成功啦搞了好久       

遇到了一系列问题,主要是php的语法不对导致网页啥都加载不出来,而且vscode都不能检查出来,应该是什么插件没装好

解决的办法可以是不断通过var_dump()函数打印或者echo输出一些中间量(后面的就注释掉)从而找到问题出现在哪里

  • cookie登录是本地浏览器的数据库(浏览器也有数据库)存储了一个文件cookie,(应该本地浏览器只能存一个用户的cookie吧),cookie可以通过(火狐浏览器)的右键“检查”打开中的“存储”下面的“cookie”查看,当然我们这是明文存储cookie是不安全的,一般会加密cookie或者使用session

  • 实践内容

  • 其次,是session的实践
    • session_start()函数的作用
      • 在php中使用session必须调用session_start()函数
      • 通过调用这个函数创建session,开始一个会话,进行session初始化
      • 注意!!!Session_start函数前面不可以有任何输出
      • 当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。 Session以数组的形式使用,如:$_SESSION['session']
      • 出错&总结:在前几次使用session时,在登陆页面首页检查用户的session时,据出来的结果是session里面没有内容,就是因为在这个文件里面我没有调用session_start函数,只是在首次设置session的pjp文件里面调用(将注册、session登录,密码登录等等功能拆分多个文件写,后续将改为一个文件);所以仔细想想是有问题的,因为检查的时候是去查服务端的对应PHPSESSID值的文件里面的内容,而我并没有写这个功能,肯定是由session_start完成的
    • 代码(拆分多个文件版)

十、php与html、javascript等关系

  • PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
  • html中如果出现了php的代码,即有<?php ?>,如果纯是访问html页面,浏览器解析出来是原样输出的,因为php代码是在服务端运行的,唯一一种可以执行的情况是此文件被包含(include函数)在php文件中,php文件可以执行

 

十一、html套模板取模板

html模板全都是一个div搞定所有,没有了form的概念,发送数据包可以用异步

 

1、在浏览器搜索html登录模板,即可得到一系列,然后选择自己喜欢的,右键鼠标“查看页面源代码”,然后直接复制粘贴并且下载完毕所有相关的css、img图片文件等,弄到自己的网站去即可

2、查看粘贴下来的效果

 

 

十二、Ajax和jQuery Ajax:优化用户体验

1、Ajax

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容

AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行。

即实现前端和服务端的异步通信

  • 实例

先写好ajax内容

然后设置“点击”按钮触发ajax

!!!既然有异步就不要同步了呀,只需要一个就好,有了异步发送数据包就不用传统的form表单发数据包了不然浏览器该如何选择呢

 

2、jQuery Ajax

jQuery是一个JavaScript的库,极大简化了javascript编程

所以需要下载这个库(Download jQuery | jQuery),现在去下载,然后在js中引入即可,还有一个方案

百度的cdn:

<head> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"> </script> </head>

  • jQuery Ajax

编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现并不相同。这意味着您必须编写额外的代码对浏览器进行测试。不过,jQuery 团队为我们解决了这个难题,我们只需要一行简单的代码,就可以实现 AJAX 功能

  • jQuery使用比ajax原生态好很多,封装的很好,所以调用简单
  • jQuery Ajax实例
  • 页面效果

 

 

十三、json

JSON: JavaScript Object Notation(JavaScript 对象表示法)

JSON 是存储和交换文本信息的语法,类似 XML。

  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

 

原先我们只能返回一个结果内容,而json可以返回多个值且是键值对

上述流程我们实现了Ajax传输数据,接下来我们通过json数据格式实现前后端跳转和弹窗,即登入成功可以跳转页面

  • json实例

写入json数据

接受json数据

 

十四、mvc形式架构

代码都是有组织结构的,初版->简版->精版->mvc控制器

就像是之前我写的是每一个功能块写一个文件就是初版,然后下图的组织方式就是把多个功能块放在一个文件里写,相对初版会好很多

  • 但是像这样的代码没有人会要的hh,现在的代码都是套框架,应该有很多框架,我们这里学习mvc框架,(后面更好的看懂代码在进行代码审计的时候),但是可能用了框架会报很多bug,maybe是框架本身的bug等等,但是框架还是优点多才运用广泛。

 

  • 原生态写mvc框架
    • mvc就是层级框架,更好管理

因为一个网站/项目 的功能块很多,我们之前的方式只是三个功能就写了六七个case分支,如果再多一点就更多更乱,不好管理,所以大型网站(web应用)都会用到mvc架构

上图是针对我们目前这个网站的功能块做简单的分层:一个接口算是完成一个功能,而一些接口是会出现在同一个界面的,所以可以归为一个大功能块,从而实现层级管理

效果

将数组$result当前元素的键和值分别赋值给$k和$v变量(正常数组键值就是数字)