首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Linux 下隱藏 MySQL 命令行密碼的 C 語言實現方案

     編輯:MySQL 綜合教學

Linux 下隱藏 MySQL 命令行密碼的 C 語言實現方案

在命令行直接輸入 MySQL 密碼(如 mysql -u root -p'password')會導致密碼在進程列表(ps -ef)中明文可見,構成嚴重安全風險。本文介紹一種利用 C 語言覆寫 argv 參數內存,實現運行時隱藏命令行密碼的技術方案,原理同 MySQL 官方客戶端一致。

核心原理

  • 程式啟動時,密碼作為 argv[1] 存儲在進程內存中
  • 利用 memset() 將密碼字元逐個覆寫為 'x'(或任意字元)
  • 進程保持運行狀態(getc(stdin) 阻塞),此時 ps 顯示已被遮蔽
  • 關鍵點:重寫 argv 內存區域,而非修改環境變數

完整 C 代碼實現

#include 
#include 
#include 
#include 

int main(int argc, char *argv[]) {
    int i = 0;
    pid_t mypid = getpid();

    // 參數檢查:至少需要程式名 + 1 個參數(密碼)
    if (argc == 1) {
        return 1;  // 異常退出
    }

    printf("argc = %d and arguments are:\n", argc);
    for (i = 0; i < argc; i++) {
        printf("%d = %s\n", i, argv[i]);
    }
    printf("Replacing first argument with x's... Now open another terminal and run: ps p %d\n", (int)mypid);

    fflush(stdout);  // 清空緩衝區,確保輸出可見

    // 核心邏輯:用 'x' 覆蓋 argv[1](密碼)的每個字元
    memset(argv[1], 'x', strlen(argv[1]));

    // 阻塞等待鍵盤輸入,保持進程存活以便觀察 ps 輸出
    getc(stdin);

    return 0;
}

編譯與測試步驟

1. 建立源文件並編譯

# 切換至普通用戶(模擬非 root 環境)
su - dabu
cd ~
touch pwhide.c
# 將上述代碼寫入 pwhide.c

gcc -o hide pwhide.c
ls  # 顯示 hide pwhide.c

2. 運行測試程式

./hide dabu.info
# 輸出:
# argc = 2 and arguments are:
# 0 = ./hide
# 1 = dabu.info
# Replacing first argument with x's... Now open another terminal and run: ps p 15585

此時程式阻塞於 getc(stdin),**不要關閉終端、不要按鍵**。

3. 另開終端驗證隱藏效果

# 以 root 或其他用戶登入
ps p 15585  # 使用上一步顯示的 PID

# 輸出:
# PID TTY STAT TIME COMMAND
# 15585 pts/0 S+ 0:00 ./hide xxxxxxxxx  # 9 個 'x' 對應 'dabu.info' 9 字元

應用到 MySQL 客戶端

MySQL 官方客戶端(mysql)採用相同機制:

  • 啟動時解析命令行參數
  • 識別密碼參數後,立即用 memset() 覆寫對應 argv 區域
  • 此後 ps aux | grep mysql 僅顯示 xxxxxxxx

跨平台考量

安全最佳實踐建議

  1. 優先使用配置文件:[client] password=xxx 在 ~/.my.cnf(權限 600)
  2. 使用 --defaults-extra-file:指定專用配置文件路徑
  3. 環境變數傳遞:MYSQL_PWD(注意進程環境變數同樣可被 cat /proc/PID/environ 讀取)
  4. 交互式輸入:僅輸入 -p 不帶值,提示時手動輸入(最安全)
  5. 應用層連接池:避免腳本中硬編碼密碼

理解 argv 覆寫機制,不僅能解釋 MySQL 為何能隱藏密碼,也為開發需處理敏感參數的命令行工具提供了可復用的技術模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
平台方案
Linux重寫 argv(本文方案)
FreeBSD / macOSsetproctitle() 系統調用
WindowsSetConsoleTitle() / 進程參數區塊修改