DVWA靶場通關筆記-驗證碼繞過reCAPTCHA(High級別)

目錄

一、reCAPTCHA

二、代碼審計(High級別)

1、滲透準備

(1)配置security為High級別。

(2)配置RECAPTCHA參數

(3)再次打開靶場

2、源碼分析

(1)index.php

(2)High.php

(3)功能函數

(4)總結

三、滲透實戰

1、滲透方法一

(1)源碼修改

(2)點擊change

2、滲透方法二

(1)源碼修改

(2)修改密碼

(3)bp改包


本系列為通過《DVWA靶場通關筆記》的reCAPTCHA關卡(low,medium,high,impossible共4關)滲透集合,通過對相應關卡源碼的代碼審計找到講解滲透原理并進行滲透實踐,本文為reCAPTCHA關卡High級別關卡的滲透部分。

一、reCAPTCHA

reCAPTCHA關卡模擬了網站驗證碼系統的實現,在通過繞過驗證碼的安全驗證來實現密碼修改等操作,不同安全等級存在不同的安全風險和繞過方法,本小節對高等級別的關卡進行滲透實戰。

二、代碼審計(High級別)

1、滲透準備

(1)配置security為High級別。

進入到reCAPTCHA關卡High頁面,完整URL地址具體如下所示。

http://127.0.0.1/DVWA/vulnerabilities/captcha/

(2)配置RECAPTCHA參數

進入到DVWA的config目錄,如下所示找到config.inc.php文件。

修改config.inc.php文件中如下內容,雖然在RECAPTCHA關卡的頁面提示api-key需要通過https://www.google.com/recaptcha/admin/create生成,但是實際上這部分可以填充為自己的內容,如下所示。

$_DVWA[ 'recaptcha_public_key' ]? = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMOOYUAN';
$_DVWA[ 'recaptcha_private_key' ] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMOOYUAN';

修改后效果如下所示,記得修改后保存文件。

(3)再次打開靶場

如下所示,更新config.inc.php文件后,靶場可以正常打開,這是一個具有修改密碼功能的頁面。

2、源碼分析

(1)index.php

進入DVWA靶場源目錄,找到index.php源碼。

這段代碼實現了?DVWA (Damn Vulnerable Web Application)?中的reCAPTCHA關卡的演示頁面,主要功能包括:DVWA的Insecure CAPTCHA模塊通過四個安全等級(低、中、高、不可能)演示驗證碼系統的安全演進,該模塊核心展示密碼修改場景下的驗證碼實現,包含密鑰檢查、表單動態生成(根據等級顯示不同字段)和安全警告提示,如客戶端驗證繞過、驗證碼重復使用等問題,并通過對比不同等級的實現差異,直觀呈現從脆弱到安全的演進過程,最終強調應使用專業驗證服務(如reCAPTCHA)配合多因素驗證的整體防護思路。

  • 初始化與安全級別處理
    • 設置頁面路徑和安全依賴。
    • 根據用戶安全級別(低、中、高、不可能)加載不同的驗證碼實現。
  • 驗證碼配置檢查
    • 驗證是否配置了 reCAPTCHA API 密鑰。
    • 若未配置則顯示警告并隱藏表單。
  • 表單構建
    • 生成密碼修改表單,包含當前密碼(僅 "不可能" 級別)、新密碼和確認密碼字段。
    • 根據安全級別不同,集成不同的驗證碼機制(低級、中級、高級和不可能四個級別)。
  • 安全措施
    • "高" 和 "不可能" 級別包含 CSRF 令牌保護。
    • "不可能" 級別增加了當前密碼驗證。

經過注釋后的詳細代碼如下所示。

<?php
/*** DVWA Insecure CAPTCHA 演示頁面* 演示不同安全等級下的驗證碼實現方式及潛在安全風險*/// 定義網站根目錄路徑
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );// 引入必要的庫文件
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';          // DVWA核心頁面庫
require_once DVWA_WEB_PAGE_TO_ROOT . "external/recaptcha/recaptchalib.php";    // reCAPTCHA庫// 初始化頁面,要求認證并啟用PHPIDS防護
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 創建新頁面對象
$page = dvwaPageNewGrab();
// 設置頁面標題
$page[ 'title' ]   = 'Vulnerability: Insecure CAPTCHA' . $page[ 'title_separator' ].$page[ 'title' ];
// 設置頁面ID
$page[ 'page_id' ] = 'captcha';
// 設置幫助按鈕
$page[ 'help_button' ]   = 'captcha';
// 設置源代碼查看按鈕
$page[ 'source_button' ] = 'captcha';// 連接數據庫
dvwaDatabaseConnect();// 根據安全等級選擇對應的實現文件
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {case 'low':      // 低安全等級$vulnerabilityFile = 'low.php';break;case 'medium':   // 中安全等級$vulnerabilityFile = 'medium.php';break;case 'high':     // 高安全等級$vulnerabilityFile = 'high.php';break;default:        // 默認(不可能等級)$vulnerabilityFile = 'impossible.php';break;
}// 控制表單是否顯示
$hide_form = false;
// 引入對應的實現文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/captcha/source/{$vulnerabilityFile}";// 檢查reCAPTCHA密鑰配置
$WarningHtml = '';
if( $_DVWA[ 'recaptcha_public_key' ] == "" ) {$WarningHtml = "<div class=\"warning\"><em>reCAPTCHA API key missing</em> from config file: " . realpath( getcwd() . DIRECTORY_SEPARATOR . DVWA_WEB_PAGE_TO_ROOT . "config" . DIRECTORY_SEPARATOR . "config.inc.php" ) . "</div>";$html = "<em>Please register for a key</em> from reCAPTCHA: " . dvwaExternalLinkUrlGet( 'https://www.google.com/recaptcha/admin/create' );$hide_form = true;  // 密鑰缺失時隱藏表單
}// 構建頁面主體HTML
$page[ 'body' ] .= "
<div class=\"body_padded\"><h1>Vulnerability: Insecure CAPTCHA</h1>{$WarningHtml}<div class=\"vulnerable_code_area\"><form action=\"#\" method=\"POST\" ";// 密鑰缺失時隱藏表單
if( $hide_form )$page[ 'body' ] .= "style=\"display:none;\"";$page[ 'body' ] .= "><h3>Change your password:</h3><br /><input type=\"hidden\" name=\"step\" value=\"1\" />\n";// 不可能等級需要驗證當前密碼
if( $vulnerabilityFile == 'impossible.php' ) {$page[ 'body' ] .= "Current password:<br /><input type=\"password\" AUTOCOMPLETE=\"off\" name=\"password_current\"><br />";
}$page[ 'body' ] .= "            New password:<br /><input type=\"password\" AUTOCOMPLETE=\"off\" name=\"password_new\"><br />Confirm new password:<br /><input type=\"password\" AUTOCOMPLETE=\"off\" name=\"password_conf\"><br />" . recaptcha_get_html( $_DVWA[ 'recaptcha_public_key' ] );  // 插入reCAPTCHA組件// 高安全等級下的開發者注釋提示
if( $vulnerabilityFile == 'high.php' )$page[ 'body' ] .= "\n\n            <!-- **DEV NOTE**   Response: 'hidd3n_valu3'   &&   User-Agent: 'reCAPTCHA'   **/DEV NOTE** -->\n";// 高和不可能等級添加CSRF令牌
if( $vulnerabilityFile == 'high.php' || $vulnerabilityFile == 'impossible.php' )$page[ 'body' ] .= "\n            " . tokenField();$page[ 'body' ] .= "<br /><input type=\"submit\" value=\"Change\" name=\"Change\"></form>{$html}  <!-- 顯示操作結果 --></div><h2>More Information</h2><ul><li>" . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/CAPTCHA' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.google.com/recaptcha/' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Testing_for_Captcha_(OWASP-AT-012)' ) . "</li></ul>
</div>\n";// 輸出完整HTML頁面
dvwaHtmlEcho( $page );?>

(2)High.php

進入DVWA靶場源目錄,找到High.php源碼。

打開源碼High.php,

打開源碼High.php,分析可知這段代碼實現了實現了帶有?CSRF?保護和?CAPTCHA?驗證的密碼更改功能,主要過程如下所示:

  • 增加了Anti-CSRF令牌防護(特別注意:由于本關卡這部分是亂填的,且會向https://www.google.com/recaptcha/api/siteverify提交請求,這個網站目前無法響應,故需注釋掉這部分驗證,否則沒法向下繼續走,但是相對于low和meidium關卡,本次沒有必要強制設置$resp=1,默認情況下$resp=0)。
  • 使用reCAPTCHA進行人機驗證
  • 需要驗證當前密碼
  • 使用PDO預處理語句防止SQL注入
  • 對密碼進行MD5加密存儲
  • 包含輸入清理和驗證

詳細注釋后的代碼如下所示。?

<?php// 檢查是否是密碼修改請求
if( isset( $_POST[ 'Change' ] ) ) {// 1. 首先檢查Anti-CSRF令牌,防止跨站請求偽造攻擊checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 隱藏表單,準備顯示結果$hide_form = true;// 2. 獲取并處理新密碼輸入$pass_new  = $_POST[ 'password_new' ];$pass_new  = stripslashes( $pass_new );  // 去除反斜線// 轉義特殊字符防止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)) ? "" : ""));$pass_new  = md5( $pass_new );  // MD5哈希(注:不夠安全)// 3. 獲取并處理確認密碼$pass_conf = $_POST[ 'password_conf' ];$pass_conf = stripslashes( $pass_conf );$pass_conf = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_conf ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_conf = md5( $pass_conf );// 4. 獲取并處理當前密碼$pass_curr = $_POST[ 'password_current' ];$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)) ? "" : ""));$pass_curr = md5( $pass_curr );// 5. 檢查CAPTCHA驗證//$resp = recaptcha_check_answer(//$_DVWA[ 'recaptcha_private_key' ],  // reCAPTCHA私鑰//$_POST['g-recaptcha-response']     // 用戶輸入的驗證碼//);// CAPTCHA驗證失敗處理if( !$resp ) {$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;return;}else {// 6. 驗證當前密碼是否正確(使用PDO預處理語句)$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();// 7. 檢查:新密碼是否匹配且當前密碼正確if( ( $pass_new == $pass_conf) && ( $data->rowCount() == 1 ) ) {// 8. 更新密碼(使用PDO預處理語句)$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();// 9. 顯示成功信息$html .= "<pre>Password Changed.</pre>";}else {// 10. 顯示失敗信息(當前密碼錯誤或新密碼不匹配)$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}}
}// 11. 生成新的Anti-CSRF令牌供下次使用
generateSessionToken();?>

(3)功能函數

根據如下代碼可知,CheckCaptcha函數會像谷歌https://www.google.com/recaptcha/api/siteverify進行請求,CheckCaptcha和recaptcha_get_html函數的定義如下所示。

<?php/*** 驗證碼驗證函數(兼容舊版API)* * @param string $key 私鑰* @param string $response 用戶提交的驗證碼響應* @return bool|NULL 驗證成功返回true,失敗返回false,異常返回NULL*/
function recaptcha_check_answer($key, $response){return CheckCaptcha($key, $response);
}/*** 發送HTTP請求驗證驗證碼* * @param string $key 私鑰* @param string $response 用戶提交的驗證碼響應* @return bool|NULL 驗證成功返回true,失敗返回false,異常返回NULL*/
function CheckCaptcha($key, $response) {try {// Google reCAPTCHA驗證API地址$url = 'https://www.google.com/recaptcha/api/siteverify';// 準備POST數據$dat = array('secret'   => $key,                 // 網站私鑰'response' => urlencode($response), // 用戶響應(由前端生成)'remoteip' => urlencode($_SERVER['REMOTE_ADDR']) // 用戶IP地址);// 配置HTTP請求選項$opt = array('http' => array('header'  => "Content-type: application/x-www-form-urlencoded\r\n",'method'  => 'POST','content' => http_build_query($dat) // 生成POST數據));// 創建HTTP上下文并發送請求$context = stream_context_create($opt);$result  = file_get_contents($url, false, $context);// 解析JSON響應并返回驗證結果return json_decode($result)->success;} catch (Exception $e) {// 發生異常時返回NULLreturn null;}
}/*** 生成前端驗證碼HTML代碼* * @param string $pubKey 公鑰* @return string HTML代碼片段*/
function recaptcha_get_html($pubKey){return "<script src='https://www.google.com/recaptcha/api.js'></script><br /> <div class='g-recaptcha' data-theme='dark' data-sitekey='" . $pubKey . "'></div>";
}?>

?三個函數功能詳解,如下所示。

  • recaptcha_check_answer
    • 功能:驗證用戶提交的驗證碼是否有效(兼容舊版 API)。
    • 流程:直接調用CheckCaptcha函數進行驗證。
    • 安全作用:作為入口函數提供向后兼容性。
  • CheckCaptcha
    • 功能:向 Google 服務器發送驗證請求并處理響應。
    • 流程
      • 構建 POST 請求參數(私鑰、用戶響應、IP 地址)。
      • 配置 HTTP 請求上下文(設置請求頭、方法和內容)。
      • 發送請求到 Google 驗證 API。
      • 解析 JSON 響應并提取驗證結果。
    • 安全作用:核心驗證邏輯,防止 CSRF 攻擊和機器人自動化操作。
  • recaptcha_get_html
    • 功能:生成前端驗證碼 UI 組件。
    • 流程
      • 引入 Google reCAPTCHA JavaScript 庫。
      • 創建帶有公鑰的驗證碼容器(暗色主題)。
    • 安全作用:在頁面中正確渲染驗證碼組件,確保用戶交互。

(4)總結

相對而言,本關卡的判斷如下所示。

if ( $resp || ( $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' )

有兩種方法:

  • 其一為resp=1,即通過token驗證
  • 其二為g-recaptcha-response參數為'hidd3n_valu3'且HTTP_USER_AGENT參數為'reCAPTCHA'

三、滲透實戰

1、滲透方法一

(1)源碼修改

將resp=1,模擬通過token驗證的情況,如下所示。

(2)點擊change

bp設置攔截報文,進入靶場并將密碼改為123,如下所示。

http://127.0.0.1/DVWA/vulnerabilities/captcha/

此時bursuite抓包,發現step=1,報文如下所示。

此時頁面也變為如下形式,提示“Password Changed.”,具體如下所示。

很明顯修改密碼相對于前兩個關卡(low級別和medium級別有兩個step報文),本high關卡只有1個報文(step1),接下來我們將這個報文發送到repeater如下所示。?

在repeater中,通過修改如下紅框中的密碼0000來進行滲透。

2、滲透方法二

(1)源碼修改

需要配置g-recaptcha-response參數為'hidd3n_valu3'且HTTP_USER_AGENT參數為'reCAPTCHA'

(2)修改密碼

bp設置攔截報文,進入靶場http://127.0.0.1/DVWA/vulnerabilities/captcha/,將密碼改為321,如下所示。

點擊修改,頁面提示修改失敗,這是因為“( $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' )判斷失敗”,具體如下所示。

burpsuite抓包,報文顯示如下所示,很明顯post參數缺少g-recaptcha-response=hidd3n_valu3,而useragent需要配置為reCAPTCHA。接下來我們將報文發送到repeater,如下圖所示。

(3)bp改包

報文發送到repeater模塊如下所示。

將密碼修改為1234,同時POST增加參數g-recaptcha-response=hidd3n_valu3,useragent修改為reCAPTCHA,點擊發送,如下所示密碼修改成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88066.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java安全】RMI基礎

文章目錄介紹實現服務端 Server客戶端 Client通信過程數據端與注冊中心(1099 端口)建立通訊客戶端與服務端建立 TCP 通訊客戶端序列化傳輸 調用函數的輸入參數至服務端總結介紹 RMI 全稱 Remote Method Invocation&#xff08;遠程方法調用&#xff09;&#xff0c;即在一個 J…

MySQL索引面試問題梳理

本文系統剖析MySQL索引的核心機制&#xff1a; ?索引分類全景圖?&#xff1a;詳解聚簇/非聚簇索引的邏輯差異與物理存儲特點?B樹的統治性優勢?&#xff1a;通過對比Hash/B樹揭示InnoDB的底層選擇邏輯 一、索引分類的常見困惑解析 1. 按物理存儲分類 類型 存儲內容 數量限…

SSH密鑰 與 Ed25519密鑰 是什么關系

SSH 密鑰與 Ed25519 密鑰的關系可以從技術實現和應用場景兩個角度理解。簡而言之&#xff1a;Ed25519 密鑰是 SSH 密鑰的一種類型&#xff0c;用于在 SSH 協議中實現安全認證。以下是詳細解釋&#xff1a; 1. SSH 密鑰的通用概念 SSH&#xff08;Secure Shell&#xff09;是一…

【PyTorch 當前版本不支持 NVIDIA GeForce RTX 5060 Ti處理辦法】

報錯信息 X:\Stable-Diffusion-WebUI\system\python\lib\site-packages\torch\cuda\__init__.py:215: UserWarning: NVIDIA GeForce RTX 5060 Ti with CUDA capability sm_120 is not compatible with the current PyTorch installation. The current PyTorch install supports…

Docker部署PaddleX實現PaddleOcr

Docker部署PaddleX實現PaddleOcr 一、版本說明二、安裝PaddleX三、基礎服務化部署四、接口調用實現表格識別五、調參優化一、版本說明 PaddleX 3.0Ubuntu20.04.1Docker version 26.1.3, build 26.1.3-0ubuntu1~20.04.1二、安裝PaddleX 查看服務器信息 docker安裝PaddleX 根據 …

深入學習c++之---AVL樹

VL樹簡介? AVL樹是一種自平衡二叉搜索樹&#xff0c;通過平衡因子&#xff08;Balance Factor, BF&#xff09;?和旋轉操作&#xff0c;確保樹始終保持平衡&#xff0c;避免退化成鏈表&#xff0c;從而保證查找、插入、刪除的時間復雜度穩定在 ?O(log n)?。 ?核心特點?…

【PTA數據結構 | C語言版】輸出 1 ~ n

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 給定正整數 n&#xff0c;輸出 1 ~ n&#xff0c;每個數字占一行。 本題旨在測試不同的算法在各種數據情況下的表現。各組測試數據特點如下&#xff1a; 數據 0&#xff1a;測試基本正確性&#x…

如何禁止用戶復制頁面內容?

某些特定的業務場景下&#xff0c;我們可能會有禁止用戶復制頁面內容的需求。比如&#xff1a; 付費內容保護&#xff1a;在線小說、付費課程等&#xff0c;希望防止內容被輕易拷貝和傳播。試卷或答題系統&#xff1a;防止考生將題目復制出去尋求場外幫助。敏感信息展示&#x…

React + PDF.js 預覽 PDF 文件:從基礎實現到高級優化的完整指南

關鍵點 PDF.js&#xff1a;Mozilla 開發的開源 JavaScript 庫&#xff0c;用于在瀏覽器中渲染 PDF 文件。React 集成&#xff1a;結合 React 組件化特性&#xff0c;實現高效、交互式的 PDF 預覽功能。功能實現&#xff1a;支持 PDF 文件加載、頁面導航、縮放、搜索、書簽和注…

新能源汽車BMS電感產品應用及選型推薦

在新能源電動汽車中&#xff0c;BMS&#xff08;電池管理系統&#xff09;如同一個守護者&#xff0c;默默守護電池的安全與性能。它精準監控電壓、電流、溫度&#xff0c;防止過充過放&#xff0c;并通過智能均衡技術提升續航能力。電感在BMS系統的電源轉換、濾波和隔離通信等…

【機器學習筆記 Ⅱ】12隨機森林

隨機森林&#xff08;Random Forest&#xff09;詳解 隨機森林是一種基于集成學習&#xff08;Ensemble Learning&#xff09;的高性能分類/回歸算法&#xff0c;通過構建多棵決策樹并綜合其預測結果&#xff0c;顯著提升模型的準確性和魯棒性。其核心思想是“集體智慧優于個體…

問題 1:MyBatis-plus-3.5.9 的分頁功能修復

問題 1&#xff1a;MyBatis-plus-3.5.9 的分頁功能修復 使用 Sw?agger 接口文檔?依次對上述接口進行測 試&#xff0c;發現 listU?serVOByPage 接口有一些問題&#xff01; 分頁好像沒有生效&#xff0c;還是查出了全部數據&#xff1a; 由于我們用的是 MyBatis Plus 來操…

Qt 如何提供在線幫助

Qt 如何提供在線幫助一、概述二、工具提示、狀態提示和"Whats This?"幫助1、工具提示(Tool Tips)添加工具提示到控件富文本工具提示全局工具提示設置延遲顯示控制自定義工具提示窗口禁用工具提示工具提示與狀態欄聯動特點&#xff1a;2、狀態提示(Status Tips)3、&q…

Typecho站點關閉插件開發全指南:從原理到實現

文章目錄 開發Typecho站點關閉插件:從原理到實現一、背景與需求分析二、插件設計思路2.1 技術選型2.2 功能模塊設計三、插件開發實現3.1 插件基礎結構3.2 插件主文件實現3.3 核心功能實現3.4 后臺管理界面3.5 關閉頁面模板四、插件配置完善4.1 配置表單實現4.2 定時任務處理五…

詳細解析 .NET 依賴注入的三種生命周期模式

文章目錄一、Transient&#xff08;瞬時生命周期&#xff09;原理使用方式核心特性適用場景優勢劣勢二、Scoped&#xff08;作用域生命周期&#xff09;原理使用方式核心特性適用場景優勢劣勢三、Singleton&#xff08;單例生命周期&#xff09;原理使用方式核心特性適用場景優…

軟件工程經濟與倫理

前言 各位帥哥美女&#xff0c;能看到這篇博客的都有口福了&#xff0c;學習這門課程就像遨游在大份的海洋&#xff0c;一不小心就吃上一口。能看到這篇博客說明我們是有緣人可以點贊收藏一下&#xff0c;這篇博客可以在你無比饑餓的時候給你送上一坨&#xff01;&#xff08;香…

AI 體驗走查 - 火山引擎存儲的 AI UX 探索之路

01 概述 火山引擎存儲技術團隊驅動 AI 自主完成用戶體驗走查 / 可用性測試的執行與評價&#xff0c;幫助業務改善交互體驗。 立項“故事走查”的背景訴求和 AI 機遇 如何搭建“AI 評價”能力&#xff0c;精準識別交互問題 讓交互體驗故事走查變為技術產品&#xff0c;講解系…

【世紀龍科技】汽車零部件檢驗虛擬實訓室-助力汽車職教實訓

在汽車產業加速向電動化、智能化轉型的背景下&#xff0c;職業院校汽車專業教學面臨新的挑戰&#xff1a;傳統實訓受限于設備數量不足、操作風險高、標準化程度低等問題&#xff0c;導致學生實踐機會有限&#xff0c;技能掌握不扎實。如何讓學生在有限資源下高效掌握零部件檢驗…

MySQL常用操作 查看表描述以及表結構、連接數及緩存和性能指標

查看表描述以及表結構查看數據庫名SHOW DATABASES; SELECT DATABASE(); SELECT DATABASE() AS current_database;查看數據庫中表的列表SHOW TABLES; SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA your_database_name; SELECT TABLE_NA…

音視頻學習(三十六):websocket協議總結

概述項目描述標準RFC 6455使用端口默認 80&#xff08;ws&#xff09;&#xff0c;443&#xff08;wss&#xff09;基于協議TCP特性全雙工、低開銷、持久連接、可穿透代理特點 全雙工通信&#xff1a; WebSocket 允許客戶端和服務器之間建立一個持久的連接&#xff0c;并且數據…