Я хочу скрыть системные команды, выданные system () - PullRequest
3 голосов
/ 25 февраля 2009

Написание программы на c ++, и я хочу выполнить системную команду из функции system (), но я не хочу, чтобы пользователь видел команду (потому что команда включает в себя pwd) в исполняемом окне. Мне нужно скопировать файл из каталога пользователя на сервер, не предоставляя пользователю доступ к серверу и не отображая pwd. Подумал, что .exe это делает проще всего.

Ex:

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

Но в исполняемом окне отображается эта команда, что побуждает к попытке скрыть пароль.

Я пытался выдать система ("@ echo OFF") в начале программы, но это не подавляет следующие команды, они все еще отображаются в исполняемом окне.

Есть предложения?

Спасибо ...

Ответы [ 4 ]

8 голосов
/ 25 февраля 2009

Командная строка запущенных процессов считается общедоступной информацией в большинстве операционных систем.

Поэтому передавать пароли в командной строке очень плохая идея.

Существует два распространенных решения этой проблемы, каждый из которых требует поддержки вызываемого исполняемого файла:

  • вместо передачи имени пользователя / пароля в командной строке, передайте имя файла, содержащего имя пользователя / пароль
  • переустанавливать командную строку запущенного процесса из вызываемого исполняемого файла.

Первое решение простое и универсально возможное, второе имеет гоночное состояние и сложнее в реализации, поскольку нет кроссплатформенного способа сделать это (в некоторых ОС изменение argv поможет).

2 голосов
/ 25 февраля 2009

Я предполагаю из вашей командной строки, что вы используете Windows. Если он не должен быть переносимым, я бы посоветовал вам использовать CreateProcess () API вместо вызова system ().

API CreateProcess () может принимать командную строку, и вы можете настроить параметр STARTUP_INFORMATION, чтобы скрыть окно нового процесса (wShowWindow = SW_HIDE).

Командная строка будет скрыта от случайного пользователя, но, как отмечали другие, ее не так сложно найти. Поскольку вы создаете новый процесс, я бы предложил записать конфиденциальные данные в стандартный ввод этого процесса. Таким образом, процесс может просто прочитать его и продолжить в обычном режиме.

0 голосов
/ 26 февраля 2009

Другим решением является отправка пароля между вашими программами, зашифрованными с помощью чего-то вроде 3DES или AES.

Вы можете использовать pipe для связи между обеими программами и вообще не использовать командную строку.

Но любая из этих схем не совсем безопасна, их можно легко обойти. Если вы хотите большей безопасности, вы должны использовать какой-то протокол запроса-ответа с сервером.

0 голосов
/ 25 февраля 2009

Использование API CreateProcess () скрывает конфиденциальные данные от пользователя, но опытный пользователь может легко получить командную строку, связанную с процессом, используя бесплатную утилиту, например, Process Explorer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...