【web基础】php开发相关
目录
2、传递sql语句的函数,对象名->query(sql语句)
八、函数:实现某种功能(实际上学php就是学一些php函数)
一、开发工具
选择vscode,一款编写脚本语言的软件
- 下载好vscode复制到虚拟机中安装,因为之前配置好了php的相关环境,只需要在vscode界面简单设置即可(汉化等等),选择从myWebsite文件夹打开
二、代码规范
(1)php代码位置
<?php
//php代码放在这里
?>
(2)每一条代码以英文分号结束(;)
(3)字符串需要放在单引号或者双引号里面
三、基础基础知识
1、echo表示输出echo后面的内容到屏幕上
2、字符衔接“.”
例如echo '77'.'hello';
会输出77hello
3、变量名和其他的字符要隔开,空格都可以隔开,不然粘一起,php也不认识
四、数据传输和接收
(1)数据传输方法
一般用的最多的两种是GET和POST方法
- GET和POST区别
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完成的
- 代码(拆分多个文件版)
- 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变量(正常数组键值就是数字)