DVWA靶场保姆级通关教程--03CSRF跨站请求伪造

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 目录

    文章目录

    前言

    一、low级别的源码分析

    二、medium级别源码分析

    安全性分析

    增加了一层 Referer 验证:

    关键点是:在真实的网络环境中,攻击者并不需要(也不可能)拦截或修改用户的请求

    常见诱导方式

    1. 自动提交表单(伪装成广告或页面跳转)

    2. 隐藏在图片标签中(GET 请求时)

    3. 模拟跳转页面 

    攻击者利用的是:

    三、high级别源码分析

    当前 High 级别 CSRF 防御机制:

    也就是说:

    附加说明(常见误区):

    四、impossible级别源码分析

    1. 引入了 CSRF Token 校验

    2. 使用了预处理语句(Prepared Statements)

    3. 增加了密码确认机制

    4. 错误处理和反馈更加清晰

    5. 密文加密

    6. 会话令牌(Session Token)管理

    总结


前言

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全攻击方式。它的核心思想是:

攻击者诱导用户在已经登录认证的情况下,发起一个伪造的请求到受信任的网站,从而在用户不知情的情况下完成一些恶意操作。

图示如下:


提示:以下是本篇文章正文内容,下面案例可供参考

一、low级别的源码分析

<?php// 如果用户提交了 Change 参数(通过 GET 请求)
if( isset( $_GET[ 'Change' ] ) ) {// 获取新密码和确认密码的值$pass_new  = $_GET[ 'password_new' ];     // 新密码$pass_conf = $_GET[ 'password_conf' ];    // 确认密码// 检查两次输入的密码是否一致if( $pass_new == $pass_conf ) {// 如果一致,则进行下一步处理// 对新密码进行 SQL 转义,防止 SQL 注入(不过这里写法比较老旧)$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// 使用 MD5 对密码加密(不安全,但这是示例)$pass_new = md5( $pass_new );// 构造 SQL 更新语句,将当前用户的密码更新为新密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";// 执行 SQL 更新操作$result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// 给用户的提示信息:密码修改成功echo "<pre>Password Changed.</pre>";}else {// 如果密码不一致,提示错误echo "<pre>Passwords did not match.</pre>";}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>

这里虽然修改密码失败,但是可以通过URL发现,修改密码的操作是通过get传参提交了一个change的请求,打开一个新的页面直接在地址栏修改,前提是打开一个新的页面发现用户并没退出登录,类似点击了一个a(img)(form)标签跳转到一个新的页面,使用这个已登录用户的session信息进行验证

在新的标签构造修改密码的URL如下:

  • 修改密码使用 GET 请求(不安全)。

  • 用户已登录,浏览器会自动带上 Cookie。

  • 所以即使在新窗口点击链接打开,只要用户没退出登录,就会生效。

  • 攻击者就能通过构造 URL + 诱导点击,悄悄修改密码。

二、medium级别源码分析

<?php// 判断用户是否提交了 GET 参数 Change
if( isset( $_GET[ 'Change' ] ) ) {// 验证请求是否来自本站,即检查 Referer 是否包含当前服务器域名if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {// 获取用户输入的新密码和确认密码$pass_new  = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// 检查两次输入是否一致if( $pass_new == $pass_conf ) {// SQL 过滤 + MD5 加密(仍然不安全,仅用于演示)$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_new = md5( $pass_new );// 执行 SQL 更新语句$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// 显示提示信息echo "<pre>Password Changed.</pre>";}else {// 密码不一致,报错echo "<pre>Passwords did not match.</pre>";}}else {// 如果 Referer 不可信,拒绝请求echo "<pre>That request didn't look correct.</pre>";}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>

安全性分析

增加了一层 Referer 验证:

Referer(HTTP 头部的一部分) 是浏览器在发起请求时自动携带的信息,用于告诉服务器:

“这个请求是从哪个页面跳转过来的”。

if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
  • 作用:防止来自第三方页面(例如攻击者网站)的请求。

  • 原理:合法请求应来自当前站点的页面,Referer 会包含本站域名。

  • 攻击者如果在自己的页面发起请求,Referer 通常不会包含受害网站域名,因此会被拦截。

这里如果还是用low级别的方法在一个新的页面构造修改密码的请求,会报错。主要就是referer的参数没有和第一个请求的时候保持一致,那么先正常修改密码,通过burpsuite抓包看一下referer字段的参数值是多少

打开一个新的页面构造修改密码的URL:http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

此时修改密码是失败的,通过抓包查看,可以看到没有Referer字段值,将数据包发送repeater重发模块

在数据包重放模块中、在get请求和referer字段同时修改、你现在想修改的密码:比如123456,点击send发送,查看返回值发现修改成功

关键点是:在真实的网络环境中,攻击者并不需要(也不可能)拦截或修改用户的请求

攻击者诱导用户自己去发出“合法的请求”,并利用用户的登录状态(如 Cookie 中的 session)完成敏感操作。

 攻击者构造如下 HTML 页面,诱导用户点击或自动访问,造成好像是一个正常广告弹窗或是页面跳转再或者页面一闪而过的这种现象,让用户以为自己并没有受到攻击:

常见诱导方式

1. 自动提交表单(伪装成广告或页面跳转)

<html><head><meta charset="utf-8"><title>加载中...</title></head><body onload="document.forms[0].submit()"><p>页面加载中,请稍后...</p><form action="http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/" method="GET"><input type="hidden" name="password_new" value="1234" /><input type="hidden" name="password_conf" value="1234" /><input type="hidden" name="Change" value="Change" /></form></body>
</html>

 效果:用户访问页面那一刻就完成了请求,页面一闪而过,就像跳转一样,背后却是密码被修改。

2. 隐藏在图片标签中(GET 请求时)

<img src="http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change" style="display:none;" />

3. 模拟跳转页面 

<script>// 等待1秒再跳转,模拟正常流程setTimeout(function() {window.location.href = 'https://example.com';}, 1000);
</script>

 配合自动提交表单,造成“访问了一个页面 -> 跳转正常页面”,从而掩盖 CSRF 攻击。

攻击者利用的是:

  • 用户处于已登录状态

  • 浏览器会自动携带 Cookie

  • 请求结构与正常请求无差别;

  • 用户以为只是“点错了广告”或“页面加载了一下”。

三、high级别源码分析

<?php// 判断是否点击了“Change”按钮
if( isset( $_POST[ 'Change' ] ) ) {// 检查 Anti-CSRF 令牌是否匹配(防止伪造请求)if ($_POST['user_token'] == $_SESSION['session_token']) {// 获取用户输入的新密码和确认密码$pass_new  = $_POST[ 'password_new' ];$pass_conf = $_POST[ 'password_conf' ];// 判断两个密码是否一致if( $pass_new == $pass_conf ) {// 密码一致,开始处理// 对新密码进行转义,防止SQL注入$pass_new = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new);// 对密码进行MD5加密(注意:实际应用中不推荐使用MD5)$pass_new = md5( $pass_new );// 构造 SQL 更新语句,修改当前登录用户的密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";// 执行 SQL 更新操作$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );// 修改成功,反馈给用户echo "<pre>Password Changed.</pre>";} else {// 两次密码输入不一致,提示错误echo "<pre>Passwords did not match.</pre>";}} else {// CSRF token 不匹配,提示错误echo "<pre>CSRF token is incorrect</pre>";}
}?>

当前 High 级别 CSRF 防御机制:

  1. 攻击者构造表单时

    • 表单里的 user_token 是攻击者自己从页面里复制下来的(静态)。

    • 这个 token 属于攻击者自己的 session,和受害者无关。

  2. 受害者点击攻击链接时

    • 表单是提交到了 DVWA,但服务器会拿 GET 请求里的 user_token 去和受害者 session 中真正的 token 做对比。

    • 由于两个 token 不一致(攻击者不能预测受害者的 token),校验失败。

    • 最终返回:“That request didn’t look correct.”


也就是说:

DVWA High 级别的防御逻辑可以总结为:

🔒 验证 token 是否和当前 session 匹配,匹配才能执行敏感操作(如改密码)。

所以只要你作为攻击者 无法控制受害者 session 中的 token 值,你就不能完成攻击 ✅


附加说明(常见误区):

误解真相
我复制了token,能不能直接用?❌ 不行,因为那是你自己的,不是受害者的
用户打开了我的页面,是不是能自动提交?✅ 表单可以提交,但服务器不会放行
我伪造Referer或者User-Agent就能骗过吗?❌ 在 High 级别中,主要靠 token 防御,Referer 检查不是核心


可以试试 如何绕过 token 机制(比如通过 XSS 拿 token),这才是后续更高阶的玩法。由于这个已经不是纯粹的csrf了,所以这里不做其他尝试。

四、impossible级别源码分析

if( isset( $_GET[ 'Change' ] ) ) {  // 判断是否点击了“Change”按钮,即URL中是否有Change参数// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  // 校验请求中传入的token与session中的token是否一致,防止CSRF攻击// Get input$pass_curr = $_GET[ 'password_current' ];  // 获取当前密码$pass_new  = $_GET[ 'password_new' ];  // 获取新密码$pass_conf = $_GET[ 'password_conf' ];  // 获取确认的新密码// Sanitise current password input$pass_curr = stripslashes( $pass_curr );  // 去除可能的转义字符$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));  // 对密码进行SQL注入防护,防止恶意代码注入$pass_curr = md5( $pass_curr );  // 将密码进行md5加密// Check that the current password is correct$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );  // 查询数据库,验证当前密码是否正确$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );  // 获取当前用户$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );  // 绑定加密后的当前密码$data->execute();  // 执行查询// Do both new passwords match and does the current password match the user?if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {  // 检查新密码是否一致,且当前密码是否正确// It does!$pass_new = stripslashes( $pass_new );  // 去除新密码中的转义字符$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));  // 对新密码进行SQL注入防护$pass_new = md5( $pass_new );  // 将新密码进行md5加密// Update database with new password$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );  // 更新数据库中的密码$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );  // 绑定新密码$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );  // 绑定当前用户$data->execute();  // 执行密码更新// Feedback for the userecho "<pre>Password Changed.</pre>";  // 密码修改成功的反馈}else {// Issue with passwords matchingecho "<pre>Passwords did not match or current password incorrect.</pre>";  // 密码不匹配或当前密码错误的反馈}
}// Generate Anti-CSRF token
generateSessionToken();  // 生成新的CSRF token并保存在session中,以防下一次攻击

相比于 medium.phpimpossible.php 在防止 CSRF 攻击和增强安全性方面有显著的提升,主要体现在以下几个方面:

1. 引入了 CSRF Token 校验

  • medium.php 中并没有明确验证 CSRF Token。攻击者可以构造恶意请求,只要用户不注意,就可能修改密码。

  • impossible.php 引入了 checkToken() 函数来验证 CSRF Token。每次用户发起请求时,必须携带有效的 user_token(即从用户的 session 中生成并与页面一同呈现的 token)。这样就防止了 CSRF 攻击,因为攻击者无法预测或伪造正确的 CSRF Token

关键代码

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

该函数会比对请求中的 user_token 与当前 session 中存储的 session_token,如果不匹配,则请求会被拒绝。

2. 使用了预处理语句(Prepared Statements)

  • medium.php 通过直接拼接 SQL 查询来更新数据库,虽然使用了 mysqli_real_escape_string() 防止 SQL 注入,但这种做法依然不够安全,因为它易受复杂注入攻击的影响。

  • impossible.php 使用了 PDO 预处理语句来执行数据库操作,提供了更高的 SQL 注入防护,因为它通过绑定参数的方式来避免 SQL 注入风险。并且这种方法更具可扩展性和维护性。

关键代码

$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
$data->execute();

3. 增加了密码确认机制

  • medium.php 仅检查新密码和确认密码是否一致。

  • impossible.php 进一步增加了对 当前密码 的验证,确保用户提供的当前密码是正确的,并且只有在当前密码正确的情况下,才允许更改新密码。

关键代码

$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
$data->execute();

4. 错误处理和反馈更加清晰

  • medium.php 直接打印错误信息或反馈内容,但在一些情况下错误信息可能泄露一些内部系统信息。

  • impossible.php 做了适当的错误处理,向用户提供了更清晰的反馈,区分了不同的错误情况,如密码不匹配或当前密码错误,增强了用户体验和系统的安全性。

5. 密文加密

  • medium.php 中,密码使用 MD5 进行加密,但没有明确提到加盐(Salt)等其他加密增强措施。

  • impossible.php 虽然仍然使用了 MD5 加密(不够安全),但其增加了对输入的字符串的 清洗SQL注入防护,这比 medium.php 的做法要安全一些,尤其是在防止恶意注入方面。

6. 会话令牌(Session Token)管理

  • impossible.php 中,成功修改密码后,生成了新的 CSRF Token,并将其存储在 Session 中。这种机制防止了同一会话中多次提交相同的恶意请求,增强了会话的安全性。

关键代码

generateSessionToken();  // 生成新的CSRF token并保存在session中

总结

impossible.php 相比于 medium.php 增强了安全性,尤其在防止 CSRF 攻击SQL 注入 方面。通过引入 CSRF Token 校验,使用 PDO 预处理语句,以及 当前密码验证,使得该页面更加健壮和安全。虽然依然使用了 MD5 加密算法,理论上仍然可以进一步加强密码存储的安全性(如使用更强的哈希算法,比如 bcrypt),但其加强的防护措施已显著降低了攻击的风险。

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

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

相关文章

【Ansible自动化运维实战:从Playbook到负载均衡指南】

本文是「VagrantVirtualBox虚拟化环境搭建」的续篇&#xff0c;深入探索Ansible在自动化运维中的核心应用&#xff1a; ✅ Ansible核心技能&#xff1a;Playbook编写、角色&#xff08;Roles&#xff09;模块化、标签&#xff08;Tags&#xff09;精准控制 ✅ 实战场景覆盖&a…

基于STM32、HAL库的STC31-C-R3气体传感器驱动程序设计

一、简介: STC31-C-R3是Sensirion公司推出的一款基于CMOSens技术的CO2传感器,具有以下特点: 测量范围:0-100%体积浓度 I2C数字接口 低功耗设计 高精度和长期稳定性 小尺寸封装(5mm x 5mm) 二、硬件接口: STC31-C-R3 STM32L4xx ---------------------------- VDD (P…

Nginx篇之限制公网IP访问特定接口url实操

一、nginx配置限制IP访问 要在 Nginx 配置中添加 IP 限制&#xff0c;阻止来自指定公网 IP 地址段的访问&#xff0c;并且只对特定路径进行限制&#xff0c;可以在 location 配置中使用 deny 和 allow 指令来控制访问。 二、案例 1. 需求 对来自特定公网的地址段&#xff0…

算法研习:无重复字符的最长子串问题剖析

算法研习:无重复字符的最长子串问题剖析 一、引言 在算法的广袤天地中,字符串相关问题一直是备受关注的焦点。“无重复字符的最长子串”这一问题,不仅在面试中频繁出现,更是对算法思维和编程技巧的一次深度考验。它要求我们从给定字符串中找出不含有重复字符的最长子串的长…

Spring Cloud Gateway路由+断言+过滤

目录 介绍核心功能三大核心Route以服务名动态获取URLPredicate常用断言Path Route PredicateAfter Route PredicateBefore Route PredicateBetween Route PredicateCookie Route PredicateHeader Route PredicateHost Route PredicateQuery Route PredicateRemoteAddr Route Pr…

springboot集成langchain4j记忆对话

流式输出 LLM 一次生成一个标记&#xff08;token&#xff09;&#xff0c;因此许多 LLM 提供商提供了一种方式&#xff0c;可以逐个标记地流式传输响应&#xff0c;而不是等待整个文本生成完毕。 这显著改善了用户体验&#xff0c;因为用户不需要等待未知的时间&#xff0c;几…

【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案

一、背景 今天业务方调用我们的网关服务报错: Connection prematurely closed BEFORE response二、原因分析 三、解决方案 第一步: 增加 SCG 服务的JVM启动参数,调整连接获取策略。 将连接池获取策略由默认的 FIFO&#xff08;先进先出&#xff09;变更为 LIFO&#xff08…

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第十一讲)

这一期讲解lvgl中下拉框的基础使用&#xff0c;下拉列表允许用户从选项列表中选择一个值&#xff0c;下拉列表的选项表默认是关闭的&#xff0c;其中的选项可以是单个值或预定义文本。 当单击下拉列表后&#xff0c;其将创建一个列表&#xff0c;用户可以从中选择一个选项。 当…

【神经网络与深度学习】VAE 在解码前进行重参数化

在 VAE 中&#xff0c;解码之前进行重参数化主要有以下几个重要原因&#xff1a; 可微分性 在深度学习里&#xff0c;模型是通过反向传播算法来学习的&#xff0c;而这需要计算梯度。若直接从潜在变量的分布 (q_{\theta}(z|x))&#xff08;由编码器输出的均值 (\mu) 和方差 (…

BBDM学习笔记

1. configs 1.1 LBBDM: Latent BBDM [readme]

mysql主从复制搭建,并基于‌Keepalived + VIP实现高可用

以下是基于 ‌Keepalived VIP‌ 实现 MySQL 主从复制高可用的详细步骤&#xff0c;涵盖主从复制搭建与故障自动切换&#xff1a; 一、MySQL 主从复制搭建&#xff08;基础步骤回顾&#xff09; 1. ‌主库&#xff08;Master&#xff09;配置‌ 修改配置文件‌ /etc/my.cnf&…

CD36.【C++ Dev】STL库的string的使用 (下)

目录 1.reserve函数(不是reverse) 代码示例 2.resize 代码示例 3.reserve和resize的区别 4.shrink_to_fit 代码示例 5.与C语言的配合的接口函数: c_str 代码示例 6.rfind 知识回顾:find函数 rfind 代码示例 练习题: 字符串最后一个单词的长度 代码 提交结果 ​…

STM32的网络天气时钟项目

一、项目概述与硬件架构 1.1 核心功能 本智能天气时钟系统集成了实时天气获取、网络时间同步、环境监测和低功耗管理四大核心功能&#xff1a; 网络数据获取&#xff1a; 通过ESP8266 WiFi模块连接心知天气API&#xff08;每小时更新&#xff09;获取北京标准时间服务器的时…

FPGA DDR4多通道管理控制器设计

DDR4控制器一般采用自带的MIG控制器&#xff0c;用户控制主要是基于MIG IP核进行设计 实际工程项目中可能只挂载了一组DDR&#xff0c;但是用户数据可能有很多种&#xff0c;用户通过给每种数据划分特定地址进行存储&#xff0c;如何实现灵活管理成为设计的关键 为了方便后端数…

低代码 x AI,解锁数智化应用的创新引擎

AI 智能体开发指南 随着全球信息化浪潮的持续推进&#xff0c;数字化、智能化转型已成为企业发展的必经之路。在这个变革的时代&#xff0c;企业面临着前所未有的挑战与机遇。一方面&#xff0c;市场环境瞬息万变&#xff0c;企业需要快速响应并调整业务模式&#xff1b;另一方…

【Spring Boot 注解】@Configuration与@AutoConfiguration

文章目录 Configuration与AutoConfiguration一、Configuration二、AutoConfiguration Configuration与AutoConfiguration 一、Configuration 这是最常用的 Spring 注解之一&#xff0c;表示当前类是一个 配置类&#xff0c;可以定义 Bean 方法&#xff0c;等效于传统的 XML 配…

arXiv论文 MALOnt: An Ontology for Malware Threat Intelligence

文章讲恶意软件威胁情报本体。 作者信息 作者是老美的&#xff0c;单位是伦斯勒理工学院&#xff0c;文章是2020年的预印本&#xff0c;不知道后来发表在哪里&#xff08;没搜到&#xff0c;或许作者懒得投稿&#xff0c;也可能是改了标题&#xff09;。 中心思想 介绍开源…

【存储管理—动态不等长存储资源分配算法】

文章目录 一、实验目的二、实验内容与设计思想实验内容设计思路 三、实验代码实现四、总结 一、实验目的 理解动态异长存储分区资源管理&#xff0c;掌握所需数据结构和管理程序&#xff0c;了解各种存储分配算法的优点和缺点。 二、实验内容与设计思想 实验内容 1.分析uni…

快速上手 Docker:从入门到安装的简易指南(Mac、Windows、Ubuntu)

PS&#xff1a;笔者在五一刚回来一直搞Docker部署AI项目&#xff0c;发现从开发环境迁移到生成环境时&#xff0c;Docker非常好用。但真的有一定上手难度&#xff0c;推荐读者多自己尝试踩踩坑。 本篇幅有限&#xff0c;使用与修改另起篇幅。 一、Docker是什么 #1. Docker是什…

LabVIEW高冲击加速度校准系统

在国防科技领域&#xff0c;高 g 值加速度传感器广泛应用于先进兵器研制&#xff0c;如深侵彻系统、精确打击弹药及钻地弹药等。其性能指标直接影响研究结果的准确性与可靠性&#xff0c;因此对该传感器进行定期校准意义重大。高冲击加速度校准系统具备多方面功能&#xff0c;适…