• 奇淫巧技之程序启动后在进程列表中隐藏密码等关键信息


    最近读了下mongodb的源码。

    这个过程中,发现了一个很有意思的代码段,即程序启动后,如何在进程列表中隐藏敏感信息如密码的处理。

    先说下使用场景:

    mongodb支持服务端js脚本,所以我们写了一些服务端js脚本比如检查复制集状态之类。

    这样,我们可以使用“mongo ip:port/dbname /path/test.js”这种方式来执行服务端js。

    但是mongodb复制集初始化之后,我们又加了账号认证。在不登录的情况下,肯定是没法执行的。

    所以最终命令变成了这个样子:

    mongo ip:port/dbname -u user -p password /path/test.js

    mongo在使用过程中,必然会在进程列表中打印上面的帐号密码。但是在使用过程中,我们看到,实际上mongo对应的进程列表中,密码字段是一堆的“x”。感觉很神奇,后面看了mongodb的源码之后才发现,原来这是mongo客户端入口处做了特殊的处理,属于一种“奇淫巧技”。

    先直接上代码:

     

    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的这种处理方式很有创意,但是还是有失效时候。后面的文章我会再介绍,今天先写到这里。

  • 相关阅读:
    将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
    placeholder的兼容处理(jQuery下)
    滚动条滚动到页面底部继续加载的处理实例
    html/css基础篇——html代码编写过程中的几个警惕点
    多iframe使用tab标签方式添加、删除、切换的处理实例
    iframe的内容增高或缩减时设置其iframe的高度的处理方案
    IE9父容器overflow:auto时,子容器状态更改导致滚动条下出现额外空间的问题探讨
    C语言基本类型之long long int
    VIM使用技巧总结
    Ineedle驱动方式dpdk测试性能
  • 原文地址:https://www.cnblogs.com/leipei2352/p/5428544.html
Copyright © 2020-2023  润新知