3

用 c++ 编写程序,我想从 system() 函数发出系统命令,但我不希望用户在可执行窗口中看到命令(因为命令包含密码)。我需要将用户目录中的文件复制到服务器上,而不允许用户访问服务器或显示密码。认为拥有执行此操作的 .exe 是最简单的方法。

前任:

system("FILETRANSFER_SW.exe -pw helloWORLD11!@ C:/temp.txt F:/tempfolder/")

但可执行窗口显示此命令,因此无法达到隐藏密码的目的。

我尝试在程序开头发出 system("@echo OFF") 但这不会抑制以下命令,它们仍然显示在可执行窗口中。

有什么建议么?

谢谢...

4

4 回答 4

8

在大多数操作系统中,运行进程的命令行被视为公共信息。

因此,在命令行上传递密码是一个非常糟糕的主意。

这个问题有两种常见的解决方法,这两种方法都需要被调用的可执行文件的支持:

  • 而不是在命令行上传递用户名/密码,而是传递包含用户名/密码的文件的名称
  • 从被调用的可执行文件中重新设置正在运行的进程的命令行。

第一个解决方案简单且普遍可行,第二个解决方案有竞争条件并且更难实现,因为没有跨平台的方法来做到这一点(在某些操作系统上,更改 argv 会有所帮助)。

于 2009-02-25T15:01:52.873 回答
2

我从您的命令行假设您使用的是 Windows。如果它不需要可移植,我建议您使用CreateProcess() API 而不是调用 system()。

CreateProcess() API 可以使用命令行,您可以设置 STARTUP_INFORMATION 参数来隐藏新的进程窗口 (wShowWindow = SW_HIDE)。

命令行将对临时用户隐藏,但正如其他人指出的那样,检索起来并不难。由于您正在创建一个新进程,我建议将敏感数据写入该进程的标准输入。这样,该过程就可以读取它并正常进行。

于 2009-02-25T15:08:13.467 回答
0

Another solution is to send the password between your programs, encrypted with something like 3DES, or AES.

You could use a pipe to comunicate between both programs, and don't use the command line at all.

But any of this schemes is not really secure they can be circumvent rather easily. If you want more security you should use some kind of challenge-response protocol with the server.

于 2009-02-25T23:59:52.177 回答
0

使用 CreateProcess() API 将对用户隐藏敏感数据,但高级用户可以使用免费实用程序轻松获取与进程关联的命令行,例如 Process Explorer

于 2009-02-25T15:11:46.627 回答