最近讀了下mongodb的源碼。mongodb
這個過程當中,發現了一個頗有意思的代碼段,即程序啓動後,如何在進程列表中隱藏敏感信息如密碼的處理。數組
先說下使用場景:ide
mongodb支持服務端js腳本,因此咱們寫了一些服務端js腳本好比檢查複製集狀態之類。函數
這樣,咱們可使用「mongo ip:port/dbname /path/test.js」這種方式來執行服務端js。spa
可是mongodb複製集初始化以後,咱們又加了帳號認證。在不登陸的狀況下,確定是無法執行的。命令行
因此最終命令變成了這個樣子:指針
mongo ip:port/dbname -u user -p password /path/test.jsorm
mongo在使用過程當中,必然會在進程列表中打印上面的賬號密碼。可是在使用過程當中,咱們看到,實際上mongo對應的進程列表中,密碼字段是一堆的「x」。感受很神奇,後面看了mongodb的源碼以後才發現,原來這是mongo客戶端入口處作了特殊的處理,屬於一種「奇淫巧技」。進程
先直接上代碼:ip
int _main(int argc, char* argv[], char** envp) {
省略中間一些代碼內容
// hide password from ps output
for (int i = 0; i < (argc - 1); ++i) {
if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--password")) {
char* arg = argv[i + 1];
while (*arg) {
*arg++ = 'x';
}
}
}
二進制可執行程序,一般均可以接收外部參數,在入口處都會傳一個argc表示命令行的參數個數,一個argv的參數列表數組(字符指針數組)傳入具體的參數。
mongo在啓動中,賬號密碼字段就經過argv傳給了程序。
由於參數列表數組的內容不是常量,能夠修改。因此,mongo在檢測到了到了若是參數列表中有密碼字段(密碼是經過-p password 或者—password password格式傳入的,因此能夠檢查參數列表中有沒有「-p」或者 「—password」),就把密碼中每一個字符修改成「x」。
這樣,最終在進程列表中查詢的時候,天然密碼部分就是一堆的」x」了。
總結:本篇講的在進程列表中隱藏密碼關鍵信息的方式是修改main函數入參.
雖然mongo的這種處理方式頗有創意,可是仍是有失效時候。後面的文章我會再介紹,今天先寫到這裏。