Day27:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

news2025/2/26 19:07:09

目录

TP框架-开发-配置架构&路由&MVC模型

TP框架-安全-不安全写法&版本过滤绕过

思维导图


PHP知识点

功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等

技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;

技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。

TP框架-开发-配置架构&路由&MVC模型

参考:https://www.kancloud.cn/manual/thinkphp5_1

1、配置架构-导入使用

2、路由访问-URL访问

3、数据库操作-应用对象

4、文件上传操作-应用对象

5、前端页面渲染-MVC模型

配置架构-导入使用
修改小皮网址目录:G:\develop\safety\phpstudy_pro\WWW\dome01\thinkphp\public

127.0.0.1成功访问

路由访问-URL访问
访问方式需要按照,特定的访问方式才能访问到
官方的说法:

框架中:/thinkphp/public/index.php
当你输入:127.0.0.1时,就会访问application文件夹下

127.0.0.1  <==>  127.0.0.1/index.php/index/index
index.php:/thinkphp/public/index.php
index:index这个包
index:/index/index.php这个文件
如果想返回域名或表单中输入的参数中的内容
  • 首先需要导入think\Controller类,Controller类是ThinkPHP框架提供的基础控制器类,你的Index类继承了这个控制器类。通过继承Controller**,你可以使用框架提供的一些基础控制器功能,比如处理请求和响应。
  • 其次完成代码回写
<?php
namespace app\index\controller;
**use think\Controller;**

class Index extends Controller
{
    // index方法用于处理首页请求
    public function index()
    {
        // 返回一个包含样式和内容的字符串
        return '<style type="text/css">*{ padding: 0; margin: 0; } .think_default_text{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>';
    }

    **// xi方法用于处理名为xi的请求,返回请求参数中的'name'
    public function xi()
    {
        // 返回请求参数中的'name'
        return $this->request->param('name');
    }**
}

访问有两种方式:
192.168.137.1:84/index.php/Index/index/xi/name/xiaosedi
192.168.137.1:84/index.php/Index/index/xi?name=wusuowei

如果是使用php自带的请求方式访问则:只支持一种方式回写数据
192.168.137.1:84/index.php/Index/index/xi?x=123456
如果创建新的目录,例如application→text→controller→Test.php等

数据库操作-应用对象
数据库配置文件:

引用数据的的类use think\Db;,使用数据库的查询语句
use think\Db;
public function testsql()
    {
       //SELECT * FROM `think_user` WHERE  `id` = 1 LIMIT 1
        // table方法必须指定完整的数据表名
        $data = Db::table('news')->where('id', 1)->findOrFail();
        return json($data);
    }

开启调试设置,会在浏览器打印出错误信息

thinkphp的安全过滤:

  • 如果是原生态php的话,数据库操作没有过滤就会受到SQL注入攻击
  • ThinkPHP框架提供了一些内置的数据库操作方法,使得对数据库的访问更加便捷和安全使用ThinkPHP框架操作数据库 默认是受到框架内置的过滤保护
public function testsql()
    {
       //SELECT * FROM `think_user` WHERE  `id` = 1 LIMIT 1
       //使用TP框架操作数据库 默认是受到框架内置的过滤保护
        $id = request()->param('x');
        $data = Db::table('news')->where('id', $id)->find();
        return json($data);
    }

文件上传操作-应用对象

在配置好的网址根目录public下创建upload.html

在upload.html中写入以下代码,并修改action的地址

<form action="/index.php/test/test/upload" enctype="multipart/form-data" method="post">
  <input type="file" name="image" /> <br>
  <input type="submit" value="上传" />
</form>

在Test.php中输入以下代码(此代码对于上传文件,进行了诸多过滤,保证了安全性)
public function upload(){
    // 获取表单上传文件,例如上传了001.jpg
    $file = request()->file('image');
    
    // 移动到框架应用根目录/uploads/ 目录下
    $info = $file->validate(['ext'=>'jpg,png,gif'])->move('../uploads');

    if($info){
        // 成功上传后,获取上传信息

        // 输出文件扩展名,例如 jpg
        echo $info->getExtension();
        echo '<br>';

        // 输出文件保存路径,例如 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        echo '<br>';

        // 输出文件名,例如 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename();
    } else {
        // 上传失败,获取错误信息
        echo $file->getError();
    }
}

前端页面渲染-MVC模型
在例如index(需要渲染的文件当前并行目录下)→view→index→index.html等
http://192.168.137.1:84/index.php/Index/index/index 输入对应的路由访问即可看到以及渲染的页面

也可以指定内容可以指定模板
public function index()
    {
        **//可以一一赋值
       $this->assign('name','ThinkPHP');
       $this->assign('email','thinkphp@qq.com');
        //可以批量赋值
       $this->assign([
          'name' == 'ThinkPHP',
          'email' == 'thinkphp@qq.com'
       ]);
       //模板输出
       return $this->fetch('index/edit');
    }

TP框架-安全-不安全写法&版本过滤绕过

1、内置代码写法,原生写法

例子:不合规的代码写法-TP5-自写

2、框架版本安全,框架漏洞

例子1:写法内置安全绕过-TP5-SQL注入

例子2:内置版本安全漏洞-TP5-代码执行

判断漏洞的方式:首先判断代码写法如果是不安全写法直接通过代码回写使用sql注入,如果是安全写法则判断中间框架版本号,依据版本号去寻找存在的漏洞

内置代码写法,原生写法

例子:不合规的代码写法-TP5-自写

1、使用TP框架操作数据库 默认是受到框架内置过滤保护

2、原生态的数据库操作如果没有过滤就会受到SQL注入攻击

安全写法=推荐写法 不安全写法=原生写法(不会受到保护)

安全写法:

规矩写法:不是绝对安全 看两点
看版本的内置绕过漏洞 同样也有漏洞

$id=request()->param('x');
$data=Db::table('news')->where('id',$id)->find();

用一半安全写法:用一半安全写法 有安全隐患

//用一半安全写法 有安全隐患
   $id=request()->param('x');
   $data=Db::query("select * from news where id=$id");

纯原生写法(完全不是用TP语法)

// 从GET请求中获取id参数,如果不存在则默认为1
$id = $_GET['id'] ?? '1';

// 构建SQL查询语句
$sql = "select * from news where id=$id";
echo $sql;

// 执行查询并获取结果集
$data = mysqli_query($con, $sql);

// 使用mysqli_fetch_row遍历结果集的每一行
while ($row = mysqli_fetch_row($data)) {
    // 从结果集中获取每一列的值,并存储到相应的变量中
    $page_title = $row[1];
    $heading = $row[2];
    $subheading = $row[3];
    $content = $row[4];
    $item = $row[5];
}

框架版本安全,框架漏洞

首先查看中间框架的版本是什么,如ThinkPHP的版本在thinkphp→thinkphp→tpl→base.php中查看

依据版本号去查找,出现过的漏洞,进行复现即可(没有绝对的安全)

思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1504780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android14之解决报错:No module named sepolgen(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

excel统计分析——嵌套设计

参考资料&#xff1a;生物统计学&#xff0c;巢式嵌套设计的方差分析 嵌套设计&#xff08;nested design&#xff09;也称为系统分组设计或巢式设计&#xff0c;是把试验空间逐级向低层次划分的试验设计方法。与裂区设计相似&#xff0c;先按一级因素设计试验&#xff0c;然后…

LeetCode-1004. 最大连续1的个数 III

每日一题系列&#xff08;day 20&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50…

【OpenCV】如何在Linux操作系统下正确安装 OpenCV

前言 我是在虚拟机上跑的 Linux 5.8.0-44-generic。 配置如下&#xff1a; 目录 第一步&#xff1a;下载依赖文件 第二步&#xff1a;下载 opencv 和 opencv_contrib 源码 第三步&#xff1a;解压缩包 第四步&#xff1a;移动文件 第五步&#xff1a;生成 makefile 文件 …

oracle基础-多表关联查询 备份

一、概述 在实际应用系统开发中会设计多个数据表&#xff0c;每个表的信息不是独立存在的&#xff0c;而是若干个表之间的信息存在一定的关系&#xff0c;当用户查询某一个表的信息时&#xff0c;很可能需要查询关联数据表的信息&#xff0c;这就是多表关联查询。SELECT语句自身…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候&#xff0c;在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数&#xff0c;使得它们能够处理更复杂的问题&#xff0c;并学习更广泛的知识。自2022 年以来&#xff0c;LLM技术在得到了广泛的应…

网络触手获取天气数据存入mysql 项目

首先这个案例不一定能直接拿来用&#xff0c;虽然我觉得可以但是里面肯定有一些我没考虑到的地方。 有问题评论或者私信我&#xff1a; 这个案例适合我这种学生小白 获取天气数据网址&#xff1a; https://lishi.tianqi.com/xianyang/202201.html 网络触手获取天气数据代码直…

这是一段神奇的提示词,能直接调取Claude 3的系统提示词!附详细解读

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验

以下文章来源于高通中国 如今&#xff0c;音频内容与形式日渐丰富&#xff0c;可满足人们放松心情、提升自我、获取资讯等需求。得益于手机、手表、耳机、车载音箱等智能设备的广泛应用&#xff0c;音频内容可以更快速触达用户。从《音频产品使用现状调研报告2023》中发现&…

蓝桥杯大赛软件python赛道真题:蛇形填数

真题链接&#xff1a;https://www.lanqiao.cn/problems/594/learning/ 题目描述&#xff1a; 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff0c;小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 …

15:00面试,15:07就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到3月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

leetcode 热题 100_相交链表

题解一&#xff1a; 哈希表&#xff1a;两链表出现的第一个相同的值就是相交节点&#xff0c;因此我们先用哈希记录链表A所有出现过的值&#xff0c;再遍历链表B查找哈希表&#xff0c;找出第一个相同的值即为结果。 import java.util.HashSet;public class Solution {public …

实验二 Hello, miniEuler操作演示(保姆级教程)

PS&#xff1a;所有的批注都写在了块引用中&#xff0c;其他文字均为题干 print函数是学习几乎任何一种软件开发语言时最先学习使用的函数&#xff0c;同时该函数也是最基本和原始的程序调试手段&#xff0c;但该函数的实现却并不简单。本实验的目的在于理解操作系统与硬件的接…

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接&#xff1a;DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…

Diddler抓包工具——学习笔记

F12抓包 302【重定向】&#xff1a;当你发送了一个请求之后&#xff0c;那么这个请求重定向到了另外的资源 跳转和重定向的区别&#xff1a; 跳转是会把数据传到新的地址 重定向不会把新的数据传到新的地址 使用F12抓包时一定要打开Preserve Log开关&#xff0c;作用是保留…

【libwebrtc】基于m114

libwebrtc A C++ wrapper for binary release, mainly used for flutter-webrtc desktop (windows, linux, embedded).是 基于m114版本的webrtc 最新(20240309 ) 的是m122了。官方给出的构建过程 .gclient 文件 solutions = [{"name" : src,"url

表单进阶(3)-上传文件和隐藏字段

上传文件&#xff1a;<input type"file"> 隐藏字段&#xff1a;<input type"hidden" name"" id"" value"带给后端的信息"> 禁用disabled&#xff1a;<button disabled"disabled">注册</bu…

C++——string模拟实现

前言&#xff1a;上篇文章我们对string类及其常用的接口方法的使用进行了分享&#xff0c;这篇文章将着重进行对这些常用的接口方法的内部细节进行分享和模拟实现。 目录 一.基础框架 二.遍历字符串 1.[]运算符重载 2.迭代器 3.范围for 三.常用方法 1.增加 2.删除 3.调…

Linux系统——JVM调优

目录 一、GC如何调优 1.JVM调优的时机 2.JVM调优目标 3.JVM调优步骤 4.选择合适的垃圾回收器 5.调整内存大小 6.设置符合预期的停顿时间 7.调整内存区域大小比率 8.调整对象升老年代的年龄 9.调整大对象的标准 10.调整GC的触发时机 11.调整 JVM本地内存大小 二、JV…