【网络安全】四、中级篇:SQL注入详解 - 实践

news/2025/10/1 9:56:35/文章来源:https://www.cnblogs.com/tlnshuju/p/19122131

【网络安全】四、中级篇:SQL注入详解 - 实践

2025-10-01 09:54  tlnshuju  阅读(0)  评论(0)    收藏  举报

SQL 注入(SQL Injection)是 Web 安全领域最常见且危害极大的攻击方式之一。它通过将恶意 SQL 代码插入到用户输入中,欺骗数据库执行非预期操作,可能导致数据泄露、权限提升甚至服务器被控。

一、SQL 注入的攻击手段

1. 万能密码注入

1.1 原理

利用 SQL 逻辑漏洞,通过构造恒真条件绕过登录验证。当后台将用户输入直接拼接到 SQL 查询时,攻击者可注入' OR '1'='1' -- 等语句使查询条件永远为真。

1.2 示例场景

假设有登录验证代码:

// 漏洞代码
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";

攻击方式:在用户名输入框填入 ' OR '1'='1' -- ,密码任意输入。拼接后的 SQL 变为:

SELECT * FROM users WHERE username='' OR '1'='1' -- ' AND password='任意值'

-- 注释掉后续语句,'1'='1使条件恒真,直接绕过登录。

2. 联合查询注入(UNION Injection)

2.1 原理

利用UNION操作符拼接额外查询,在页面返回结果中获取数据库信息。要求前后查询的列数一致,常用于获取数据库版本、表名、字段名等敏感信息。

2.2 示例场景

假设有商品查询代码:

// 漏洞代码
\$id = $\_GET\['id'];
\$sql = "SELECT name, price FROM products WHERE id=\$id";
\$result = mysqli\_query(\$conn, \$sql);

攻击步骤:

  1. 测试列数:?id=1 UNION SELECT 1,2--+(若页面显示 2,则说明存在 2 列)
  2. 获取数据库版本:?id=1 UNION SELECT 1,version()--+
  3. 获取表名:?id=1 UNION SELECT 1,table_name FROM information_schema.tables--+
  4. 获取字段名:?id=1 UNION SELECT 1,column_name FROM information_schema.columns WHERE table_name='users'--+

3. 布尔盲注(Boolean-based Blind Injection)

3.1 原理

当注入不返回明确结果时,通过构造条件判断语句(如AND 1=1/AND 1=2),根据页面返回的真假状态(如 “存在” 或 “不存在”)逐步猜解数据。

3.2 示例场景

查询用户是否存在的代码:

// 漏洞代码
\$id = $\_GET\['id'];
\$sql = "SELECT \* FROM users WHERE id=\$id";
\$result = mysqli\_query(\$conn, \$sql);
if(mysqli\_num\_rows(\$result) > 0) {
    echo "用户存在";
} else {
    echo "用户不存在";
}

攻击步骤:

  1. 判断数据库长度:?id=1 AND length(database())>5--+(根据返回判断长度)
  2. 猜解数据库名:?id=1 AND substr(database(),1,1)='t'--+(逐个字符验证)

4. 时间盲注(Time-based Blind Injection)

4.1 原理

当页面无任何状态差异时,利用sleep()等函数通过延迟响应判断条件是否成立。若条件为真则延迟,为假则正常响应。

4.2 示例场景

无返回信息的查询接口:

// 漏洞代码
\$id = $\_GET\['id'];
\$sql = "SELECT \* FROM logs WHERE id=\$id";
mysqli\_query(\$conn, \$sql); // 无结果输出

攻击步骤:

  1. 判断数据库首字母:?id=1 AND IF(substr(database(),1,1)='t',sleep(5),1)--+
  2. 若请求延迟 5 秒,则首字母为 ‘t’,以此类推猜解完整信息。

二、SQL 注入的防御方法

1. 输入验证与过滤

对用户输入进行严格校验,限制输入格式(如仅允许数字、字母),过滤或转义特殊字符(如'"=#等)。

// 示例:验证ID必须为数字
\$id = $\_GET\['id'];
if(!is\_numeric(\$id)) {
    die("无效的ID");
}

2. 参数化查询(预编译语句)

核心防御手段:将 SQL 语句与用户输入分离,使用预编译语句传递参数,使数据库无法将参数解析为 SQL 代码。

PHP MySQLi 示例

// 安全代码
\$id = $\_GET\['id'];
\$stmt = \$conn->prepare("SELECT name, price FROM products WHERE id=?");
\$stmt->bind\_param("i", \$id); // "i"表示参数为整数
\$stmt->execute();
\$result = \$stmt->get\_result();

PHP PDO 示例

// 安全代码
\$id = $\_GET\['id'];
\$stmt = \$pdo->prepare("SELECT \* FROM users WHERE username=:username");
\$stmt->execute(\[':username' => \$username]);

3. 使用 ORM 框架

ORM(对象关系映射)框架(如 Laravel 的 Eloquent、ThinkPHP 的模型)内部已实现参数化查询,可避免手动拼接 SQL。

// ThinkPHP ORM示例(安全)
\$user = User::where('username', \$username)->where('password', \$password)->find();

4. 最小权限原则

数据库账号仅分配必要权限(如查询用账号无删除 / 修改权限),即使被注入也能降低危害。

5. 错误信息处理

禁用生产环境的详细错误提示(如不显示mysqli_error()结果),避免泄露数据库结构。

// 生产环境配置
ini\_set('display\_errors', 0);
error\_reporting(0);

6. 定期安全审计

使用工具(如 SQLMap)扫描潜在漏洞,定期更新框架和数据库补丁。

三、PHPStudy 实战案例

1. 环境搭建

1.1 安装 PHPStudy

官网下载并安装,启动 Apache 和 MySQL 服务。

1.2 创建数据库

  • 在PHPStudy上新建testdb数据库
-- 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
INSERT INTO users VALUES (1, 'admin', '123456');
-- 创建商品表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
category VARCHAR(50) NOT NULL
);
-- 插入测试数据
INSERT INTO products VALUES
(1, '笔记本电脑', 5999.99, '电子产品'),
(2, '机械键盘', 399.99, '电脑配件'),
(3, '无线鼠标', 129.99, '电脑配件');
-- 创建日志表
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
action VARCHAR(100) NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入日志数据
INSERT INTO logs VALUES
(1, 1, '用户登录', '2023-10-01 08:30:00'),
(2, 1, '查看商品', '2023-10-01 09:15:00');

1.3 创建php文件

  • login.php
<?php
session_start();
// 修改此处的连接端口、用户名、密码、数据库名
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败");
}
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
$login_msg = '';
// 处理登录请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 漏洞代码:直接拼接SQL(无转义、无参数化)
$sql = "SELECT username FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
$_SESSION['username'] = $username;
header("Location: login_success.php"); // 登录成功页
exit;
} else {
$login_msg = "<span style='color: red;'>用户名或密码错误</span>";
}
}
mysqli_close($conn);
?>
<!-- 登录页面HTML --><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>用户登录(万能密码漏洞)</title><style>.container { width: 400px; margin: 80px auto; padding: 30px; border: 1px solid #ddd; border-radius: 5px; }.form-group { margin: 15px 0; }label { display: inline-block; width: 80px; font-size: 16px; }input { padding: 8px; width: 250px; border: 1px solid #ddd; border-radius: 3px; }button { width: 100%; padding: 10px; margin-top: 10px; background: #0066cc; color: white; border: none; border-radius: 3px; cursor: pointer; }.msg { margin-top: 15px; text-align: center; }</style></head><body><div class="container"><h2 style="text-align: center; margin-bottom: 20px;">用户登录(万能密码漏洞)</h2><form method="post"><div class="form-group"><label>用户名:</label><input type="text" name="username" value="<?php echo htmlspecialchars($username); ?>" required></div><div class="form-group"><label>密码:</label><input type="password" name="password" required></div><button type="submit">登录</button><?php if ($login_msg): ?><div class="msg"><?php echo $login_msg; ?></div><?php endif; ?></form></div></body></html>
  • login_success.php
<!-- 登录成功页(同目录下新建 login_success.php) --><?php// 新建文件:sql-injection-demo/vuln/login_success.phpsession_start();if (!isset($_SESSION['username'])) {header("Location: login.php");exit;}?><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>登录成功</title><style>.container { width: 500px; margin: 50px auto; text-align: center; }.success { font-size: 24px; color: green; margin: 20px 0; }a { color: #0066cc; }</style></head><body><div class="container"><h2>登录成功!</h2><div class="success">欢迎您,<?php echo htmlspecialchars($_SESSION['username']); ?></div><a href="login.php?logout=1">退出登录</a></div></body></html>
  • product_query.php
<?php
// 数据库连接(注意:实际开发中不要硬编码密码,此处为测试用)
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
// 连接错误处理
if (!$conn) {
die("数据库连接失败:" . mysqli_connect_error());
}
// 获取用户输入的商品ID
$product_id = $_GET['product_id'] ?? '';
$product_info = null;
$error_msg = '';
if (!empty($product_id)) {
// 漏洞代码:直接拼接SQL(无参数化)
$sql = "SELECT name, price, category FROM products WHERE id=$product_id";
$result = mysqli_query($conn, $sql);
if ($result) {
$product_info = mysqli_fetch_assoc($result);
if (!$product_info) {
$error_msg = "未找到ID为 $product_id 的商品";
}
} else {
$error_msg = "查询错误:" . mysqli_error($conn);
}
}
// 关闭连接
mysqli_close($conn);
?>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>商品查询(存在注入漏洞)</title><style>.container { width: 600px; margin: 50px auto; padding: 20px; border: 1px solid #ddd; }.form-group { margin: 15px 0; }label { display: inline-block; width: 100px; }input { padding: 5px; width: 300px; }button { padding: 6px 20px; cursor: pointer; }.result { margin-top: 20px; padding: 10px; background: #f5f5f5; }</style></head><body><div class="container"><h2>商品查询(存在SQL注入漏洞)</h2><!-- 商品查询表单 --><form method="get"><div class="form-group"><label>商品ID</label><input type="text" name="product_id" value="<?php echo htmlspecialchars($product_id); ?>" placeholder="输入商品ID(1-3)"><button type="submit">查询</button></div></form><!-- 显示查询结果 --><?php if ($error_msg): ?><div class="result" style="color: red;"><?php echo $error_msg; ?></div><?php elseif ($product_info): ?><div class="result"><h3>商品信息</h3><p>名称:<?php echo htmlspecialchars($product_info['name']); ?></p><p>价格:<?php echo htmlspecialchars($product_info['price']); ?></p><p>分类:<?php echo htmlspecialchars($product_info['category']); ?></p></div><?php endif; ?></div></body></html>
  • usser_check.php
<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败");
}
$user_id = $_GET['user_id'] ?? '';
$check_result = '';
if (!empty($user_id)) {
// 漏洞代码:直接拼接SQL
$sql = "SELECT id FROM users WHERE id=$user_id";
$result = mysqli_query($conn, $sql);
// 仅返回“存在”或“不存在”,无其他信息(符合布尔盲注场景)
if (mysqli_num_rows($result) > 0) {
$check_result = "<span style='color: green;'>用户存在</span>";
} else {
$check_result = "<span style='color: red;'>用户不存在</span>";
}
}
mysqli_close($conn);
?>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>用户存在查询(布尔盲注漏洞)</title><style>.container { width: 500px; margin: 50px auto; }.form-group { margin: 20px 0; }input { padding: 5px; width: 200px; }.result { margin-top: 20px; font-size: 18px; }</style></head><body><div class="container"><h2>用户存在查询(布尔盲注漏洞)</h2><form method="get"><div class="form-group"><label>用户ID</label><input type="text" name="user_id" value="<?php echo htmlspecialchars($user_id); ?>" placeholder="输入用户ID"><button type="submit">查询</button></div></form><?php if ($check_result): ?><div class="result">查询结果:<?php echo $check_result; ?></div><?php endif; ?></div></body></html>
  • log_record.php
<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败");
}
$log_id = $_GET['log_id'] ?? '';
$page_msg = "日志操作已执行"; // 固定提示,无结果差异(符合时间盲注场景)
if (!empty($log_id)) {
// 漏洞代码:直接拼接SQL,无结果输出
$sql = "SELECT action FROM logs WHERE id=$log_id";
mysqli_query($conn, $sql); // 仅执行查询,不返回任何结果
}
mysqli_close($conn);
?>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>日志记录(时间盲注漏洞)</title><style>.container { width: 500px; margin: 50px auto; }.form-group { margin: 20px 0; }input { padding: 5px; width: 200px; }.msg { margin-top: 20px; font-size: 16px; color: #333; }</style></head><body><div class="container"><h2>日志记录(时间盲注漏洞)</h2><form method="get"><div class="form-group"><label>日志ID</label><input type="text" name="log_id" value="<?php echo htmlspecialchars($log_id); ?>" placeholder="输入日志ID"><button type="submit">执行日志操作</button></div></form><div class="msg"><?php echo $page_msg; ?></div></div></body></html>
  • 文件目录结构如下
PHPStudy/WWW/​
└── sql-injection-demo/​
├── vuln/                # 漏洞文件目录​
│   ├── product_query.php  # 联合查询注入(商品)​
│   ├── user_check.php     # 布尔盲注(用户查询)​
│   ├── log_record.php     # 时间盲注(日志)​
│   ├── login.php          # 万能密码注入(登录)​
│   └── login_success.php  # 登录成功页(漏洞版)​
└── safe/                # 安全文件目录​
├── product_query.php  # 联合查询修复版​
├── user_check.php     # 布尔盲注修复版​
├── log_record.php     # 时间盲注修复版​
├── login.php          # 万能密码修复版​
└── login_success.php  # 登录成功页(安全版)

2. 万能密码注入

2.1 攻击演示

2.2 防御

修改login.phplogin_success.phpmysqli_prepare会将不完整的SQL语句先编译,用户输入只能作为参数。

<?php
// safe/login.php
session_start();
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败");
}
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
$login_msg = '';
// 退出登录逻辑
if (isset($_GET['logout'])) {
session_destroy();
header("Location: login.php");
exit;
}
// 处理登录请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 安全代码:参数化查询
$sql = "SELECT username, password FROM users WHERE username=?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "s", $username); // "s"表示字符串类型
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$user = mysqli_fetch_assoc($result);
// 验证密码(注意:实际开发中密码需加密存储,此处为演示用明文)
if ($user && $user['password'] === $password) {
$_SESSION['username'] = $user['username'];
header("Location: login_success.php");
exit;
} else {
$login_msg = "<span style='color: red;'>用户名或密码错误</span>";
}
mysqli_stmt_close($stmt);
}
mysqli_close($conn);
?>
<!-- safe/login_success.php --><?phpsession_start();if (!isset($_SESSION['username'])) {header("Location: login.php");exit;}?><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>登录成功(安全版)</title><style>.container { width: 500px; margin: 50px auto; text-align: center; }.success { font-size: 24px; color: green; margin: 20px 0; }.tip { color: #666; margin: 10px 0; }a { color: #0066cc; }</style></head><body><div class="container"><h2>登录成功(安全版)</h2><div class="success">欢迎您,<?php echo htmlspecialchars($_SESSION['username']); ?></div><div class="tip">提示:实际开发中需用md5/sha256等加密存储密码</div><a href="login.php?logout=1">退出登录</a></div></body></html><!-- 登录页面HTML(safe/login.php 后续代码) --><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>用户登录(安全版)</title><style>.container { width: 400px; margin: 80px auto; padding: 30px; border: 1px solid #ddd; border-radius: 5px; }.form-group { margin: 15px 0; }label { display: inline-block; width: 80px; font-size: 16px; }input { padding: 8px; width: 250px; border: 1px solid #ddd; border-radius: 3px; }button { width: 100%; padding: 10px; margin-top: 10px; background: #0066cc; color: white; border: none; border-radius: 3px; cursor: pointer; }.msg { margin-top: 15px; text-align: center; }.safe-tip { font-size: 12px; color: #666; margin-top: 20px; text-align: center; }</style></head><body><div class="container"><h2 style="text-align: center; margin-bottom: 20px;">用户登录(安全版:参数化查询)</h2><form method="post"><div class="form-group"><label>用户名:</label><input type="text" name="username" value="<?php echo htmlspecialchars($username); ?>" required></div><div class="form-group"><label>密码:</label><input type="password" name="password" required></div><button type="submit">登录</button><?php if ($login_msg): ?><div class="msg"><?php echo $login_msg; ?></div><?php endif; ?></form><div class="safe-tip">万能密码注入已被拦截(参数化查询保护)</div></div></body></html>

3. 联合查询注入(商品查询)

3.1 攻击演示

3.2 防御

修改product_query.php文件

<?php
// 数据库连接
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败:" . mysqli_connect_error());
}
$product_id = $_GET['product_id'] ?? '';
$product_info = null;
$error_msg = '';
if (!empty($product_id)) {
// 安全代码:使用参数化查询(预编译语句)
$sql = "SELECT name, price, category FROM products WHERE id=?";
// 准备预编译语句
$stmt = mysqli_prepare($conn, $sql);
// 绑定参数("i"表示参数为整数类型)
mysqli_stmt_bind_param($stmt, "i", $product_id);
// 执行查询
mysqli_stmt_execute($stmt);
// 获取结果集
$result = mysqli_stmt_get_result($stmt);
if ($result) {
$product_info = mysqli_fetch_assoc($result);
if (!$product_info) {
$error_msg = "未找到ID为 $product_id 的商品";
}
} else {
$error_msg = "查询错误:" . mysqli_stmt_error($stmt);
}
// 关闭预编译语句
mysqli_stmt_close($stmt);
}
mysqli_close($conn);
?>
<!-- HTML部分与漏洞文件完全一致,此处省略(直接复制漏洞文件的HTML代码即可) --><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>商品查询(安全版)</title><style>.container { width: 600px; margin: 50px auto; padding: 20px; border: 1px solid #ddd; }.form-group { margin: 15px 0; }label { display: inline-block; width: 100px; }input { padding: 5px; width: 300px; }button { padding: 6px 20px; cursor: pointer; }.result { margin-top: 20px; padding: 10px; background: #f5f5f5; }</style></head><body><div class="container"><h2>商品查询(安全版:参数化查询)</h2><form method="get"><div class="form-group"><label>商品ID</label><input type="text" name="product_id" value="<?php echo htmlspecialchars($product_id); ?>" placeholder="输入商品ID(1-3)"><button type="submit">查询</button></div></form><?php if ($error_msg): ?><div class="result" style="color: red;"><?php echo $error_msg; ?></div><?php elseif ($product_info): ?><div class="result"><h3>商品信息</h3><p>名称:<?php echo htmlspecialchars($product_info['name']); ?></p><p>价格:<?php echo htmlspecialchars($product_info['price']); ?></p><p>分类:<?php echo htmlspecialchars($product_info['category']); ?></p></div><?php endif; ?></div></body></html>

4. 布尔盲注(用户存在查询)

4.1 攻击演示

4.2 防御

修改user_check.php,同样是通过参数化注入。

<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败");
}
$user_id = $_GET['user_id'] ?? '';
$check_result = '';
if (!empty($user_id)) {
// 第一步:输入验证(仅允许数字)
if (!is_numeric($user_id)) {
$check_result = "<span style='color: orange;'>无效ID:仅允许输入数字</span>";
} else {
// 第二步:参数化查询
$sql = "SELECT id FROM users WHERE id=?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "i", $user_id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
if (mysqli_num_rows($result) > 0) {
$check_result = "<span style='color: green;'>用户存在</span>";
} else {
$check_result = "<span style='color: red;'>用户不存在</span>";
}
mysqli_stmt_close($stmt);
}
}
mysqli_close($conn);
?>
<!-- HTML部分与漏洞文件一致,此处省略(复制漏洞文件的HTML代码) --><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>用户存在查询(安全版)</title><style>.container { width: 500px; margin: 50px auto; }.form-group { margin: 20px 0; }input { padding: 5px; width: 200px; }.result { margin-top: 20px; font-size: 18px; }</style></head><body><div class="container"><h2>用户存在查询(安全版:输入验证+参数化)</h2><form method="get"><div class="form-group"><label>用户ID</label><input type="text" name="user_id" value="<?php echo htmlspecialchars($user_id); ?>" placeholder="输入用户ID"><button type="submit">查询</button></div></form><?php if ($check_result): ?><div class="result">查询结果:<?php echo $check_result; ?></div><?php endif; ?></div></body></html>

5. 时间盲注(日志记录)

5.1 攻击演示

5.2 防御

修改log_record.php文件,核心同样是参数化查询。

<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'testdb');
if (!$conn) {
die("数据库连接失败");
}
$log_id = $_GET['log_id'] ?? '';
$page_msg = "日志操作已执行";
if (!empty($log_id)) {
// 安全代码:参数化查询
$sql = "SELECT action FROM logs WHERE id=?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "i", $log_id);
mysqli_stmt_execute($stmt); // 执行查询,无结果输出
mysqli_stmt_close($stmt);
}
mysqli_close($conn);
?>
<!-- HTML部分与漏洞文件一致,此处省略 --><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>日志记录(安全版)</title><style>.container { width: 500px; margin: 50px auto; }.form-group { margin: 20px 0; }input { padding: 5px; width: 200px; }.msg { margin-top: 20px; font-size: 16px; color: #333; }</style></head><body><div class="container"><h2>日志记录(安全版:参数化查询)</h2><form method="get"><div class="form-group"><label>日志ID</label><input type="text" name="log_id" value="<?php echo htmlspecialchars($log_id); ?>" placeholder="输入日志ID"><button type="submit">执行日志操作</button></div></form><div class="msg"><?php echo $page_msg; ?></div></div></body></html>

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

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

相关文章

完整教程:第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】

完整教程:第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

重庆做seo网站优化选择哪家全国小微企业名录

点击上方“蓝字”关注我们“2020中国山东新旧动能转换高价值专利培育大赛”(简称“新高赛”)是由山东省市场监督管理局(知识产权局)主办&#xff0c;由山东省知识产权事业发展中心、知识产权出版社有限责任公司共同承办的以新旧动能转换高价值专利培育为主题的创新大赛。新高赛…

网站名称意义灵璧县建设局网站

你是否曾经尝试过将你的 Python 程序打包成一个可执行文件&#xff0c;却发现生成的文件大得惊人&#xff1f;别担心&#xff0c;本文将教你如何使用 PyInstaller 尽可能减小生成的 onefile 大小&#xff0c;让你的程序轻盈如风&#xff01; 1. 使用虚拟环境 首先&#xff0c…

完整教程:二维凸包——Andrew 算法学习笔记

完整教程:二维凸包——Andrew 算法学习笔记pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

电脑性能优化综合指南:从网络到硬件的不全面解答

目录 网络速度篇 硬件维护篇 系统优化篇 内存管理篇 CPU优化篇 综合建议 网络速度篇 Q1: 下载速度和上传速度跟什么有关?和网页加载速度有关联吗? ​​A:​​ 下载速度和上传速度是衡量网络性能的两个关键指标:…

宁波网站推广软件哪家强网站突然打不开

下载jenkins 官方下载地址&#xff1a;Jenkins 的安装和设置 清华源下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/windows-stable/ 最新支持java8的版本时2.346.1版本&#xff0c;在清华源中找不到&#xff0c;在官网中没找到windows的下载历史&#xff…

深度学习中Bootstrap详解 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

设计师需要了解的网站手机百度网页版 入口

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言评价AI模型“好不好”及“有没有发展”开源与闭源&#xff1a;两种发展路径的比较开源的优势与劣势闭源的优势与劣势 开源与闭源&#xff1a;你更看好哪一种&#x…

莆田做网站网站页面app下载大全

Vue思维导图目录MVC与MVVM的区别Vue基本代码结构Vue指令Vue组件class和style动态绑定computed计算属性EventBusfilter过滤器方法Vue是一套构建用户界面的框架&#xff0c;只关注视图层&#xff0c;它不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。(Vue有配套的第三…

电子商务网站建设课程站长工具成品源码

出现这个问题的原因在于系统分配的“恢复分区”空间不足&#xff0c;该更新在安装时会失败。大致的思路是利用dispart工具收缩C盘空间&#xff0c;扩展该分区的空间。本人开始的“恢复分区”的空间是603MB&#xff0c;安装更新失败&#xff0c;扩充了250MB后&#xff0c;成功了…

深入解析:【数据结构】不带头节点单链表的基本操作

深入解析:【数据结构】不带头节点单链表的基本操作2025-10-01 09:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

少儿舞蹈小脚本(20):手机号登录与多角色注册

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

私活做网站企业建设网站的重要性

大家好&#xff0c;我是阿星&#xff0c;好久不见&#xff0c;欢迎来到Java并发编程系列番外篇线程状态转换&#xff0c;内容通俗易懂&#xff0c;请放心食用。线程状态先来个开场四连问Java线程状态有几个&#xff1f;Java线程状态是如何转换&#xff1f;Java线程状态转换什么…

ps做网站动图wordpress数据库访问慢

安装pygame本人电脑是windows 10、python3.6&#xff0c;pygame下载地址&#xff1a;pypi.python.org/pypi/Pygame…请自行下载对应python版本的pygame运行以下命令创建Pygame窗口及响应用户输入新建一个文件夹alien_invasion&#xff0c;并在文件夹中新建alien_invasion.py文件…

网站分为几种类型重庆建设工程信息网查询平台入口官网

2019独角兽企业重金招聘Python工程师标准>>> 描述&#xff1a; 在文档流中&#xff0c;父元素的高度默认是被子元素撑开的&#xff0c;也就是子元素多高&#xff0c;父元素就多高。但是当子元素设置浮动之后&#xff0c;子元素会完全脱离文档流&#xff0c;此时将会…

MySQL 8 密码验证组件 validate_password 的详细指南

MySQL 8 密码验证组件 validate_password 的详细指南一、组件核心认知与环境准备1. 组件本质与版本差异validate_password 在 MySQL 8 中由「插件」升级为「内置组件」,解决了旧版插件依赖系统库的问题。核心优势:无…

珠海网站定制开发网站备案需要那些资料

1.磁盘分区 1.分区有固定大小 2.直接写在这块盘的磁盘分区表中&#xff08;DPT&#xff09;&#xff0c;和上面装什么操作系统没有任何关系 2.每一个磁盘分区都要先有一个磁盘分区类型 GPT&#xff08;首选&#xff09; MBR 3.磁盘专业术语叫做块设备&#xff08;Block Dev…

网站地图用什么格式网站后台有显示前台没有

04-15 周一 GitHub仓库CI服务器配置过程文档 时间版本修改人描述2024年4月15日10:35:52V0.1宋全恒新建文档2024年4月17日10:33:20v1.0宋全恒完成github actions CI的配置和工作流配置文件解读文档的撰写 简介 一些基础概念 前提知识 仓库介绍 地址镜像介绍https://github.…

实用指南:语义三角论对人工智能自然语言处理中深层语义分析的影响与启示

实用指南:语义三角论对人工智能自然语言处理中深层语义分析的影响与启示2025-10-01 09:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: a…

Android开发-存储框架技术总结 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …